计算机图形学-直线段扫描转换算法

我们如果要画一条直线 可以获取到目标直线的(x0,y0)(x1,y1)两个点这样我们就能得出目标直线的直线方程 y=kx+b 此时我们假设x是从x0 一个像素一个像素的延伸到x1 这样我们就不断地从x0+1直到x1 带入方程获取到y值 但是像素只有整数 所以再对y值和x值进行取整就行了
在这里插入图片描述

数值微分法

核心思想

通过x = x+1求出每一个x在曲线上的y值
然后再对这个值进行取整就得到了要绘制的点

算法实现

yi = kxi+b
yi+1 = kxi+1+b
而我们前面说 按照x每次+1来计算 所以
yi+1 = (kxi+1)+b
yi+1 = kxi+k+b
yi+1 = (kxi+b) + k
yi+1 = yi+k
这样我们就把k*xi换走了 大大的增加了效率
在这里插入图片描述
y+0.5是为了方便取整 因为如果0.6直接取整是0 而+0.5后 取整就是1 主要就是让大于0.5向上取整

缺点

如果k值>1时就会发现光栅点太稀疏 主要原因是你是按x每次+1来计算的 如果这条线 y距离非常远而x距离非常近 最直观的就是 (0,1000)到(0,0)这条线 就会发现没有一个点
在这里插入图片描述

中点画线法

核心思想

求可能绘制的两个像素点的中点 然后将中点与目标函数做对比 观察该点在 函数上还是函数下 从而知道是去哪个点

算法实现

0 = Ax+By+C
首先我们知道
将一个点带入某直线方程
在这里插入图片描述
由于数值微分法还需要加完后取整 中点画线法主要是对这部分的改进
在这里插入图片描述
图中可以知道y值要么+1要么不加 所以我们不再将xi+1带入方程 再+0.5取整了 而是将(xi+1,yi+0.5)带入直线 如果小于0则y不+1 如果大于0则+1

Bresenham算法

核心思想

在这里插入图片描述通过这个d离上面的近还是离下面的近了判断用哪个点

算法实现

在这里插入图片描述
然后因为d>0.5不好计算 因为0.5是1/2要涉及到除法 所以增量思想
e = d-0.5
在这里插入图片描述
e初始值为-0.5
每x+1则
e = e+k(k是曲线斜率 从图中可以看出第一个d就等于k) 这样就不需要再求直线的交点了
if(e>0) then e=e-1;保证e一定在0-1之间
但是实际上k也不好计算 所以再进行转换
在这里插入图片描述
和前面 e = d-0.5一样 将e改成e*2dx 没什么影响
主要是为了消除k的计算 帮助我们在计算e = e+k的时候不需要再计算k而是
e = e + 2dy
这样就只有整数加法计算了
在这里插入图片描述

优点

相较于中点画线法 他的使用范围更大不再局限于斜率k大于0的方程 可以运用于圆 曲线等线的构造上去

总结

实际上无论是中点画线法 还是Bresenham算法都是对数值微分法的一个改进
围绕着两个点
一个是增量思想 尽量减少乘法和除法的出现 加快效率 增量思想是通过递推方程获取从yi 到yi+1 的间隔 避免每次将xi+1带入方程求交点
另一个是整数相加思想 也同样是为了加快效率

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值