www.pudn.com > dos_gui.zip > FH.C


#include  
#include  
#include  
#include  
#include  
float rh=40,th=0.7,ph=1,d=250,cx=140,cy=96,s1,c1,s2,c2,xt,yt,r1,r2; 
float v[19][4]={{0,0,0,0},{0,5,7,-5},{0,5,7,5},{0,5,-7,5},{0,5,-7,-5},{0,-5,7,-5}, 
	  {0,-5,-7,-5},{0,-5,-7,5},{0,-5,7,5},{0,0,7,8},{0,0,-7,8},{0,-2,-7,-5},{0,-2,-9,-5}, 
	  {0,-5,-9,-5},{0,-5,-7,-5},{0,-2,-7,9},{0,-2,-9,9},{0,-5,-9,9},{0,-5,-7,9}}; 
float x1,y1,z1,sv[18][3],u1,u2,u3,v1,v2,v3,e1; 
int nps[14]={0,5,6,5,6,5,5,5,5,5,5,5,5,5}; 
int s[14][7]={{0,0,0,0,0,0}, {0,1,2,3,4,1,0}, {0,1,5,8,9,2,1}, {0,5,6,7,8,5,0}, 
		{0,4,3,10,7,6,4}, {0,3,2,9,10,3,0}, {0,7,10,9,8,7,0},	{0,1,4,6,5,1,0}, 
		{0,11,12,13,14,11,0}, 
		{0,15,18,17,16,15,0}, 
		{0,11,14,18,15,11,0},{0,12,16,17,13,12,0},{0,11,15,16,12,11,0}, 
		{0,14,13,17,18,14,0} 
		}; 
