Jump to content

  • Log In with Google      Sign In   
  • Create Account


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.

  • You cannot reply to this topic
No replies to this topic

#1 Erika32   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)
   {
	//Add dx to accumilator
	accum += dx;
	//Add sy to Start Y
	startY += sy;
   }
   //Add sx to Start X
   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.


Sponsor:



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.



PARTNERS