home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 145.lha / BonsaiConstructionSet / perspec5.c < prev    next >
C/C++ Source or Header  |  1986-11-21  |  3KB  |  206 lines

  1. /* perspec4.c */
  2.  
  3.  
  4. short int m1,m2,n1,n2,l1,l2,t1,t2;
  5. short tv,yt;
  6. double g[11],oy,p[129][3],zoom;
  7. double ax,ay,az,k,kk,vcx,vcy,vcz,xad,xc,x1,x2,x9,yad,y9,yc,y1,y2;
  8. double r,vz,scl,xs0,ys0;
  9. double cy,cz,dy,dz,u1,s2,s3,scy,xw,yw,zw,xs,ys;
  10. void calcplot(),clipit(),widen(),visible();
  11. extern int pt,color;
  12. extern SHORT mx,my;
  13. int osx,osy,valid;
  14.  
  15. perspec(host)
  16. int host;
  17. {
  18.    osx=mx;
  19.    osy=199-my;
  20.    scy=1.0;
  21.    g[7]=0;
  22.    g[6]=319;
  23.    g[5]=199;
  24.    yt=0;
  25.    if (host==1){
  26.       bonsai(0);
  27.       xs=3.5;
  28.       ys=0;
  29.       vz=2.0;
  30.       oy=10.0;
  31.       zoom=1.0;
  32.       SetAPen(rp,color);
  33.       generate(0);
  34.    }
  35.    else {
  36.       xs=3.5;
  37.       ys=0;
  38.       vz=2.0;
  39.       oy=10.0;
  40.       zoom=1.0;
  41.       strcpy(filename1,name);
  42.       strcat(filename1,".pnt");
  43.       strcpy(filename2,name);
  44.       strcat(filename2,".lin");
  45.       valid=getfile(0);
  46.       SetAPen(rp,color);
  47.       if (valid==1)
  48.          generate(0);
  49.    }
  50. }
  51.  
  52. getfile(j1)
  53. short int j1;
  54. {
  55.    register short int i;
  56.  
  57.    fp=fopen(filename1,"r");
  58.    if (fp==NULL){
  59.       for (valid=0;valid<=200000;valid++)
  60.       ;
  61.       return(0);
  62.    }
  63.    ps=128;
  64.    for (i=1;i<=ps;i++){
  65.       fscanf (fp,"%lf%lf%lf",&x[i][j1],&y[i][j1],&z[i][j1]);
  66.    }
  67.    fclose(fp);
  68.    fp=fopen(filename2,"r");
  69.    if (fp==NULL){
  70.       for (valid=0;valid<=200000;valid++)
  71.       ;
  72.       return(0);
  73.    }
  74.    ls=127;
  75.    for (i=1;i<=ls;i++){
  76.       fscanf (fp,"%h%h%lf",&ln[i][0][j1],&ln[i][1][j1],&ln1[i][j1]);
  77.    }
  78.    fclose(fp);
  79.    return(1);
  80. }
  81.  
  82. generate(j1)
  83. short int j1;
  84. {
  85.    register short int i;
  86.  
  87.    x[0][j1]=0;
  88.    y[0][j1]=0;
  89.    z[0][j1]=vz;
  90.    dy=-oy;
  91.    dz=vz;
  92.    u1=sqrt(dy*dy+dz*dz);
  93.    cy=dy/u1;
  94.    cz=dz/u1;
  95.    s3=sqrt(1.0-cz*cz);
  96.    s2=sqrt(1.0-cy*cy);
  97.    qy=oy+cy;
  98.    qz=cz;
  99.    i=0;
  100.       xw=x[0][j1];
  101.       yw=y[0][j1];
  102.       zw=z[0][j1];
  103.       visible();
  104.       calcplot(i);
  105.    for (i=1;i<=ps;i++){
  106.          xw=x[i][j1]*scl+xs;
  107.          yw=y[i][j1]*scl+ys;
  108.          zw=z[i][j1]*scl;
  109.          visible();
  110.          calcplot(i);
  111.    }
  112.    scale(j1);
  113. }
  114.  
  115. void visible()
  116. {
  117.    vcx=xw;
  118.    vcy=yw-oy;
  119.    vcz=zw;
  120. }
  121.  
  122. void calcplot(i)
  123. short int i;
  124. {
  125.    k=1.0/(vcy*cy+vcz*cz);
  126.    ax=k*vcx;
  127.    ay=oy+k*vcy;
  128.    az=k*vcz;
  129.    if (s3!=0){
  130.       p[i][1]=(ax*cy)/s3;
  131.       p[i][2]=(az-qz)/s3;
  132.       return;
  133.    }
  134.    p[i][1]=(-ax*cz)/s2;
  135.    p[i][2]=(ay-qy)/s2;
  136. }
  137.  
  138. scale(j1)
  139. short int j1;
  140. {
  141.    register short int i;
  142.    double t;
  143.  
  144.    t=450.0*zoom;
  145.    for (i=0;i<=ps;i++){
  146.       p[i][1]=p[i][1]*t;
  147.       p[i][2]=p[i][2]*t;
  148.    }
  149.    xad=160.0-p[0][1];
  150.    yad=96.0-p[0][2];
  151.    for (i=1;i<=ps;i++){
  152.       p[i][1]=p[i][1]+xad;
  153.       p[i][2]=p[i][2]+yad;
  154.    }
  155.    drawit(j1);
  156. }
  157.  
  158. drawit(j1)
  159. short int j1;
  160. {
  161.    register short int i;
  162.  
  163.    for (i=1;i<=ls;i++){
  164.          x1=p[(ln[i][0][j1])][1];
  165.          y1=191-p[(ln[i][0][j1])][2];
  166.          x2=p[(ln[i][1][j1])][1];
  167.          y2=191-p[(ln[i][1][j1])][2];
  168.          w=ln1[i][j1]/2.0;
  169.          w*=zoom;
  170.          xc=x1;
  171.          yc=y1;
  172.          x9=x2;
  173.          y9=y2;
  174.          widen();
  175.    }
  176. }
  177.  
  178. void widen()
  179. {
  180.    double j;
  181.  
  182.    if ((x9==xc)&&(y9==yc))
  183.       return;
  184.    if (w<.4) {
  185.       clipit();
  186.       return;
  187.    }
  188.    for (j=-w/2.0;j<=w/2.0;j+=.4){
  189.       x1=x1+.5;
  190.       y1=y1+.5;
  191.       x2=x2+.5;
  192.       y2=y2+.5;
  193.       clipit();
  194.    }
  195. }
  196.  
  197. void clipit()
  198. {
  199.    m1=(short int)x1+osx;
  200.    m2=(short int)x2+osx;
  201.    n1=(short int)(scy*y1)-osy;
  202.    n2=(short int)(scy*y2)-osy;
  203.    Move(rp,m1,n1);
  204.    Draw(rp,m2,n2);
  205. }
  206.