金牌会员
 
- 积分
- 1424
- 金钱
- 1424
- 注册时间
- 2011-11-27
- 在线时间
- 122 小时
|
今天看邱毅凌老师的书,提到一个有效率的画斜线的算法,在这分享一下。
该算法完全没有用到乘法和除法,效能相当好,而且画出的斜线不会用锯齿状,这个算法基本与机器无法,系统只要提供画点函数draw_pixel(int x,int y,int nColor)即可。
void draw_line(int x1, int y1, int x2, int y2,int nColor)
{
int i, deltax, deltay, numpixels, d, dinc1, dinc2,
x, xinc1, xinc2, y, yinc1, yinc2;
// Calculate delta-x and delta-y for initialization
if(x2-x1 < 0)
deltax = x1-x2 ;
else deltax = x2-x1 ;
if(y2-y1 < 0)
deltay = y1-y2 ;
else deltay = y2-y1 ;
// Initialize all vars based on which is the independent variable
//
if(deltax >= deltay)
{
//x is independent variable
//
numpixels = deltax + 1;
d = (2 * deltay) - deltax;
dinc1 = deltay << 1;
dinc2 = (deltay - deltax) << 1;
xinc1 = 1;
xinc2 = 1;
yinc1 = 0;
yinc2 = 1;
}
else
{
// y is independent variable
//
numpixels = deltay + 1;
d = (2 * deltax) - deltay;
dinc1 = deltax << 1;
dinc2 = (deltax - deltay) << 1;
xinc1 = 0;
xinc2 = 1;
yinc1 = 1;
yinc2 = 1;
}
// Make sure x and y move in the right directions
//
if(x1 > x2)
{
xinc1 = - xinc1;
xinc2 = - xinc2;
}
if(y1 > y2)
{
yinc1 = - yinc1;
yinc2 = - yinc2;
}
// Start drawing at <x1, y1>
//
x = x1;
y = y1;
// Draw the pixels
//
for(i= 1; i< numpixels;i++)
{
// 画点
draw_pixel(x, y, nColor);
if (d < 0)
{
d = d + dinc1;
x = x + xinc1;
y = y + yinc1;
}
else
{
d = d + dinc2;
x = x + xinc2;
y = y + yinc2;
}
}
}
|
|