/* perspec4.c */ short int m1,m2,n1,n2,l1,l2,t1,t2; short tv,yt; double g[11],oy,p[129][3],zoom; double ax,ay,az,k,kk,vcx,vcy,vcz,xad,xc,x1,x2,x9,yad,y9,yc,y1,y2; double r,vz,scl,xs0,ys0; double cy,cz,dy,dz,u1,s2,s3,scy,xw,yw,zw,xs,ys; void calcplot(),clipit(),widen(),visible(); extern int pt,color; extern SHORT mx,my; int osx,osy,valid; perspec(host) int host; { osx=mx; osy=199-my; scy=1.0; g[7]=0; g[6]=319; g[5]=199; yt=0; if (host==1){ bonsai(0); xs=3.5; ys=0; vz=2.0; oy=10.0; zoom=1.0; SetAPen(rp,color); generate(0); } else { xs=3.5; ys=0; vz=2.0; oy=10.0; zoom=1.0; strcpy(filename1,name); strcat(filename1,".pnt"); strcpy(filename2,name); strcat(filename2,".lin"); valid=getfile(0); SetAPen(rp,color); if (valid==1) generate(0); } } getfile(j1) short int j1; { register short int i; fp=fopen(filename1,"r"); if (fp==NULL){ for (valid=0;valid<=200000;valid++) ; return(0); } ps=128; for (i=1;i<=ps;i++){ fscanf (fp,"%lf%lf%lf",&x[i][j1],&y[i][j1],&z[i][j1]); } fclose(fp); fp=fopen(filename2,"r"); if (fp==NULL){ for (valid=0;valid<=200000;valid++) ; return(0); } ls=127; for (i=1;i<=ls;i++){ fscanf (fp,"%h%h%lf",&ln[i][0][j1],&ln[i][1][j1],&ln1[i][j1]); } fclose(fp); return(1); } generate(j1) short int j1; { register short int i; x[0][j1]=0; y[0][j1]=0; z[0][j1]=vz; dy=-oy; dz=vz; u1=sqrt(dy*dy+dz*dz); cy=dy/u1; cz=dz/u1; s3=sqrt(1.0-cz*cz); s2=sqrt(1.0-cy*cy); qy=oy+cy; qz=cz; i=0; xw=x[0][j1]; yw=y[0][j1]; zw=z[0][j1]; visible(); calcplot(i); for (i=1;i<=ps;i++){ xw=x[i][j1]*scl+xs; yw=y[i][j1]*scl+ys; zw=z[i][j1]*scl; visible(); calcplot(i); } scale(j1); } void visible() { vcx=xw; vcy=yw-oy; vcz=zw; } void calcplot(i) short int i; { k=1.0/(vcy*cy+vcz*cz); ax=k*vcx; ay=oy+k*vcy; az=k*vcz; if (s3!=0){ p[i][1]=(ax*cy)/s3; p[i][2]=(az-qz)/s3; return; } p[i][1]=(-ax*cz)/s2; p[i][2]=(ay-qy)/s2; } scale(j1) short int j1; { register short int i; double t; t=450.0*zoom; for (i=0;i<=ps;i++){ p[i][1]=p[i][1]*t; p[i][2]=p[i][2]*t; } xad=160.0-p[0][1]; yad=96.0-p[0][2]; for (i=1;i<=ps;i++){ p[i][1]=p[i][1]+xad; p[i][2]=p[i][2]+yad; } drawit(j1); } drawit(j1) short int j1; { register short int i; for (i=1;i<=ls;i++){ x1=p[(ln[i][0][j1])][1]; y1=191-p[(ln[i][0][j1])][2]; x2=p[(ln[i][1][j1])][1]; y2=191-p[(ln[i][1][j1])][2]; w=ln1[i][j1]/2.0; w*=zoom; xc=x1; yc=y1; x9=x2; y9=y2; widen(); } } void widen() { double j; if ((x9==xc)&&(y9==yc)) return; if (w<.4) { clipit(); return; } for (j=-w/2.0;j<=w/2.0;j+=.4){ x1=x1+.5; y1=y1+.5; x2=x2+.5; y2=y2+.5; clipit(); } } void clipit() { m1=(short int)x1+osx; m2=(short int)x2+osx; n1=(short int)(scy*y1)-osy; n2=(short int)(scy*y2)-osy; Move(rp,m1,n1); Draw(rp,m2,n2); }