像素画点算法

int Draw_Line(int x0,int y0,// starting position
int x1,int y1,// ending position
UCHAR color,// color index
UCHAR *vb_start,int lpitch) // video buffer and memory pitch
{
// this function draws a line from xo,yo to x1,y1 using differential error
// terms (based on Bresenahams work)

int dx,// difference in x's
dy,// difference in y's
dx2,// dx,dy * 2
dy2,
x_inc,// amount in pixel space to move during drawing
y_inc,// amount in pixel space to move during drawing
error,// the discriminant i.e. error i.e. decision variable
index; // used for looping

// pre-compute first pixel address in video buffer
vb_start = vb_start + x0 + y0*lpitch;

// compute horizontal and vertical deltas
dx = x1-x0;
dy = y1-y0;

// test which direction the line is going in i.e. slope angle
if (dx>=0)
{
x_inc = 1;

} // end if line is moving right
else
{
x_inc = -1;
dx = -dx; // need absolute value

} // end else moving left

// test y component of slope

if (dy>=0)
{
y_inc = lpitch;
} // end if line is moving down
else
{
y_inc = -lpitch;
dy = -dy; // need absolute value

} // end else moving up

// compute (dx,dy) * 2
dx2 = dx << 1;
dy2 = dy << 1;

// Now based on which delta is greater we can draw the line
if (dx > dy)
{
// initialize error term
error = dy2 - dx;

// draw the line
for (index=0; index <= dx; index++)
{
// set the pixel
*vb_start = color;

// test if error has overflowed
if (error >= 0)
{
error-=dx2;

// move to next line
vb_start+=y_inc;

} // end if error overflowed

// adjust the error term
error+=dy2;

// move to the next pixel
vb_start+=x_inc;

} // end for

} // end if |slope| <= 1
else
{
// initialize error term
error = dx2 - dy;

// draw the line
for (index=0; index <= dy; index++)
{
// set the pixel
*vb_start = color;

// test if error overflowed
if (error >= 0)
{
error-=dy2;

// move to next line
vb_start+=x_inc;

} // end if error overflowed

// adjust the error term
error+=dx2;

// move to the next pixel
vb_start+=y_inc;

} // end for

} // end else |slope| > 1

// return success
return(1);

} // end Draw_Line

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...