www.pudn.com > ROTATE0.rar > ROTATE0.C
#include#include #include #include #include #include #include #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 #define ENTER 28 #define ESC 1 double modelx[8]={-0.5,-0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5}; double modely[8]={-0.5,-0.5, 0.5, 0.5, -0.5,-0.5, 0.5, 0.5}; double modelz[8]={-0.5, 0.5, -0.5, 0.5, -0.5, 0.5, -0.5, 0.5}; double modelx1[8],modely1[8],modelz1[8]; double workx[8]; double worky[8]; double workz[8]; double mapx[8]; double mapy[8]; double mapz[8]; double mapd[8]; double f[4][4]; double xmax,ymax; int call; int visual[12]; int zuobiao; void transfer(int flag) { int i; for(i=0;i<8;i++){ mapx[i]=workx[i]*f[0][0]+worky[i]*f[1][0]+workz[i]*f[2][0]+1.0*f[3][0]; mapy[i]=workx[i]*f[0][1]+worky[i]*f[1][1]+workz[i]*f[2][1]+1.0*f[3][1]; mapz[i]=workx[i]*f[0][2]+worky[i]*f[1][2]+workz[i]*f[2][2]+1.0*f[3][2]; mapd[i]=workx[i]*f[0][3]+worky[i]*f[1][3]+workz[i]*f[2][3]+1.0*f[3][3]; } for(i=0;i<8;i++){ mapx[i]=mapx[i]/mapd[i]; mapy[i]=mapy[i]/mapd[i]; mapz[i]=mapz[i]/mapd[i]; } if(flag==1) for(i=0;i<8;i++){ workx[i]=mapx[i]; worky[i]=mapy[i]; workz[i]=mapz[i]; } } void cuoqie(double cx,double cy,double cz) { f[0][0]=1.0; f[0][1]=cy; f[0][2]=cz; f[0][3]=0.0; f[1][0]=cx; f[1][1]=1.0;f[1][2]=0.0; f[1][3]=0.0; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=1.0; f[2][3]=0.0; f[3][0]=0.0; f[3][1]=0.0;f[3][2]=0.0; f[3][3]=1.0; transfer(1); } void portion(double px,double py,double pz) {f[0][0]=px; f[0][1]=0.0;f[0][2]=0.0; f[0][3]=0.0; f[1][0]=0.0; f[1][1]=py;f[1][2]=0.0; f[1][3]=0.0; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=pz; f[2][3]=0.0; f[3][0]=0.0; f[3][1]=0.0;f[3][2]=0.0; f[3][3]=1; transfer(1); } void zrotate(double alpha) { double th=alpha*3.141592/180.0; f[0][0]=cos(th); f[0][1]=sin(th);f[0][2]=0.0; f[0][3]=0.0; f[1][0]=-sin(th); f[1][1]=cos(th);f[1][2]=0.0; f[1][3]=0.0; f[2][0]=0.0; f[2][1]=0;f[2][2]=1; f[2][3]=0.0; f[3][0]=0.0; f[3][1]=0.0;f[3][2]=0.0; f[3][3]=1; transfer(1); } void yrotate(double alpha) { double th=alpha*3.141592/180.0; f[0][0]=cos(th); f[0][1]=0.0;f[0][2]=-sin(th); f[0][3]=0.0; f[1][0]=0.0; f[1][1]=1;f[1][2]=0; f[1][3]=0.0; f[2][0]=sin(th); f[2][1]=0;f[2][2]=cos(th); f[2][3]=0.0; f[3][0]=0.0; f[3][1]=0.0;f[3][2]=0.0; f[3][3]=1; transfer(1); } int scx(double xj) { int x; x=(int)(-xj+xmax/2); return(x); } int scy(double yj) { int y; y=ymax-(int)(yj+ymax/2); return(y); } int isvisible(int pos1,int pos2,int pos3,double viewer[]) { double p1,p2,p3,q1,q2,q3,n1,n2,n3,result; p1=mapx[pos2]-mapx[pos1]; p2=mapy[pos2]-mapy[pos1]; p3=mapz[pos2]-mapz[pos1]; q1=mapx[pos3]-mapx[pos1]; q2=mapy[pos3]-mapy[pos1]; q3=mapz[pos3]-mapz[pos1]; n1=p2*q3-q2*p3; n2=p3*q1-q3*p1; n3=p1*q2-q1*p2; result=viewer[0]*n1+viewer[1]*n2+viewer[2]*n3; if(result>0) return 1; else return 0; } void xiaoyin(double viewer[]) { int i; for(i=0;i<12;i++) visual[i]=0; if(isvisible(2,3,1,viewer)==1) {visual[0]=1;visual[1]=1; visual[8]=1; visual[6]=1;} if(isvisible(4,5,7,viewer)==1) {visual[10]=1;visual[4]=1; visual[11]=1;visual[5]=1;} if(isvisible(0,1,5,viewer)==1) {visual[0]=1;visual[2]=1; visual[10]=1;visual[7]=1;} if(isvisible(6,7,3,viewer)==1) {visual[8]=1;visual[9]=1; visual[5]=1;visual[3]=1;} if(isvisible(5,1,3,viewer)==1) {visual[6]=1;visual[7]=1; visual[9]=1;visual[11]=1;} if(isvisible(6,2,0,viewer)==1) {visual[1]=1;visual[2]=1; visual[4]=1;visual[3]=1;} } void draw(int color) { setcolor(color); if(visual[0]==1) line(scx(mapx[0]),scy(mapz[0]),scx(mapx[1]),scy(mapz[1])); if(visual[1]==1) line(scx(mapx[0]),scy(mapz[0]),scx(mapx[2]),scy(mapz[2])); if(visual[2]==1) line(scx(mapx[0]),scy(mapz[0]),scx(mapx[4]),scy(mapz[4])); if(visual[3]==1) line(scx(mapx[6]),scy(mapz[6]),scx(mapx[2]),scy(mapz[2])); if(visual[4]==1) line(scx(mapx[6]),scy(mapz[6]),scx(mapx[4]),scy(mapz[4])); if(visual[5]==1) line(scx(mapx[6]),scy(mapz[6]),scx(mapx[7]),scy(mapz[7])); if(visual[6]==1) line(scx(mapx[1]),scy(mapz[1]),scx(mapx[3]),scy(mapz[3])); if(visual[7]==1) line(scx(mapx[1]),scy(mapz[1]),scx(mapx[5]),scy(mapz[5])); if(visual[8]==1) line(scx(mapx[2]),scy(mapz[2]),scx(mapx[3]),scy(mapz[3])); if(visual[9]==1) line(scx(mapx[3]),scy(mapz[3]),scx(mapx[7]),scy(mapz[7])); if(visual[10]==1) line(scx(mapx[4]),scy(mapz[4]),scx(mapx[5]),scy(mapz[5])); if(visual[11]==1) line(scx(mapx[5]),scy(mapz[5]),scx(mapx[7]),scy(mapz[7])); } void model() { int i; for(i=0;i<8;i++){ workx[i]=modelx[i]; worky[i]=modely[i]; workz[i]=modelz[i]; } } void teq(int color,double size) { double viewer[3]; viewer[0]=size*cos(35.25*3.14159/180); viewer[1]=size*sin(35.25*3.14159/180); viewer[2]=size; portion(size,size,size); f[0][0]=0.707; f[0][1]=0.0;f[0][2]=-0.408; f[0][3]=0.0; f[1][0]=-0.707;f[1][1]=0.0;f[1][2]=-0.408; f[1][3]=0.0; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=0.816; f[2][3]=0.0; f[3][0]=0.0; f[3][1]=0.0;f[3][2]=0.0; f[3][3]=1.0; transfer(0); xiaoyin(viewer); draw(color); } void xie(int color,double size) { double viewer[3]; viewer[0]=viewer[1]=viewer[2]=size; portion(size,size,size); f[0][0]=1; f[0][1]=0.0;f[0][2]=0.0; f[0][3]=0.0; f[1][0]=0.707;f[1][1]=0.0;f[1][2]=-0.707; f[1][3]=0.0; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=1.0; f[2][3]=0.0; f[3][0]=0.0; f[3][1]=0.0;f[3][2]=0.0; f[3][3]=1.0; transfer(0); xiaoyin(viewer); draw(color); } void toushi(int color,double size) { double viewer[3]; viewer[0]=1*size; viewer[1]=-2*size; viewer[2]=-1.5*size; f[0][0]=1; f[0][1]=0.0;f[0][2]=0.0; f[0][3]=0.0; f[1][0]=0.0;f[1][1]=0.0;f[1][2]=0.0; f[1][3]=-0.50; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=1; f[2][3]=0.0; f[3][0]=1.0; f[3][1]=0.0;f[3][2]=-1.5; f[3][3]=2.0; transfer(1); portion(size,size,size); xiaoyin(viewer); draw(color); } void copyAndClear(int sx,int sy) { int i; double minx,minz,maxx,maxz,bx,bz; unsigned int size; void *bitmap; maxz=minz=scy(mapz[0]); maxx=minx=scx(mapx[0]); for(i=1;i<8;i++){ if(minx>scx(mapx[i])) minx=scx(mapx[i]); if(minz>scy(mapz[i])) minz=scy(mapz[i]); if(maxx 2) col=bakcol;break; case LEFT: if((--col)<0) col=bakcol;break; case UP: if((--row)<0) row=bakrow;break; case DOWN: if((++row)>2) row=bakrow;break; case ESC: restorecrtmode();break; } setwritemode(1); rectangle(bakcol*ymax/3+10,bakrow*ymax/3+10,bakcol*ymax/3+ymax/3-10,bakrow*ymax/3+ymax/3-10); setwritemode(0); rectangle(col*ymax/3+10,row*ymax/3+10,col*ymax/3+ymax/3-10,row*ymax/3+ymax/3-10); }while(key!=ENTER); setwritemode(1); rectangle(bakcol*ymax/3+10,bakrow*ymax/3+10,bakcol*ymax/3+ymax/3-10,bakrow*ymax/3+ymax/3-10); model(); switch(row){ case 0: break; case 1: portion(1.8,0.5,0.8);break; case 2: cuoqie(1.8,0.5,1.6);break; } call=bakcol; for(i=0;i<8;i++) { modelx[i]=workx[i]; modely[i]=worky[i]; modelz[i]=workz[i]; } rectangle(ymax+20,ymax/3*2+15,xmax-30,ymax/3*2+75); do { key=getkey(); bakaxis=axis; switch(key) { case UP: if((--axis)<0) axis=bakaxis;break; case DOWN:if((++axis)>1) axis=bakaxis;break; } setwritemode(1); rectangle(ymax+20,ymax/3*2+15+bakaxis*60,xmax-30,ymax/3*2+15+bakaxis*60+60); setwritemode(0); rectangle(ymax+20,ymax/3*2+15+axis*60,xmax-30,ymax/3*2+15+axis*60+60); } while(key!=ENTER); zuobiao=bakaxis; } void rotate() { int key; int direction=RIGHT; int frame=12400; int beta=0; do { do { setbkcolor(BLACK); cleardevice(); switch(direction) { case RIGHT: if(zuobiao==0) zrotate(beta); else yrotate(beta); beta-=4;beta%=360;break; case LEFT: if(zuobiao==0) zrotate(beta);else yrotate(beta); beta+=4;beta%=360;break; } setlinestyle(SOLID_LINE,0,1); switch(call) { case 0:toushi(YELLOW,120);break; case 1:teq(YELLOW,80);break; case 2:xie(YELLOW,80);break; } model(); delay(frame); }while(!kbhit()); key=getkey(); switch(key) { case LEFT:direction=LEFT;break; case RIGHT:direction=RIGHT;break; case UP:frame-=600;if(frame<1000)frame=1000; break; case DOWN:frame+=600;if(frame>12400)frame=12400; break; } }while(key!=ESC); getch(); } void main() { int i; int driver=DETECT,mode; initgraph(&driver,&mode,""); for(i=0;i<8;i++) { modelx1[i]=modelx[i]; modely1[i]=modely[i]; modelz1[i]=modelz[i]; } while(1) { GUI1(); select(); cleardevice(); drawbox(); rotate(); cleardevice(); for(i=0;i<8;i++) { modelx[i]=modelx1[i]; modely[i]=modely1[i]; modelz[i]=modelz1[i]; } } getch(); closegraph(); }