home *** CD-ROM | disk | FTP | other *** search
- /*
- * line3d was dervied from DigitalLine.c published as "Digital Line Drawing"
- * by Paul Heckbert from "Graphics Gems", Academic Press, 1990
- *
- * 3D modifications by Bob Pendleton. The original source code was in the public
- * domain, the author of the 3D version places his modifications in the
- * public domain as well.
- *
- * line3d uses Bresenham's algorithm to generate the 3 dimensional points on a
- * line from (x1, y1, z1) to (x2, y2, z2)
- *
- */
-
- /* find maximum of a and b */
- #define MAX(a,b) (((a)>(b))?(a):(b))
-
- /* absolute value of a */
- #define ABS(a) (((a)<0) ? -(a) : (a))
-
- /* take sign of a, either -1, 0, or 1 */
- #define ZSGN(a) (((a)<0) ? -1 : (a)>0 ? 1 : 0)
-
- point3d(x, y, z)
- int x, y, z;
- {
-
- /* output the point as you see fit */
-
- }
-
- line3d(x1, y1, x2, y2, z1, z2)
- int x1, y1, x2, y2, z1, z2;
- {
- int xd, yd, zd;
- int x, y, z;
- int ax, ay, az;
- int sx, sy, sz;
- int dx, dy, dz;
-
- dx = x2 - x1;
- dy = y2 - y1;
- dz = z2 - z1;
-
- ax = ABS(dx) << 1;
- ay = ABS(dy) << 1;
- az = ABS(dz) << 1;
-
- sx = ZSGN(dx);
- sy = ZSGN(dy);
- sz = ZSGN(dz);
-
- x = x1;
- y = y1;
- z = z1;
-
- if (ax >= MAX(ay, az)) /* x dominant */
- {
- yd = ay - (ax >> 1);
- zd = az - (ax >> 1);
- for (;;)
- {
- point3d(x, y, z);
- if (x == x2)
- {
- return;
- }
-
- if (yd >= 0)
- {
- y += sy;
- yd -= ax;
- }
-
- if (zd >= 0)
- {
- z += sz;
- zd -= ax;
- }
-
- x += sx;
- yd += ay;
- zd += az;
- }
- }
- else if (ay >= MAX(ax, az)) /* y dominant */
- {
- xd = ax - (ay >> 1);
- zd = az - (ay >> 1);
- for (;;)
- {
- point3d(x, y, z);
- if (y == y2)
- {
- return;
- }
-
- if (xd >= 0)
- {
- x += sx;
- xd -= ay;
- }
-
- if (zd >= 0)
- {
- z += sz;
- zd -= ay;
- }
-
- y += sy;
- xd += ax;
- zd += az;
- }
- }
- else if (az >= MAX(ax, ay)) /* z dominant */
- {
- xd = ax - (az >> 1);
- yd = ay - (az >> 1);
- for (;;)
- {
- point3d(x, y, z);
- if (z == z2)
- {
- return;
- }
-
- if (xd >= 0)
- {
- x += sx;
- xd -= az;
- }
-
- if (yd >= 0)
- {
- y += sy;
- yd -= az;
- }
-
- z += sz;
- xd += ax;
- yd += ay;
- }
- }
- }
-