line drawing...

Started by
3 comments, last by pag 20 years, 11 months ago
Could anyone direct me to a tutorial or algorithm that draws a line on the screen with the following parameters, origin(the lines position), length and angle... the function prototype should look like this:> void drawLine(int origin, int length, float angle); oh. and it should be really quick any help is greatly appreciated! / Patrick
I am a signature virus. Please add me to your signature so that I may multiply.
Advertisement
You can use the Bresenham algorithm, it is very fast, the only thing that you have to do is rotate your point in the desired angle using your first point as origin to rotate.

If God with me, Who against me?
--------------------------------------------- If God with me, Who against me?Personal Web Samuel Prince Blog...
doh, why didnt I think of that... ehe... anyways thanks alot.

In the next 80 years 6 billion people will die...
I am a signature virus. Please add me to your signature so that I may multiply.
Here''s a start:


  // Need to determine Lines end point//  using an angle, magnitude, and origin  radians = (angle * 180) / PI_CONSTANT; // convert to radians if angle is in degrees  end.x=(cos(radians)*length) + origin.x;  end.y=(sin(radians)*length) + origin.y;// use a normal line plotter to plot the line between the points  line(origin,end);  


I hope this isn''t homework??

Okay, Here''s something I slapped together. Hope it works correctly. (beware of my mad skillz)

BTW there is no clipping performed in this function!!!
You should try to do clipping at a higher level for speed anyway.

It shouldn''t be too hard to add some clipping if you desire.


  // input://  origin - is a point structure//  lenght - is the number of pixels plotted//   angle - must be in radiansvoid drawline(point origin, int lenght, float angle){ int x_adder,y_adder; int x_direction,y_direction; char far *offset;// Check for an invalid line length if(lenght<1){return;} // these two calculations could be made into an evil LUT (could speed it up nicely)//  MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW should be//  32767 for 16 bit signed int or 2147483647 for 32 bit signed int// this will provide the best accurracy I can think of  x_adder = cos(angle) * MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW;  y_adder = sin(angle) * MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW;// Check for negative directions  if(x_adder<0)  {x_adder = -x_adder;   x_direction = -1;   }  else  {x_direction = 1;   }  if(y_adder<0)  {y_adder = -y_adder;   y_direction = -PITCH_CONSTANT;  }  else  {y_direction = PITCH_CONSTANT;   }// initialize the accumulators  x_accum = 0;  y_accum = 0;// calculate origin''s memory offset offset = (char far *)&videobuffer[(origin.y*(pitch/bytes_per_pixel)+origin.x]// Plotting the line while(lenght--) { // plot pixel   *(desired pointer type cast)offset = pixel_color; // Update X movement for next pixel   x_accum += x_adder; // Check X movement   while(x_accum>=MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW)   {offset+=x_direction;    x_accum -= MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW;   } // Update Y movement for the next pixel   y_accum += y_adder; // Check Y movement   while(y_accum>=MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW)   {offset+=y_direction;    y_accum -= MAX_VALUE_ACCUM_DATATYPE_WILL_ALLOW;   } }// end of drawline  return;}  


Good Luck!

If there is anything wrong with this code feel free to insult me.
However, please point out why I messed up. And if anyone would like to show some better ways of doing this please show everyone.

This topic is closed to new replies.

Advertisement