• Create Account

We're offering banner ads on our site from just \$5!

# 3D line drawing algorithm?

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

No replies to this topic

### #1Erika32  Members   -  Reputation: 116

Like
0Likes
Like

Posted 31 August 2012 - 06:09 PM

I have some modified Bresenham line code, but I can't seem to wrap my head around the concept of taking it into the third dimension.

typedef void (*pointCallback)(int x, int y);
void DoLine(int startX, int startY, int endX, int endY, pointCallback callback)
{
int dx, dy;
int sx, sy;
int accum;//accumilator
dx = endX - startX;//Start X subtracted from End X
dy = endY - startY;
sx = ((dx) < 0 ? -1 : ((dx) > 0 ? 1 : 0));//if dx is less than 0, sx = -1; otherwise if dx is greater than 0, sx = 1; otherwise sx = 0
sy = ((dy) < 0 ? -1 : ((dy) > 0 ? 1 : 0));
//dx = (dx < 0 ? -dx : dx);//if dx is less than 0, dx = -dx (becomes positive), otherwise nothing changes
dx = abs(dx);//Absolute value
//dy = (dy < 0 ? -dy : dy);
dy = abs(dy);
endX += sx;//Add sx to End X
endY += sy;
//x = 6
//y = 5
//accum = 3
//accum - 5 = 1
//startx + 1 = 1
//accum - 5 = -4
//accum + 6 = 2
//startY + 1 = 1
if (dx > dy)//if dx is greater than dy
{
accum = dx >> 1;//Accumilator = dx / 2
do
{
//Plot point
callback(startX, startY);
//Subtract dy from accumilator
accum -= dy;
//if accumilator is less than 0
if (accum < 0)
{
accum += dx;
startY += sy;
}
startX += sx;
} while (startX != endX);
}
else
{
accum = dy >> 1;
do
{
callback(startX, startY);
accum -= dx;
if (accum < 0)
{
accum += dy;
startX += sx;
}
startY += sy;
} while (startY != endY);
}
}


All I can think of to do is parallel draw the line between the XY and YZ planes, but I'm not sure of how do go about doing that.

Edit: I think I figured it out. I always figure out my problem right after I resort to asking for help >.<

public static void DoLine(int startX, int startY, int startZ, int endX, int endY, int endZ, Action<int, int, int> callback)
{
int dx, dy, dz;
int sx, sy, sz;
int accum, accum2;//accumilator
dx = endX - startX;//Start X subtracted from End X
dy = endY - startY;
dz = endZ - startZ;
sx = ((dx) < 0 ? -1 : ((dx) > 0 ? 1 : 0));//if dx is less than 0, sx = -1; otherwise if dx is greater than 0, sx = 1; otherwise sx = 0
sy = ((dy) < 0 ? -1 : ((dy) > 0 ? 1 : 0));
sz = ((dz) < 0 ? -1 : ((dz) > 0 ? 1 : 0));
//dx = (dx < 0 ? -dx : dx);//if dx is less than 0, dx = -dx (becomes positive), otherwise nothing changes
dx = Math.Abs(dx);//Absolute value
//dy = (dy < 0 ? -dy : dy);
dy = Math.Abs(dy);
dz = Math.Abs(dz);
endX += sx;//Add sx to End X
endY += sy;
endZ += sz;
if (dx > dy)//if dx is greater than dy
{
if (dx > dz)
{
accum = dx >> 1;
accum2 = accum;
do
{
callback(startX, startY, startZ);
accum -= dy;
accum2 -= dz;
if (accum < 0)
{
accum += dx;
startY += sy;
}
if (accum2 < 0)
{
accum2 += dx;
startZ += sz;
}
startX += sx;
}
while (startX != endX);
}
else
{
accum = dz >> 1;
accum2 = accum;
do
{
callback(startX, startY, startZ);
accum -= dy;
accum2 -= dx;
if (accum < 0)
{
accum += dz;
startY += sy;
}
if (accum2 < 0)
{
accum2 += dz;
startX += sx;
}
startZ += sz;
}
while (startZ != endZ);
}
}
else
{
if (dy > dz)
{
accum = dy >> 1;
accum2 = accum;
do
{
callback(startX, startY, startZ);
accum -= dx;
accum2 -= dz;
if (accum < 0)
{
accum += dx;
startX += sx;
}
if (accum2 < 0)
{
accum2 += dx;
startZ += sz;
}
startY += sy;
}
while (startY != endY);
}
else
{
accum = dz >> 1;
accum2 = accum;
do
{
callback(startX, startY, startZ);
accum -= dx;
accum2 -= dy;
if (accum < 0)
{
accum += dx;
startX += sx;
}
if (accum2 < 0)
{
accum2 += dx;
startY += sy;
}
startZ += sz;
}
while (startZ != endZ);
}
}
}


Edited by Erika32, 31 August 2012 - 06:35 PM.