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

Lacie ·
更新时间:2024-09-21
· 607 次阅读

文章目录中点算法原理中点算法实现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值来确定下一像素点:

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')

在这里插入图片描述

放大后观察

在这里插入图片描述


作者:Late whale



中点 计算机图形学 学习 matlab 算法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号