2.递推公式和算法 假设直线的起点和终点分别为(x0,y0) 和(x1,y1),则直线方程为 Fx,y)=ax+by+C=0 即(y y0)(X-x0)=(y1-y0)/(x1-X0) 其中,a=yoy1,b=x1-x0,c=x0y1-x1y0 ●对于直线中的点,则有F(x,y)=0对于直 线上方的点,则有F(xy)>0对于直线下 方的点,则有F(x,y)<0
2.递推公式和算法 ⚫ 假设直线的起点和终点分别为(x0,y0) 和(x1,y1),则直线方程为: ⚫ F(x,y)=ax+by+c=0 即 (yy0)/(x-x0)=(y1-y0)/(x1-x0) ⚫ 其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0。 ⚫ 对于直线中的点,则有F(x,y)=0;对于直 线上方的点,则有F(x,y)>0;对于直线下 方的点,则有F(x,y)<0
判断中点M在Q的上方,还是 在下方,只要将中点坐标 M(x+1y+0.5)代入F(xy)方程 中,并判断它的符号。构造判 别式 d=F(M)=F(x+1,y+05)=a(X+1)+by+05)+c 当d<0时,表示M在直线的下方,则取P2为下 点;当d>0时,表示M在直线的上方,则取 P1为下一点;当d=0时,表示M在直线中,取 P1或P2均可,我们约定取P1
• 判断中点M在Q的上方,还是 在下方 , 只 要 将 中 点 坐 标 M(xi+1,yi+0.5)代入F(x,y)方程 中,并判断它的符号。构造判 别式 ⚫ d=F(M)=F(xi+1,yi+0.5)= a((xi+1)+b(yi+0.5)+c ⚫ 当d<0时,表示M在直线的下方,则取P2为下 一点;当d>0时,表示M在直线的上方,则取 P1为下一点;当d=0时,表示M在直线中,取 P1或P2均可,我们约定取P1
递推式子 (1) 当d>=0时,取P1为下一个像素点, 欲判断再下一个像素,应计算 ●d1=(M1)=F(x+2y1+0.5)=a(x+2)+b(y+0.5)+ c=d+a ●即d的增量△d=a 当d<0时,取P2为下一个像素点,欲 判断再下一个像素,应计算 d2=FM2)=F(x+2y+15)=a(x+2)+b(y+15)+ c=d+a+b ●即d的增量△d=a+b
递推式子 ⚫ (1) 当d>=0时,取P1为下一个像素点, 欲判断再下一个像素,应计算 ⚫ d1=F(M1)=F((xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+ c=d+a ⚫ 即d的增量△d=a ⚫ (2) 当d<0时,取P2为下一个像素点,欲 判断再下一个像素,应计算 ⚫ d2=F(M2)=F((xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+ c=d+a+b ⚫ 即d的增量△d=a+b
((3)求d的初始值。第一个像素点为起点 0,y0),则 dO=F(xO+1,y0+0.5)=a(xO+1)+b(y0+0.5)+c =(ax0+by+c)+a+0.5b F(XO, yO)+a+0.5b 由由于起点(xO,y0)在直线上,即F(xO.yO)=0, 所以d0=a+0.5b
( (3) 求 d 的 初 始 值 。 第 一 个 像 素 点 为 起 点 (x0,y0),则 d0=F(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c =(ax0+by0+c)+a+0.5b =F(x0,y0)+a+0.5b 由 由于起点(x0,y0)在直线上,即F(x0,y0)=0, 所以d0=a+0.5b
MidPointLine(x0, yO, xl, yl, color) int x0. vO.xl.vI color: int a, b, deltal, delta2, d, x, y; a=y0-yl; b=x1-XO d=a+0.5*b: deltal=a: delta2=a+b putpixel(x, y, color); while(x<xl) if (d<0) x++;y++; d+= delta2;/取P2,并且计算下一点的d值 else x++ d+= deltal;/取P1,并且计算下一点的d值 putpixel(x, y, color)
中点画线算法: MidPointLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int a,b,delta1,delta2,d,x,y; a=y0-y1; b=x1-x0; d=a+0.5*b; delta1=a; delta2=a+b; x=x0; y=y0; putpixel(x,y,color); while (x<x1) { if (d<0) { x++; y++; d+=delta2; //取P2,并且计算下一点的d值 } else { x++; d+=delta1; //取P1,并且计算下一点的d值 } putpixel(x,y,color); } }