home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / alde_c / misc / graph / simgrafc / demo3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-02-10  |  3.9 KB  |  196 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <limits.h>
  4.  
  5. int clr1, clr2, clr3;
  6. int xp[9], yp[9], zp[9];
  7. float x0, y0, z0, xa, ya, za;
  8. int xc[9], yc[9], zc[9];
  9. double the, phi, rho;
  10. float cc[4][4];
  11. float x,y;
  12.  
  13. main()
  14. {
  15.          
  16.    float dtor;
  17.    int i;
  18.    int ret;
  19.  
  20.    x0 = 160;
  21.    y0 = 100;
  22.    z0 = 100;
  23.    the = 0;
  24.    phi = 0;
  25.    rho = 0;
  26.    dtor = 3.14159/180;
  27.  
  28. g_init();
  29. g_pal(0);
  30. gbox(40,20,280,180,1);
  31. locate(1,24);
  32. printf("Hit <ENTER> to rotate cube");
  33. locate(1,1);
  34.    for (i=0;i<=18;++i){
  35.            getcoord();
  36.        xmat();
  37.        rotate();
  38.        ymat();
  39.         rotate();
  40.            the += 10*dtor;
  41.        phi += 10*dtor;
  42.            clr1 = 1, clr2 = 2, clr3 = 3;
  43.            draw_box();
  44.            scanf("%c",&ret);
  45.            clr1 = 0, clr2 = 0, clr3 = 0;
  46.            draw_box();
  47.          }
  48.  
  49. scanf("%c",&ret);
  50. g_text(80);
  51. }
  52. getcoord()
  53. {
  54. float da,db,dc;
  55.  
  56.    da = 100;
  57.    db =  80;
  58.    dc =  80;
  59.    xp[1] = xp[2] = xp[5] = xp[6] = x0 - da/2;
  60.    xp[3] = xp[4] = xp[7] = xp[8] = x0 + da/2;
  61.    yp[1] = yp[4] = yp[5] = yp[8] = y0 + db/2;
  62.    yp[2] = yp[3] = yp[6] = yp[7] = y0 - db/2;
  63.    zp[1] = zp[2] = zp[3] = zp[4] = z0 - dc/2;
  64.    zp[5] = zp[6] = zp[7] = zp[8] = z0 + dc/2;
  65.  
  66.    /* coordinates for the number on the face */
  67.  
  68.    xc[1] = xp[1] + 20;
  69.    yc[1] = yp[1] - 15;
  70.    xc[2] = xc[1] + 40;
  71.    yc[2] = yc[1];
  72.    xc[3] = xc[2] + 20;
  73.    yc[3] = yc[2] - 10;
  74.    xc[4] = xc[3];
  75.    yc[4] = yc[3] - 10;
  76.    xc[5] = xc[2];
  77.    yc[5] = yc[4] - 10;
  78.    xc[6] = xc[1];
  79.    yc[6] = yc[5];
  80.    xc[7] = xc[1];
  81.    yc[7] = yc[6] - 20;
  82.    xc[8] = xc[1] + 60;
  83.    yc[8] = yc[7];
  84.    zc[1]=zc[2]=zc[3]=zc[4]=zc[5]=zc[6]=zc[7]=zc[8]=zp[1];
  85. }
  86. xmat()
  87. {
  88. float sinthe = sin(the);
  89. float costhe = cos(the);
  90.  
  91.    cc[1][1] = 1;
  92.    cc[1][2] = cc[1][3] = cc[2][1] = cc[3][1] = 0;
  93.    cc[2][2] = cc[3][3] = costhe;
  94.    cc[2][3] = sinthe;
  95.    cc[3][2] = -sinthe;
  96. }
  97. ymat()
  98. {
  99. float sinphi = sin(phi);
  100. float cosphi = cos(phi);
  101.  
  102.    cc[1][1] = cc[3][3] = cosphi;
  103.    cc[1][2] = cc[2][1] = cc[2][3] = cc[3][2] = 0;
  104.    cc[1][3] = -sinphi;
  105.    cc[2][2] = 1;
  106.    cc[3][1] = sinphi;
  107. }
  108. zmat()
  109. {
  110. float sinrho = sin(rho);
  111. float cosrho = cos(rho);
  112.  
  113.    cc[1][1] = cc[2][2] = cosrho;
  114.    cc[1][2] = sinrho;
  115.    cc[2][1] = -cc[1][2];
  116.    cc[1][3] = cc[2][3] = cc[3][1] = cc[3][2] = 0;
  117.    cc[3][3] = 1;  
  118. }
  119. draw_box()
  120. {
  121. int i;
  122.  
  123.    /* individual lines*/
  124.  
  125.    for (i=1; i<=4; ++i){
  126.        g_line(xp[i],yp[i],xp[i+4],yp[i+4],clr3);
  127.        }
  128.   
  129.    /* back rectangle  */
  130.  
  131.    g_line(xp[5],yp[5],xp[6],yp[6],clr2);
  132.    g_line(xp[6],yp[6],xp[7],yp[7],clr2);
  133.    g_line(xp[7],yp[7],xp[8],yp[8],clr2);
  134.    g_line(xp[8],yp[8],xp[5],yp[5],clr2);
  135.  
  136.    /* front rectangle */
  137.  
  138.    g_line(xp[1],yp[1],xp[2],yp[2],clr1);
  139.    g_line(xp[2],yp[2],xp[3],yp[3],clr1);
  140.    g_line(xp[3],yp[3],xp[4],yp[4],clr1);
  141.    g_line(xp[4],yp[4],xp[1],yp[1],clr1);
  142.  
  143.    /* number */
  144.    for (i=2; i<=8; ++i)
  145.        {
  146.        g_line(xc[i-1],yc[i-1],xc[i],yc[i],clr3);
  147.        }
  148.   
  149.  
  150. }
  151. rotate()
  152. {
  153.    int i;
  154.     for (i=1;i<9;++i){
  155.         xa = xp[i] - x0;
  156.         ya = yp[i] - y0;
  157.         za = zp[i] - z0;
  158.         xp[i] = x0 + xa*cc[1][1] + ya*cc[2][1] + za*cc[3][1];
  159.         yp[i] = y0 + xa*cc[1][2] + ya*cc[2][2] + za*cc[3][2];
  160.         zp[i] = z0 + xa*cc[1][3] + ya*cc[2][3] + za*cc[3][3];
  161.     }
  162.  
  163.     for (i=1;i<=8;++i){
  164.         xa = xc[i] - x0;
  165.         ya = yc[i] - y0;
  166.         za = zc[i] - z0;
  167.         xc[i] = x0 + xa*cc[1][1] + ya*cc[2][1] + za*cc[3][1];
  168.         yc[i] = y0 + xa*cc[1][2] + ya*cc[2][2] + za*cc[3][2];
  169.         zc[i] = z0 + xa*cc[1][3] + ya*cc[2][3] + za*cc[3][3];
  170.     }
  171. }
  172. write_coords()
  173. {
  174.    int i;
  175.    int row = 1;
  176.    int col = 1;
  177.  
  178.         locate(row,col);
  179.     for (i=1;i<9;++i){
  180.         printf("%4d  %4d  %4d\n",xp[i],yp[i],zp[i]);
  181.     }
  182. }
  183. gbox(x1,y1,x2,y2,clr)
  184. int x1,y1,x2,y2,clr;
  185. {
  186.     g_line(x1,y1,x2,y1,clr);
  187.     g_line(x2,y1,x2,y2,clr);
  188.     g_line(x2,y2,x1,y2,clr);
  189.     g_line(x1,y2,x1,y1,clr);
  190. }
  191. pause()
  192. {
  193.     int l;
  194.     for (l=0; l<=20000; ++l) {}
  195. }
  196.