基本算法:
当前象素点为(xp, yp)下一个象素点为P1 或P2设M=(xp+1, yp+0.5),为p1与p2
之中点,Q为理想直线与x=xp+1垂线的交点。将Q与M的y坐标进行比较。
当M在Q的下方,则P2 应为下一个象素点;
M在Q的上方,应取P1为下一点
构造判别式:d=F(M)=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c其中a=y0-y1,
b=x1-x0, c=x0y1-x1y0
当d<0,M在L(Q点)下方,取右上方P2为下一个象素;
当d>0,M在L(Q点)上方,取右方P1为下一个象素;
当d=0,选P1或P2均可,约定取P1为下一个象素;
若当前象素处于d³0情况,则取正右方象素P1(xp+1, yp), 要判下一个象素位置,应计算d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)=d+a; 增量为a
若d<0时,则取右上方象素P2 (xp+1, yp+1)。要判断再下一象素,则要计算
d2= F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为a+b
** 画线从(x0,y0)开始,d的初值 d0=F(x0+1,y0+0.5)=F(x0, y0)+a+0.5b =a+0.5b。
可以用2d代替d来摆脱小数,提高效率**
例:用中点画线法画直线段 P1(0, 0)—P2(5, 2)
a=y1-y2=-2 b=x2-x1=5
d0=2a+b=1 d1=2a=-4 d2=2(a+b)=6
算法:
void Midpoint Line (int x0,int y0,int x1, int y1,int color)
{
int a, b, d1, d2, d, x, y;
a=y0-y1, b=x1-x0, d=2*a+b;
d1=2*a, d2=2* (a+b);
x=x0, y=y0;
drawpixel(x, y, color);
while (x<x1)
{
if (d<0)
{
x++, y++, d+=d2;
}
else
{
x++, d+=d1;
}
drawpixel (x, y, color);
} /* while */
} /* mid PointLine */