页数:14页文件大小:128.5 KB来源: 计算机图形学ppt课件
本课件讲解直线光栅化:说明画直线的实质是寻找最佳逼近直线的像素序列,推导DDA算法按斜率取增量并分析其浮点运算的不足,完整推导Bresenham算法的误差判别式与递推公式,并用整数运算实现快速画线。
计算机图形学讲义 第2章 基本图形的生成与计算—直线的生成
2.1 直线的生成算法
画一条从 (x1,y1) 到 (x2,y2) 的直线,实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这过程也称为直线光栅化。
直线光栅化
2.1.1 直线 DDA 算法
设直线的起点坐标为 P1 (x1,y1),终点坐标为 P2 (x2,y2),则直线的斜率可由此确定。
表2.1 8个象限中的坐标增量值:按照从 (x1,y1) 到 (x2,y2) 方向不同,分 8 个象限(图2.1)。对于方向在第 1a 象限内的直线,取增量值 Dx = 1,Dy = m;对于方向在第 1b 象限内的直线,取增量值 Dy = 1,Dx = 1/m。
| 象限 | |dx| > |dy|? | Dx | Dy |
|---|---|---|---|
| 1a | true | 1 | m |
| 1b | false | 1/m | 1 |
| 2a | true | −1 | m |
| 2b | false | −1/m | 1 |
| 3a | true | −1 | −m |
| 3b | false | −1/m | −1 |
| 4a | true | 1 | −m |
| 4b | false | 1/m | −1 |
DDA算法的实现:研究表中的数据,可以发现两个规律:
此处的讨论先将直线方向限于 1a 象限(图2.1),在这种情况下,当直线光栅化时,x 每次都增加 1 个单元,即 xi+1 = xi + 1,而 y 的相应增加值应当小于 1。为了光栅化,yi+1 只可能选择图2.2中两种位置之一。
2.1.2 直线 Bresenham 算法
yi+1 的位置选择 yi+1 = yi 或者 yi+1 = yi + 1,选择的原则是看精确值 y 与 yi 及 yi+1 的距离 d1 及 d2 的大小而定。计算公式为:
y = m(xi + 1) + b(2.1) d1 = y − yi(2.2) d2 = yi+1 − y(2.3)
如果 d1 − d2 > 0,则 yi+1 = yi + 1,否则 yi+1 = yi。将式 (2.1)、(2.2)、(2.3) 代入 d1 − d2,再用 dx 乘等式两边,并以 Pi = (d1 − d2) dx 代入上述等式,得:
Pi = 2xi·dy − 2yi·dx + 2dy + (2b − 1) dx(2.4)
由于在 1a 象限 dx 总大于 0,所以 Pi 仍旧可以用作判断符号的误差。Pi+1 = Pi + 2dy − 2(yi+1 − yi) dx(2.5)
求误差的初值 P1:P1 = 2dy − dx。
综述上面的推导,第 1a 象限内的直线 Bresenham 算法思想如下:
计算实例
有一条直线起点为 P(1,1)、终点为 Q(5,4),用 Bresenham 算法计算出逼近该直线的像素坐标序列。
解:
Bresenham算法的实现
作业
分别用 DDA 算法和 Bresenham 算法计算出逼近两端点为 P(6,5)、Q(2,2) 的直线的像素坐标序列。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}