03-第三章 直线和圆弧的生成算法(上)网络学堂_547501374
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Bresenham 直线算法
(3) Q d1=y-yk, y=m(xk+1)+b= m(xk+1)+b ∴d1= m(xk+1)+b-yk, d2=1- d1 d1-d2=d1-1+d1 =2d1-1 = 2m(xk+1)+2b-2yk-1 =2m xk -2yk+ 2m+2b-1 =2m xk -2yk+c (令c=2m+2b-1 为常数) =2(xk∆y-yk∆x)/∆x+c
d2=1-m
d1=m
y
y0
x0
x1
Bresenham 直线算法
(5)续 Q pk= ∆x(d1-d2 ) ∴ p0= ∆x(d1-d2 ) 又 Q d1=m, d2 =1-m ∴ p0= ∆x(d1-d2 ) = ∆x(m-1+m) = ∆x(2m-1) = ∆x(2∆y/∆x -1) = 2∆y-∆x
也有利于硬件电路的实现(集成电路)
Bresenham 直线算法
举例: 从(20, 10)到(30, 18)画一条直线 解: Q ∆x=30-20=10, ∆y=18-10=8 0<∆y<∆x ⇒ 0<m<1 ∴ p0=2∆y-∆x=6 2∆y=16, 2∆y-2∆x=- 4 x0=20, y0=10,
Bresenham 直线算法
(6) 整理 初始条件 x0=xs, y0=ys, p0= 2∆y-∆x 如果 pk<0 则 xk+1 =xk+1, yk+1=yk, pk+1=2 ∆y+ pk 否则 xk+1 =xk+1, yk+1=yk+1, pk+1=2 (∆y- ∆x) + pk
上面的式子中2 ∆y, 2 (∆y- ∆x)是常数,利用移位计算即 可,剩下的只有加法和逻辑判断,运算量极少。 非常适合于单片机实现!!!
Bresenham 直线算法
(4)续 如果 pk<0 则xk+1 =xk+1, yk+1=yk 从而有pk+1= 2 ((xk+1)∆y-yk∆x)+c∆x =2 ∆y+ 2 (xk∆y-yk∆x)+c∆x = 2 ∆y+ pk 关键是求pk的起始值p0
Bresenham 直线算法
(5)
y0 + 1
§ 2. 直线的快速生成 已知线段的两个端点: 起始点(xs, ys)和结束点(xe, ye). 求: 离散线段的中间各点.
(xe, ye)
(xs, ys)
2.1 利用直线方程直接求
Ye − Ys Yi = ( X i − X s ) + Ys Xe − Xs
有乘除法, 不适合于没有乘法运算器的普通处理器 要尽量避免乘除法
主要方法: Bresenham算法
yk + 1
d2
模 拟 线
d1
当前点Leabharlann yykxk
x k +1
图中0<m<1
Bresenham 直线算法
推导: (1) Q 0<m<1 ∴ xk+1 =xk+1 关键求yk+1 (2) 如果d1<d2, 则yk+1=yk; 否则 yk+1=yk+1. 比较d1和d2的大小,或看d1-d2与0的关系即可
关键问题:怎样只用加减法?
直线和圆弧的生成算法
把 线 段 放 大
观察结论:在X,Y方向上,必有一个方向上的间距始终为“1” 而另一个方向上或者为0, 或者为1. 取决于: 斜率.
2.2 DDA(Digital Differential Analyzer)算法 设所画直线的斜率m有0<m<1,则相邻点有: ∆x=1, ∆y=m 于是: xk+1 =xk+1 yk+1=yk+m
第三章 直线和圆弧的生成算法
§1 引言 (1) 版画 (2) 看图释义 (3) 再看一个手机界面
直线和圆弧的生成算法
上述演示的结论: (I) 线条是最基本的图形,用途广 (II) 纯粹的线条组合也产生美 (III) 人工书写---->计算机产生 (IV) 有些是纯艺术,但计算机也可以产生 (V) 图形设备将越来越被广泛使用 这里讲直线与圆弧在计算机中的快速生成方法,
除了浮点运算外,该方法有一个缺点. 是什么? 误差累积问题!
2.3 Bresenham算法 仍借助于DDA算法中的一个结论: 在离散的空间中, 对一条线段而言,相邻两个点必 有一个方向上其坐标值相差为1 再借助于另一个结论:看另一个方向上的模拟增 量是否大于1/2,从而判断下一步在这个方向上是 增1还是不变。 引入迭代法
下面通过实际画图法进行比较
18
10 20 30
Bresenham 直线算法
讨论: 1)还能不能对Bresenham进行加快? (a:对算法本身; b: 在该算法基础上改进 ) 2)怎样利用线条对灰度图像进行表示?(素描) (利用点来表示灰度图像的算法称为Halftone 素描中一般采用线条组合来凸现立体感) 3)直线离散生成的逆过程
(3)续 上式两边都乘∆x, 从而有:∆x(d1-d2 )=2 (xk∆y-yk∆x)+c∆x 又Q ∆x>0 ∴ ∆x(d1-d2 )与(d1-d2 )正负性一致 只要判断∆x(d1-d2 )的正负性即可求出yk+1 但 (1)怎样处理c∆x? (2)是否还要计算两个乘法(xk∆y-yk∆x)?
Bresenham 直线算法
根据已知条件求出斜率:
y e − y s ∆y m= = x e − x s ∆x
并假设当前点为第k个点,其坐标(xk, yk)已经求出 问题转化为: 求第k+1个点(xk+1, yk+1)
我们将以0<m<1为例进行推导,其他的情况可 以利用对称关系得到。
Bresenham 直线算法
Bresenham 直线算法
k 0 1 2 3 4 5 6 7 8 9 pk 6>0 6-4=2>0 2-4=-2<0 -2+16=14>0 14-4=10>0 10-4=6>0 6-4=2>0 2-4=-2<0 -2+16=14>0 14-4=10>0 Xk+1 21 22 23 24 25 26 27 28 29 30 Yk+1 10+1=11 11+1=12 12 12+1=13 13+1=14 14+1=15 15+1=16 16 16+1=17 17+1=18
Bresenham 直线算法
(4) 令pk= ∆x(d1-d2 )=2 (xk∆y-yk∆x)+c∆x (c∆x与k无关!) 则判断pk的正负性即可求出yk+1 利用迭代法 根据pk可以推出pk+1= 2 (xk+1∆y-yk+1∆x)+c∆x 如果: pk >0 则xk+1 =xk+1, yk+1=yk+1 从而有pk+1= 2 ((xk+1)∆y-(yk+1)∆x)+c∆x =2 (∆y- ∆x)+ 2 (xk∆y-yk∆x)+c∆x = 2 (∆y- ∆x)+ pk