计算机图形学学习(一) 直线中点算法讲解及matlab实现


中点算法原理

  • 先讲最简单的一种情况,设直线斜率在区间 (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')

在这里插入图片描述

放大后观察

在这里插入图片描述

发布了85 篇原创文章 · 获赞 158 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Late_whale/article/details/105051740