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(maxx2) 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(); 
}