bresenham算法_软光栅-画直线算法

e2af8e3ea7f704669cde1a1eb03d1c96.png

1、数值微分法(Digital Differential Analyzer,简称DDA)

---一种直接从直线的微分方程生成直线的方法。

通过给定两点坐标,可以算出对应的斜率。

如斜率小于1,则代表直线在x方向的变化率比y方向的变化率大。则选定x轴为最大位移方向,同理大于1则选择y轴为最大位移方向。假若在斜率小于1时,选定y方向作为最大位移方向,当y走1步,x的值可能变化了很多,可以想象直线接近于x轴的特殊情况。

算出来的点可能时小数,可以通过四舍五入去取得整数。

算法特点:

在一个迭代算法中,如果每一步的x,y值是用前一步的值加上一个增量来获得的,那么,这种算法就称为增量算法。因此,DDA算法是一个增量算法

优点:DDA算法直观、易实现

缺点:有浮点数和浮点运算,效率不高

代码实现:

#include

2、中点Bresenham算法

通过给定两点的坐标可以算出直线的斜截式方程:y=kx+b。也就可以写成隐式方程:

F(x,y)=y-kx-b=0

当F(x,y)>0,说明这个点在直线上方
当F(x,y)=0,说明这个点在直线上
当F(x,y)<0,说明这个点在直线上下方

8a14758fa11d870d77bbda0c577815cc.png
以下图片均来源于华中科技大学万琳老师计算机图形学课件

若将中点M带入隐式方程,若大于0,则代表重点在直线上方,也就说明直线更加偏向于下方的pd点,反之则偏向于pu点,若等于0,随便取上下都行。

将中点带入隐式方程(构造判别式)后:

2830f3d2b277a371fba84a56bca09c2c.png

0c02639fb55abcd610ab5f462107c1aa.png

84218de2ef1b779c8abd0c865c818977.png

v2-29f142057a23ad6a9dd996c27d5f2748_b.jpg

因为考虑的只是d的正负,所以可以将d扩大一定的倍数,使其成为一个整数

d0=0.5-k d<0 : d = d+1-k d>0 : d = d-k

94f534e1b83ebfe310844804139b643f.png

此时,d是整数,这样就可以减轻我们的计算机,加快速度。

3402597e9d21e06be0b82559cf001bb5.png

3、改进的Bresenham算法

bcba669a1bc6cd20c7dca563c86987c9.png

eb56e2f992b349ec52a2ffc343599ab7.png

8f905fc382519a2cfc71488beb46c70b.png
这里面相当于给包含e的所有等式在左边的基础上成了一个2dx

408f8ecf9c7b648b9b3764c23dd6d144.png

代码实现:

#include

如有错误之处,欢迎大家指正,同时也欢迎大家一起交流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值