📄 tricera.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 + -