令需画直线起点终点分别为(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值来确定下一像素点:
d0,直线在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')
放大后观察