/*
* 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;
}
}
}