⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 图形处理算法合集3:包括图形处理、帧缓存技术、渲染、矩阵运算、建模方法
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <starbase.c.h>#ifndef M_PI#  define M_PI		3.14159265358979323846#endifextern double drand48();typedef int fixpoint;extern void subpixel_triangle(fixpoint x0, fixpoint y0,										fixpoint x1, fixpoint y1,										fixpoint x2, fixpoint y2);extern void triangle(int x0, int y0, int x1, int y1, int x2, int y2);extern void printnbits();static int	fildes;static struct color {float r, g, b;};int verbose = 0;#define MAXVERTICES     1000#define MAXTRIANGLES    1000#define SIZE 200#define BUFSIZE SIZE*2int buffer[BUFSIZE][BUFSIZE];int which_tri;void clear_buffer(){  register int i, j;  if (verbose) printf("\n\n************** New Iteration ************\n\n");  for(i=0; i<BUFSIZE; i++)	 for(j=0; j<BUFSIZE; j++)		buffer[i][j] = 0;}intInitScreen(){	char	*sb_dev, *driver;		printnbits();	sb_dev = getenv("SB_OUTDEV");   	if(!sb_dev) sb_dev = getenv("OUTDEV");   	if(!sb_dev) sb_dev = "/dev/crt1";	driver = getenv("SB_OUTDRIVER");	if(!driver) driver = getenv("OUTDRIVER");	if (!driver ) driver = "hp98731";		fildes = gopen(sb_dev,OUTDEV,driver,INIT|INT_XFORM);	interior_style(fildes,INT_SOLID,FALSE);		intvdc_extent(fildes,0,0,SIZE, SIZE);	mapping_mode(fildes,FALSE);		drawing_mode(fildes,6);	  /* xor mode */		if (!verbose)	  double_buffer(fildes,TRUE,12); 	clear_control(fildes, CLEAR_VIEWPORT);		return(fildes);}int buf = 0;int t0[MAXTRIANGLES], t1[MAXTRIANGLES], t2[MAXTRIANGLES];fixpoint x[MAXVERTICES], y[MAXVERTICES];float xf[MAXVERTICES], yf[MAXVERTICES];void print_triangle(int n){  printf("Triangle %d contains points %d, %d, %d\n", n, t0[n], t1[n], t2[n]);  printf("which is (%g, %g), (%g, %g), (%g, %g)\n",			xf[t0[n]], yf[t0[n]],			xf[t1[n]], yf[t1[n]],			xf[t2[n]], yf[t2[n]]);  printf("which is ");  fp_print(x[t0[n]]);  printf(", ");  fp_print(y[t0[n]]);  printf(", ");  fp_print(x[t1[n]]);  printf(", ");  fp_print(y[t1[n]]);  printf(", ");  fp_print(x[t2[n]]);  printf(", ");  fp_print(y[t2[n]]);  printf("\n");}voiddraw_point (int ix, int iy){/*  if ((ix == 91) && (iy == 74)) {  printf("Triangle painting (%d, %d) ... Triangle %d\n", ix, iy, which_tri);  print_triangle(which_tri); }*/  if (buffer[ix][iy]){	 printf("OOPS -- repainted pixel (%d, %d) for Triangle %d\n",			  ix, iy, which_tri);	 print_triangle(which_tri);	 fill_color(fildes, 1.0, 0.0, 0.5);	 intrectangle(fildes,ix,iy,ix+1,iy+1);	 fill_color(fildes, 1.0, 1.0, 1.0);/*	 dbuffer_switch(fildes, !buf); 	 make_picture_current(fildes);	 abort();*/  }  else {	 buffer[ix][iy] = 1;	 intrectangle(fildes,ix,iy,ix+1,iy+1);  }}#define CENTER 0.5main (int argc, char *argv[]){    int xi[MAXVERTICES], yi[MAXVERTICES];    struct color tc[MAXTRIANGLES];    int nv, nt, i, j, k, white;    double c, s;    float rotinc, xr, yr;	 float scale = 90.0;	 char *filename = NULL;	 FILE *fp;	 if (argc == 2) {		filename = argv[1];		printf("reading from file %s\n", filename);	 }	 if (filename) fp = fopen(filename, "r");	 else fp = stdin;    fscanf(fp, "%f %d %d",&rotinc,&white,&nv);	 printf("Read header info.\n");    for (i=0; i<nv; i++) fscanf(fp, "%f %f",&xf[i],&yf[i]);	 printf("Read %d verts\n", nv);    for (nt=0; (fscanf(fp, "%d %d %d",&t0[nt],&t1[nt],&t2[nt])!=EOF) &&			(nt < MAXTRIANGLES); nt++) {		if (white) 		  tc[nt].r = tc[nt].g = tc[nt].b = 1.0;		else		  tc[nt].r = drand48(), tc[nt].g = drand48(), tc[nt].b = drand48();	 }	 printf("Read %d triangles\n", nt);    InitScreen();    for (k=0; k<1000; k++) {        c = cos(k*rotinc*M_PI/180.0);        s = sin(k*rotinc*M_PI/180.0);		  if (verbose) printf ("%4d: (%g, %g)\n", k, c, s);        for (j=0; j<nv; j++) {            xr = (( xf[j]-CENTER)*c + (yf[j]-CENTER)*s + 0.5);            yr = ((-xf[j]+CENTER)*s + (yf[j]-CENTER)*c + 0.5);            x[j] = fp_fix(xr * scale + 105.0);            y[j] = fp_fix(yr * scale + 32.0);            xi[j] = (int) (xr * scale + 5.5);            yi[j] = (int) (yr * scale + 32.5);        }        clear_view_surface(fildes); 		  clear_buffer();        for (i=0; i<nt; i++) {			 if (verbose) 				printf("+++++++++++ Drawing triangle %d ++++++++++\n", i);			 which_tri = i;			 if (i < nt/2) fill_color(fildes,tc[i].r,tc[i].g,tc[i].b);			 else          fill_color(fildes,1.0, 1.0, 0.5);			 triangle(xi[t0[i]], yi[t0[i]],						 xi[t1[i]], yi[t1[i]], xi[t2[i]], yi[t2[i]]);			 if (verbose) printf(" Subpixel: ");			 subpixel_triangle(x[t0[i]], y[t0[i]],									 x[t1[i]], y[t1[i]], x[t2[i]], y[t2[i]]);			 if (verbose) make_picture_current(fildes);				        }        if (!verbose) {			 dbuffer_switch(fildes, buf = !buf); 			 make_picture_current(fildes);		  }		  if (verbose) {			 printf("hit <return> for next iteration\n");			 getchar();		  }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -