中點算法原理
- 先講最簡單的一種情況,設直線斜率在區間 (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')
放大後觀察