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

📄 tricera.c

📁 图形学分形演示程序
💻 C
字号:
#include <string.h>#include <stdlib.h>#include <math.h>#include <unistd.h>#include "tricera.h"#define MAX_VERTEX 8000#define MAX_FACE 16000float v_sin[6284];void sort(Face *s, int length);Vertex static vx[MAX_VERTEX];Face static fc[MAX_FACE];int v_num=0, f_num=0;void parser(char *line, Vertex *vx){	char *pt=NULL, *result = NULL;	int i=0;	pt = strstr (line,"Face");	if (pt!=NULL)	{		result=strtok(line," ");		result=strtok(NULL,":");		if (result[0]!='l' && result[3]!='t')		{			i=atoi(result);			result=strtok(NULL,":");			result=strtok(NULL,":");				fc[i].a=atof(result);			result=strtok(NULL,":");				fc[i].b=atof(result);			result=strtok(NULL,":");				fc[i].c=atof(result);			f_num++;		}		return;	}	pt = strstr (line,"Vertex");	if (pt!=NULL)	{		result=strtok(line," ");		result=strtok(NULL,":");		if (result[0]!='l' && result[3]!='t')		{			i=atoi(result); 			result=strtok(NULL,":");			result=strtok(NULL,":");				vx[i].x=atof(result);			result=strtok(NULL,":");				vx[i].y=atof(result);			result=strtok(NULL,":");				vx[i].z=atof(result);			v_num++;		}	}}void init(int argc, char *argv[]){	FILE *fp;	char line[1024];	if (argc>1)	{		if ( !(fp=fopen(argv[1],"r")) )		{			perror("fopen");			exit(0);		}		else		{			while (!feof(fp))			{				fgets(line,1023,fp);					parser(line,vx);			}			fclose(fp);			printf("Vertices: %d  Faces: %d\n",v_num,f_num);		}	}	else	{		printf("Usage: tricera [FILE] (e.g. ./tricera asc/tricera.asc ).\n");		exit (0);	}}void qs(Vertex *vx_swap2,int left, int right){	register int i,j;	int a,b,c;	float x;	Face swap;	i=left; j=right;		a = fc[(left+right)/2].a;		b = fc[(left+right)/2].b;		c = fc[(left+right)/2].c;			x = vx_swap2[a].z + vx_swap2[b].z + vx_swap2[c].z;		do		{			while (				((vx_swap2[fc[i].a].z + vx_swap2[fc[i].b].z + vx_swap2[fc[i].c].z)				< x ) && (i<right)) i++;					while (				((vx_swap2[fc[j].a].z + vx_swap2[fc[j].b].z + vx_swap2[fc[j].c].z)				> x ) && (j>left)) j--;			if (i <= j)			{				swap = fc[i];				fc[i] = fc[j];				fc[j] = swap;					i++; j--;			}		}while(i <= j);		if (left < j) qs(vx_swap2, left, j);		if (i < right) qs(vx_swap2, i, right);}void sort_q(Vertex *vx_swap2, int n){	qs(vx_swap2, 0, n-1);}void init_math(){	float i;	int n=0;	for (i=0;i<6.283;i=i+.001)	{		v_sin[n]=sin(i);		n++;	}}float q_sin(float a){	while (a>6.284) a=a-6.284;	while (a<0) a=6.284+a;	return v_sin[(int)(a*1000)];}float q_cos(float a){	a=a+1.571;	while (a>6.284) a=a-6.284;	while (a<0) a=6.284+a;	return v_sin[(int)(a*1000)];}void proc_3d(float ax, float ay, float az){	Vertex static vx_swap1[MAX_VERTEX];	Vertex static vx_swap2[MAX_VERTEX];	int i,mx=DW/2,my=DH/2+60,zoom=70;	XPoint ps[3];	int a=0,b=0,c=0,m,n;	for (i=0;i<v_num;i++)	{		vx_swap1[i].x = vx[i].x * q_cos(az) - vx[i].y * q_sin(az);		vx_swap1[i].y = vx[i].x * q_sin(az) + vx[i].y * q_cos(az);		vx_swap1[i].z = vx[i].z;		vx_swap2[i].y = vx_swap1[i].y * q_cos(ax) - vx_swap1[i].z * q_sin(ax);		vx_swap2[i].z = vx_swap1[i].y * q_sin(ax) + vx_swap1[i].z * q_cos(ax);		vx_swap2[i].x = vx_swap1[i].x;	//	vx_swap1[i].z = vx_swap2[i].z * q_cos(ay) - vx_swap2[i].x * q_sin(ay);	//	vx_swap1[i].x = vx_swap2[i].z * q_sin(ay) + vx_swap2[i].x * q_cos(ay);	//	vx_swap1[i].y = vx_swap2[i].y;	}	sort_q (vx_swap2,f_num);	for(i=0;i<f_num;i++)	{		a=fc[i].a;		b=fc[i].b;		c=fc[i].c;		ps[0].x=vx_swap2[a].x * zoom + mx;		ps[0].y=vx_swap2[a].y * zoom + my;		ps[1].x=vx_swap2[b].x * zoom + mx;		ps[1].y=vx_swap2[b].y * zoom + my;		ps[2].x=vx_swap2[c].x * zoom + mx;		ps[2].y=vx_swap2[c].y * zoom + my;		m= ((vx_swap2[a].z + vx_swap2[b].z + vx_swap2[c].z) + 4 ) /20 * 0xff;			if (m>0xff) m=0xff;			if (m<0x0) m=0x0;				n = m * ( 0x10000 + 0x100 + 0x1);					XSetForeground(dpy,gc,n);		XFillPolygon(dpy,buffer,gc,ps,3,Convex,CoordModeOrigin);	}}void tricera (float ax, float ay, float az){	XSetForeground(dpy,gc,0x707070);		XFillRectangle (dpy,buffer,gc,0,0,DW,DH);		XSetForeground(dpy,gc,0x555555);		XDrawLine(dpy,buffer,gc,DW/2,DH/2-100,DW/2,DH/2+100);		XDrawLine(dpy,buffer,gc,DW/2-100,DH/2,DW/2+100,DH/2);		proc_3d (ax,ay,az);			draw_buffer(0,0,DW,DH);}

⌨️ 快捷键说明

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