第3章_点阵图形的基本算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 点阵图形的基本算法 3.2.3 Bresenham直线算法 1. Bresenham直线算法思路
Bresenham直线算法最初是为数字绘图仪而设计的。
它的目标是选择表示直线的最佳像素点位置。为此,该算 法根据直线的斜率确定,在x或y方向上每次递增一个单位, 而另一方向上根据理论直线段与最近像素点的距离每次的 增量为0或1。我们首先讨论直线斜率0≤m≤1, 且xe>xs时的 整数Bresenham算法,然后再推广到画任意线段的算法。
第3章 点阵图形的基本算法 当直线斜率0≤m≤1,且xe>xs时,根据式(3.2.9)有
xi 1 xi 1 yi 1 yi m
(3.2.14)
在 x xi 1 处,直线上点的坐标 y m( xi 1) b 。 该点与上、下两点 ( xi 1, yi 1) 和 ( xi 1, yi ) 的距离分别是dH和 dL:
y e x s y s xe b xe x s
(3.2.3)
那么画直线的最直观算法是: 给定直线的两个端点 坐标后,求得m和b;然后在xs≤x≤xe范围内对x均匀取整 数,利用式(3.2.1) 进行浮点乘法和加法运算,求得y 值 后再取整数值即可得到需要的直线上的像素点。
第3章 点阵图形的基本算法 最简单的改进算法是: 给定直线的两个端点坐标后, 求得 m 和b ;当 |m|≤1时,在 xs≤x≤xe范围内将 x 取整数,利
length=ABS(xe-xs); ELSE length=ABS(ye-ys); ENDIF
第3章 点阵图形的基本算法 /定义dx或dΒιβλιοθήκη Baidu中的较大值为1/ dx=(xe-xs)/length; dy=(ye-ys)/length; x=xs+0.5*SIGN(dx); y=ys+0.5*SIGN(dy); i=1; WHILE (i<length) PLOT(INTEGER(x), INTEGER(y)); x=x+dx; y=y+dy; i=i+l; END WHILE END
1 将此式与式(3.2.17)相减, 并利用 xi 1 xi 可得
(3.2.19) 再假设直线的初始端点恰好是其像素点的坐标,即
y1 m x1 b
(3.2.20)
第3章 点阵图形的基本算法 于是可得pi的初值p1: p1=2Δy-Δx (3.2.21)
这样,利用误差判别变量,并注意到每一步 x 的增
pi x (d L d H ) 2y xi 2x yi c
(3.2.17)
因此, 式中的Δx=(xe-xs)>0,pi与(dL-dH)有相同符号; Δy=ye-ys ;常数 c=2Δy+Δx(2b-1) 。 pi 的一个优点是省去了 (dL-dH) 中为了计算 m所需要的除法运算。我们知道除法运 算用硬件实现是比较复杂的。
第3章 点阵图形的基本算法
图3.5 用Bresenham 算法表示的直线 (a) 实际要求的直线及其近似点; (b) 离散化后用像素点表示的直线
第3章 点阵图形的基本算法 Procedure Bresenhamline(xs, ys, xe, ye) BEGIN dx=ABS(xe-xs); dy=ABS(ye-ys); x=xs; y=ys; s1=SIGN(xe-xs); s2=SIGN(ye-ys); If dy>dx THEN
temp=dx; dx=dy:dy=temp;
interchange=1; ELSE interchange=0; ENDIF
第3章 点阵图形的基本算法 p=2*dy-dx; FOR i=1 TO dx PLOT(x, y); IF p>=0 THEN IF interchange=1 THEN
x=x+s1;
(4) 以 单 位 步 长 增 加 x 坐 标 , 按 式 (3.2.23) 或 式
(3.2.24)计算pi。若pi <0,则下一点的y坐标不变,否则 y坐标加1。
(5) 重复步骤(4)直到x逐步增加到xe为止。
2. Bresenham直线整数伪代码描述 下面给出的是完整的整数坐标的直线Bresenham算 法。用Bresenham算法表示的直线见图3.5。
第3章 点阵图形的基本算法 (3) 如果pi<0,则有
yi 1 yi 1 pi 1 p i 2 y
该算法的主要步骤如下:
(1) 输入线段的两个端点, 分别存于(xs, ys)和(xe, ye) 中。
(2) 将第一点作为起始点, 即有(x1,y1)=(xs,ys)。
第3章 点阵图形的基本算法 (3) 分别计算 Δx 、 Δy 及 p1 ,若 p1 < 0 ,则下一点为 (x1+1,y1); 否则,下一点为(x1+1,y1+1)。
(3) 当此值为零时,真正的直线上点离上、下两个像素 点的距离相等,我们规定取( xi 1, yi ) 作为下一个直线像素点。
第3章 点阵图形的基本算法
图3.4 Bresenham直线算法示意图
第3章 点阵图形的基本算法 因此,只要利用(dL-dH)的符号就可以决定下一个像素 点的选择。如果我们定义一个新的判别式:
(2) 算法的时间复杂性, 也就是算法的速度。
(3) 算法的空间复杂性, 即算法运行过程所需要的 内存空间的大小。
第3章 点阵图形的基本算法
3.2 直线点阵转换算法
3.2.1 描绘线条图形的要求 1. 直线段要显得笔直 在理论上的直线和点阵图形中,用像素点表示出的直
线是有差别的。图 3.1(a) 表示出了一段理论直线段及所有
涉及到的像素点。显然,用所有涉及到的像素点表示的图 形不如用图 3.1(b) 中有选择的部分像素点表示的图形更像
是直线段,也显得更笔直。当然,图 3.2(a) 表示出的垂直、
水平及 45°角的直线看起来是笔直的。而图 3.2(b) 接近垂 直或水平线的直线总是呈现出一种阶梯状或锯齿状。
第3章 点阵图形的基本算法
用式(3.2.1)进行浮点乘法和加法运算, 求得y值后再取整
数值;当 |m| > 1时,则 y 先取整数,利用式 (3.2.1) 进行浮 点乘法和加法运算,求得x值后再取整数值。
可以认为直线图形上的点是由有先后顺序的一列像
素点构成的,相邻的两点应满足:
y i 1 y i m x i 1 x i
(3.2.4)
(3.2.5)
yi+1=yi+m(xi+1-xi)
第3章 点阵图形的基本算法 其中, (xi, yi)是第i步求得的像素点坐标,(xi+1, yi+1) 是第i+1步求得的像素点坐标。类似前面的分析,我们
应要求
xi 1 xi 1 yi 1 y i 1 xi 1 xi 1 yi 1 y i 1
ELSE y=y+s2; ENDIF p=p-2*dx;
ENDIF
第3章 点阵图形的基本算法 IF interchange=1 THEN y=y+s2; ELSE x=x+s1; ENDIF p=p+2*dy; NEXT i;
END
第3章 点阵图形的基本算法
3.3 圆的点阵图形扫描转换算法
1. 直角坐标方法
(3.2.11)
(3.2.12)
第3章 点阵图形的基本算法 2. 线段DDA算法的伪代码描述 下面用伪代码给出DDA算法。 Procedure DDA-line(xs, ys, xe, ye) BEGIN /求线段在两坐标轴方向改变量的较大者/
IF ABS(xe-xs)>=ABS(ye-ys) THEN
(3.2.6)
并且要求其较大者就是1。也就是说,如果 |m|≤1, 则要求 (3.2.7)
第3章 点阵图形的基本算法 如果|m|>1,则要求
xi 1 xi 1 yi 1 y i 1
(3.2.8)
事实上,式(3.2.5)表示所求直线上y值的逐步递推关系, 此式称为数字微分分析器(DDA)。于是,画直线的DDA算法 可分两种情况描述如下: (a) |m|≤1的情况:
圆也是基本图形之一。为了简单起见,假设圆的圆 心在坐标原点,半径为R,于是可得其方程为
x2+y2=R2
解出y, 得到
(3.3.1)
(3.3.2)
y R x
2
2
画出的圆如图3.6所示。
第3章 点阵图形的基本算法
图3.6 四分之一圆弧的离散表示 (a) 圆弧曲线; (b) 圆弧的离散表示
量为xi+1-xi=1就可得到如下的算法表示:
p1 2y x xi 1 xi 1
(2) 如果pi≥0, 则有
(3.2.22)
yi 1 yi 1 (3.2.23) pi 1 p i 2 y 2 x pi 2( y x )
图3.1 直线段的像素点表示 (a) 理论直线段及所有涉及到的像素点; (b) 应当选择的像素点
第3章 点阵图形的基本算法
图3.2 直线段表示亮度均匀及连续性 (a) 垂直、水平及45°角的直线段; (b) 其它直线段的像素点表示
第3章 点阵图形的基本算法 2. 线段端点位置应该准确 3. 线段亮度均匀
第3章 点阵图形的基本算法 作为整圆部分的圆弧也可利用对称性算出,只是 这时算出一段八分圆弧后不需要全部的对称点。在我
在xe-xs≥0时, 有
xi+1=xi+1, yi+1=yi+m 在xe-xs≤0时, 有 xi+1=xi-1, yi+1=yi-m (3.2.10) (3.2.9)
第3章 点阵图形的基本算法 (b) |m|>1的情况: 在ye-ys≥0时, 有
yi+1=yi+1, xi+1=xi+1/m
在ye-ys≤0时, 有 yi+1=yi-1, xi+1=xi-1/m
4. 转换算法速度快
3.2.2 增量DDA算法 1. 增量DDA算法思路 设直线的起点坐标为(xs,ys), 终点坐标为(xe, ye), 则直线的方程为
y=mx+b
(3.2.1)
第3章 点阵图形的基本算法 其中, 直线的斜率为
ye y s m xe x s
(3.2.2)
在y轴上的截距为
d H ( yi 1) y ( yi 1) m( xi 1) b (3.2.16) d L y yi m( xi 1) b yi
第3章 点阵图形的基本算法 这个差有如下几何意义(见图3.4): (1) 当此值为正时,真正的直线上点离像素点
第3章 点阵图形的基本算法 其中,函数SIGN ( )是符号函数,其表达式为:
1 SIGN ( x ) 0 1
x0 x0 x0
(3.2.13)
用DDA算法表示的直线如图3.3所示。
第3章 点阵图形的基本算法
图3.3 用DDA算法表示的直线 (a) 实际要求的直线及其近似点; (b) 离散化后用像素点表示的直线
第3章 点阵图形的基本算法 现在我们要进一步化简上述误差判别式以得到递推 公式,消除常数c。以i+1代换式(3.2.17)中的i,得到
pi 1 2y xi 1 2x yi 1 c
pi 1 pi 2y 2x ( yi 1 yi )
满足:
(3.2.18)
( xi 1, yi 1) 较 近 , 说 明 下 一 个 直 线 上 的 像 素 点 应
取 ( xi 1, yi 1) 。
( xi 像 1素 , yi 点 ) (2) 当 此 值 为 负 时 , 真 正 的 直 线 上 点 离 较近,说明下一个直线像素点应取 ( xi 1, yi ) 。
第3章 点阵图形的基本算法
第3章 点阵图形的基本算法
3.1 基本图形的点阵转换 3.2 直线点阵转换算法 3.3 圆的点阵图形扫描转换算法 3.4 椭圆点阵图形扫描转换算法 3.5 多项式曲线的算法
习 题
第3章 点阵图形的基本算法
3.1 基本图形的点阵转换
评价一个转换算法的优劣可以通过如下三个方面 来进行: (1) 所显示图形的精度。转换出的点阵图形毕竟只 是对原始图形的近似, 有一定的误差, 这个误差的大 小可根据实际需要而定。