文章目录
中点算法原理
- 先讲最简单的一种情况,设直线斜率在区间 (0,1),其他情况可以类似推导。
- 当前像素点为P(xp,yp),下一像素点有两种选择P1或P2,P1,P2中点为M(xp+1,yp+0.5),Q为所画直线与x=xp+1交点,如图所示
- 当M在Q上方时,下一像素点取P1,M在Q下方时取P2
中点算法实现
-
令需画直线起点终点分别为(x1,y1),(x2,y2),直线方程为F(x,y)=ax+by+c=0,将点代入直线方程后化简可得a/b=-k(斜率k),所以令a=y1-y2,b=x2-x1(只要满足商为-k即可),c=x1y2-x2y1
-
可得点与直线的关系为:
- F(x,y)=0,在直线上
- F(x,y)>0,在直线上方
- F(x,y)<0,在直线下方
-
将中点M(xp+1,yp+0.5)代入直线方程:d=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c,根据d值来确定下一像素点:
- d<0,直线在M上方,取P2为下一像素点
- d>0,直线在M下方,取P1为下一像素点
- d=0,选P2,P1均可,我们这里取P1
-
若当前像素点为P(xp,yp),我们考虑d>=0和d<0两种情况:
-
d<0,此时P1为下一像素点,下下一像素点为:d1=F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=[a(xp+1)+(yp+0.5)+c]+a+b=d+a+b
此时d1=d+a+b,增量为a+b
-
d>=0,此时P2为下一像素点,下下一像素点为:d2=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)+c=[a(xp+1)+(yp+0.5)+c]+a=d+a
此时d2=d+a,增量为a
-
-
d的值为第一个像素点(x1,y1)所对应的d0,d0=F(x1+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c=ax0+by0+c+a+0.5b=F(x0,y0)+a+0.5b,因为F(x0,y0)=0,所以d0=a+0.5b
考虑到d的增量均为正数,用2d代替d摆脱对浮点数的计算,d1改为2(a+b),d2改为2a
matlab代码实现
function midpoint(x1,y1,x2,y2,color)
a = (y1-y2);
b = (x2-x1);
d=2*a+b;
d1=2*a;
d2=2*(a+b);
x=x1;
y=y1;
hold on
grid minor
scatter(x,y,'.',color)
for i=x:x2
if d<0
x=x+1;
y=y+1;
d=d+d2;
else
x=x+1;
d=d+d1;
end
scatter(x,y,'.',color)
end
hold off
查看结果
调用之前的midpoint函数(注意选斜率为0到1之间的点)
midpoint(200,600,500,750,'red')
放大后观察