home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / line3d / dl.c
Text File  |  1992-05-11  |  3KB  |  144 lines

  1. /*
  2.  * line3d was dervied from DigitalLine.c published as "Digital Line Drawing"
  3.  * by Paul Heckbert from "Graphics Gems", Academic Press, 1990
  4.  * 
  5.  * 3D modifications by Bob Pendleton. The original source code was in the public
  6.  * domain, the author of the 3D version places his modifications in the
  7.  * public domain as well.
  8.  * 
  9.  * line3d uses Bresenham's algorithm to generate the 3 dimensional points on a
  10.  * line from (x1, y1, z1) to (x2, y2, z2)
  11.  * 
  12.  */
  13.  
  14. /* find maximum of a and b */
  15. #define MAX(a,b) (((a)>(b))?(a):(b))
  16.  
  17. /* absolute value of a */
  18. #define ABS(a) (((a)<0) ? -(a) : (a))
  19.  
  20. /* take sign of a, either -1, 0, or 1 */
  21. #define ZSGN(a) (((a)<0) ? -1 : (a)>0 ? 1 : 0)
  22.  
  23. point3d(x, y, z)
  24.     int x, y, z;
  25. {
  26.  
  27.     /* output the point as you see fit */
  28.  
  29. }
  30.  
  31. line3d(x1, y1, x2, y2, z1, z2)
  32.     int x1, y1, x2, y2, z1, z2;
  33. {
  34.     int xd, yd, zd;
  35.     int x, y, z;
  36.     int ax, ay, az;
  37.     int sx, sy, sz;
  38.     int dx, dy, dz;
  39.  
  40.     dx = x2 - x1;
  41.     dy = y2 - y1;
  42.     dz = z2 - z1;
  43.  
  44.     ax = ABS(dx) << 1;
  45.     ay = ABS(dy) << 1;
  46.     az = ABS(dz) << 1;
  47.  
  48.     sx = ZSGN(dx);
  49.     sy = ZSGN(dy);
  50.     sz = ZSGN(dz);
  51.  
  52.     x = x1;
  53.     y = y1;
  54.     z = z1;
  55.  
  56.     if (ax >= MAX(ay, az))            /* x dominant */
  57.     {
  58.         yd = ay - (ax >> 1);
  59.         zd = az - (ax >> 1);
  60.         for (;;)
  61.         {
  62.             point3d(x, y, z);
  63.             if (x == x2)
  64.             {
  65.                 return;
  66.             }
  67.  
  68.             if (yd >= 0)
  69.             {
  70.                 y += sy;
  71.                 yd -= ax;
  72.             }
  73.  
  74.             if (zd >= 0)
  75.             {
  76.                 z += sz;
  77.                 zd -= ax;
  78.             }
  79.  
  80.             x += sx;
  81.             yd += ay;
  82.             zd += az;
  83.         }
  84.     }
  85.     else if (ay >= MAX(ax, az))            /* y dominant */
  86.     {
  87.         xd = ax - (ay >> 1);
  88.         zd = az - (ay >> 1);
  89.         for (;;)
  90.         {
  91.             point3d(x, y, z);
  92.             if (y == y2)
  93.             {
  94.                 return;
  95.             }
  96.  
  97.             if (xd >= 0)
  98.             {
  99.                 x += sx;
  100.                 xd -= ay;
  101.             }
  102.  
  103.             if (zd >= 0)
  104.             {
  105.                 z += sz;
  106.                 zd -= ay;
  107.             }
  108.  
  109.             y += sy;
  110.             xd += ax;
  111.             zd += az;
  112.         }
  113.     }
  114.     else if (az >= MAX(ax, ay))            /* z dominant */
  115.     {
  116.         xd = ax - (az >> 1);
  117.         yd = ay - (az >> 1);
  118.         for (;;)
  119.         {
  120.             point3d(x, y, z);
  121.             if (z == z2)
  122.             {
  123.                 return;
  124.             }
  125.  
  126.             if (xd >= 0)
  127.             {
  128.                 x += sx;
  129.                 xd -= az;
  130.             }
  131.  
  132.             if (yd >= 0)
  133.             {
  134.                 y += sy;
  135.                 yd -= az;
  136.             }
  137.  
  138.             z += sz;
  139.             xd += ax;
  140.             yd += ay;
  141.         }
  142.     }
  143. }
  144.