一、光栅系统绘制图形的原理 1、光栅系统的图元都是由像素点组成的 2、像素点的坐标值都是整数,是离散的,因此表示图形时会出现锯齿现象 3、要绘制图形元素,就必须计算出组成图形元素的所有像素点的坐标值 4、好的算法(计算所有像素的坐标值)不但速度快,还要尽可能的减小锯齿的影响
二、划线算法 1、要求:给出线段的两个端点的坐标值,绘制出直线 2、可以计算出斜率 m 和节距 b |
三、DDA算法
1、如果斜率 m 小于 1 ,则水平方向每增加一个单位,垂直方向就增加 m 个单位,即
yk+1 =yk + m
计算结果要四舍五入,这样就可快速计算出线段上所有像素点的坐标值
2、如果斜率 m 大于 1,则垂直方向每增加一个单位,水平方向就增加 1/m 个单位,即
xk+1 = xk + 1/m
计算结果要四舍五入
3、区分 m 大于或者小于 1 是为了在变化率较小的方向上计算,可以减少锯齿
4、DDA算法的特点
充分利用了光栅的特性
比直接利用直线公式计算速度快,
累加过程中涉及到浮点运算,仍然耗时,且有误差
三、Bresenham 划线算法
1、基本思想
划线过程中,一个方向上的坐标总是加1,另一方向上的坐标要么不变、要么加1,能不能通过某种方法做出判断,利用上述特性,从而避免浮点运算
如上图所示:起始点的坐标为(xi,yi),则下一点的坐标应该为(xi+1,y),这一点叫理论计算点
由于光栅系统的坐标是离散的,理论计算点不存在,所以我们只能从理论计算点的上面或者下面,即(xi+1,yi)或者(xi+1,yi+1)两个里面选一个
道理很简单, 这两个那个离理论计算点更近,就选哪个。
如图:我们可以计算 d2-d1,如果大于零,则上面的点误差更大,选则下面的点;如果小于零,则选择上面的点。
2、消除浮点运算:
pk= (delta)x 乘以 (d2-d1)
将 d2-d1 乘以 delta x 就可以消除 m ,从而避免浮点运算
3、递推公式
pk+1 = pk + 2delta(y) - 2delta(x) (yk+1 - yk)
其中
yk+1 - yk 的值根据 pk 的符号,要么为零(即 y 坐标不变),要么为 1(即向上递增一个坐标)
4、初始值 p0
p0 = 2delta(y) - delta(x)
5、例题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库