int n[14][4]; 
int xe,ye,ze,e2,j,k,l,p1,q,xh,yh,xv,yv; 
int e[3][13][4]; 
int p[11]; 
int vi,eo; 
int ob=1,n1=1,e2,j,k; 
float vx,vy,vz; 
void main(){ 
int i; 
int gdriver=DETECT,gmode,errorcode; 
initgraph(&gdriver,&gmode,""); 
errorcode = graphresult(); 
if (errorcode!=grOk) 
  {printf("graphices error:%s\n",grapherrormsg(errorcode)); 
  printf("press anykey to halt"); 
  getch(); 
  exit(1);} 
 
 
s1=sin(th); 
c1=cos(th); 
s2=sin(ph); 
c2=cos(ph); 
for (i=1;i++;i<19){ 
  x1=-v[i][1]*s1+v[i][2]*c1; 
  y1=-v[i][1]*c1*c2-v[i][2]*s1*c2+v[i][3]*s2; 
  z1=-v[i][1]*s2*c1-v[i][2]*s2*s1-v[i][3]*c2+rh; 
  sv[i][1]=d*(x1/z1)+cx; 
  sv[i][2]=-d*(y1/z1)+cy;} 
for (i=1;i++;i<14){ 
	   u1=v[s[i][2]][1]-v[s[i][1]][1]; 
	   u2=v[s[i][2]][2]-v[s[i][1]][2]; 
	   u3=v[s[i][2]][3]-v[s[i][1]][3]; 
	   v1=v[s[i][3]][1]-v[s[i][1]][1]; 
	   v2=v[s[i][3]][2]-v[s[i][1]][2]; 
	   v3=v[s[i][3]][3]-v[s[i][1]][3]; 
	   n[i][1]=u2*v3-v2*u3; 
	   n[i][2]=u3*v1-v3*u1; 
	   n[i][3]=u1*v2-v1*u2;} 
       xe=rh*s2*c1; 
   ye=rh*s2*s1; 
   ze=rh*c2; 
 
 
 for (i=1;i++;i<14){ 
	e2=s[i][1]; 
	vx=xe-v[e2][1]; 
	vy=ye-v[e2][2]; 
	vz=ze-v[e2][3]; 
  if(n[i][1]*vx+n[i][2]*vy+n[i][3]*vz<=0) goto  k920; 
	e1=s[i][1]; 
	for (j=2;j++;j<=nps[i]){ 
	  e2=s[i][j]; 
	  for (k=1;k++;k<=n1){ 
		   if (e[ob][k][1]==e2 && e[ob][k][2]==e1){ 
			  e[ob][k][3]=2; 
			  goto 
			   k900;}} 
		e[ob][n1][1]=e1; 
		e[ob][n1][2]=e2; 
		e[ob][n1][3]=1; 
		n1++; 
  k900:      e1=e2;} 
 k920: if (i==7){ 
		   ob=2; 
		   n1=1; 
		   } 
		   } 
 
   if (ye>=-7) { 
	p[1]=1; 
	p[2]=2;} 
	else 
	  {p[1]=2; 
	  p[2]=1;} 
	  for (i=1; i++;i<=12){ 
		if (e[p[1]][i][3]=0) break; 
		j=e[p[1]][i][1]; 
		k=e[p[1]][i][2]; 
		moveto(sv[j][1],sv[j][2]); 
		lineto(sv[k][1],sv[k][2]);} 
 
  for (eo=1;eo++;eo<=12){ 
	 if (e[p[2]][eo][3]=0) return 0; 
	 i=e[p[2]][eo][1]; 
	 j=e[p[2]][eo][2]; 
	 if (sv[i][3]==0){ 
	   xt=sv[i][1]; 
	   yt=sv[i][2]; 
	   vi=-1; 
	   for (l=1;l++;l<=12){ 
		 if (e[p[1]][l][3]!=1 ) break; 
		 p1=e[p[1]][l][1]; 
		 q=e[p[1]][l][2]; 
		 r1=sv[q][1]-sv[p1][1]; 
		 r2=sv[q][2]-sv[p1][2]; 
		 u1=xt-sv[p1][1]; 
		 u2=yt-sv[p1][2]; 
		 if(u2*r1-u1*r2>=0) { 
		 vi=1; exit(0);} } 
		 sv[i][3]=vi; 
					 } 
 
	 if (sv[j][3]==0) { 
	   xt=sv[j][1]; 
	   yt=sv[j][2]; 
	   vi=-1; 
	   for (l=1;l++;l<=12){ 
		 if (e[p[1]][l][3]!=1 ) break; 
		 p1=e[p[1]][l][1]; 
		 q=e[p[1]][l][2]; 
		 r1=sv[q][1]-sv[p1][1]; 
		 r2=sv[q][2]-sv[p1][2]; 
		 u1=xt-sv[p1][1]; 
		 u2=yt-sv[p1][2]; 
		 if(u2*r1-u1*r2>=0)  { 
		 vi=1;exit(0);}} 
		 sv[j][3]=vi;             } 
		if (sv[i][3]+sv[j][3]==-2) break; 
		if (sv[i][3]+sv[j][3]!=0 ){ 
		moveto(sv[i][1],sv[i][2]); 
		lineto(sv[j][1],sv[j][2]);    } 
   else {if (sv[i][3]==1) { 
				xv=sv[i][1]; 
				yv=sv[i][2]; 
				xh=sv[j][1]; 
				yh=sv[j][2];} 
 
			 if (sv[j][3]==1) { 
				xv=sv[j][1]; 
				yv=sv[j][2]; 
				xh=sv[i][1]; 
				yh=sv[i][2];} 
 
			v1=(xh-xv)/2; 
			v2=(yh-yv)/2; 
			xt=xv+v1; 
			yt=yv+v2; 
			for (i=2;i++;i<=7){ 
			 vi=-1; 
		 for (l=1;l++;l<=12){ 
		 if (e[p[1]][l][3]!=1 ) break; 
		 p1=e[p[1]][l][1]; 
		 q=e[p[1]][l][2]; 
		 r1=sv[q][1]-sv[p1][1]; 
		 r2=sv[q][2]-sv[p1][2]; 
		 u1=xt-sv[p1][1]; 
		 u2=yt-sv[p1][2]; 
		 if(u2*r1-u1*r2>=0) { 
		 vi=1; exit(0);} } 
		 v1=v1/2; 
		 v2=v2/2; 
		 xt=xt+vi*v1; 
		 yt=yt+vi*v2;} 
		 moveto(xv,yv); 
		 lineto(xt,yt); 
		 }} }