计算机图形学4

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8
4.1 直线生成算法
4.1.1 数值微分法(DDA Digital Differential Analyzer) 例1:
用DDA方法绘制两点
直线段过程:
P0( 0, 0 )和 P1( 5, 2 )的
9
4.1 直线生成算法
4.1.1 数值微分法(DDA Digital Differential Analyzer) 注意:

20
4.1 直线生成算法
4.1.3 Bresenham画线算法 改进的整数程序:
void InterBresenhamline (int x0,int y0,int x1, int y1, int color) { int i, x, y, dx, dy, e; dx = x1-x0; dy = y1- y0; e=-dx; x=x0; y=y0; for (i=0; i<=dx; i++) { putpixel (x, y, color); x++, e=e+2*dy; if (e>=0) { y++; e=e-2*dx;} } }
14
4.1 直线生成算法
4.1.2 中点画线法 例2: 用中点画线法方法绘制两点 P0( 0, 0 ) 和 P1( 5, 2 )的直线段过程:
a=y0 -y1=-2; b=x1-x0=5; d0=2*a+b=1; d1=2*a=-4; d2=2*(a+b)=6 。
15
4.1 直线生成算法
4.1.2 中点画线法
线的粗细不一; 线的亮度差异。
);
直线的生成要求
直线要直; 直线的起、终点要准; 直线粗细要均匀;
有限个象素构成的直线
速度要快。
3
4.1 直线生成算法
直线的光栅图像
4
4.1 直线生成算法
生成直线的算法很多,本节我们介绍一个象素宽直线
的三个常用生成算法:
数值微分法(DDA);
中点画线法;
Bresenham算法。
5
4.1 直线生成算法
4.1.1 数值微分法(DDA Digital Differential Analyzer)
一种从直线的微分方程出发生成直线的方法,其本质是用数值
法解微分方程。 假定直线的起点、终点分别为: (x0,y0), (x1,y1), 且都为整数。
上述分析的算法仅适用于
k ≤1的情形。在这种情况下,x
每增加1,y 最多增加1。 当 k 1 时,必须把x,y地位互换,y每增加1,x相应增加 1/k。 在这个算法中,y与k必须用浮点数表示,而且每一步都要对 y进行四舍五入后取整。这使得它不利于硬件实现。
10
4.1 直线生成算法
19
4.1 直线生成算法
4.1.3 Bresenham画线算法 讨论:

由于:
处理中用到浮点数0.5, 用到除法计算
k, k = Δy / Δx。
速度较慢,不利于硬件实现。 考虑到只需通过判别 e 的符号,确定像素的取舍 ,因此可令 e’ = 2 × e × Δx, e > 0 ==> e’ > 0; e < 0 ==> e’ < 0。 通过判别 e’ 的符号确定像素取舍,避免了浮点运 算与除法计算,有利于硬件实现;

由于只判别d 的符号确定下一个像素位置,因此 可以用2d来判别,化为整数算法 递推算法中只包含加、减运算,便于硬件实现:
16
4.1 直线生成算法
4.1.3 Bresenham画线算法

Bresenham(柏森汉)算法是计算机图形学领域使 用最广泛的直线算法。该方法类似于中点法,由误 差项符号决定下一个象素取右边点还是右上点。 思路:考虑利用增量计算,使得对像素的每一列只 要检查一个误差项的符号,就可以确定该列所求像 素。 采用增量计算,有利于硬件实现。 Bresenham画线算法还可以拓展到画圆等。
7
4.1 直线生成算法
4.1.1 数值微分法(DDA Digital Differential Analyzer) 程序实现:
DDALine (x0,y0, x1, y1,Color) int x0, y0, x1, y1,Color; { int x; float dx,dy,k,y; dx=x1-x0; dy=y1-y0; k=dy/dx; y= y0; for(x= x0; x<= x1; x++) { putpixel(x, (int)(y+0.5), Color); y=y+k; } }
2
4.1 直线生成算法
在数学上,理想的直线是没有宽度的,由无数个点构
成的集合。 在生成直线时,只能在显示器所给定的有限个象素组 成的矩阵中,确定最佳逼近于该直线的一组象素,并 将这些象素置为相应的颜色值(亮度)。 生成直线时会有一些问题,如有图所示:
阶梯状(锯齿、走样(aliasing)
10 20 21 22 23 24 25 26 27 28 29 30
22
习题:
1. 按照中点划线算法,确定直线(0,0)(8,5) 的点亮象素。列出计算过程,并列出所选象素 坐标。 2. 实现可以画出任意斜率的直线的Bresenham画线 算法。
23
4.2 圆与椭圆的生成算法
4.2.1 圆的特征
圆:到给定中心位置(xc, yc)距离为r的点的集合。 圆的方程: x 2 y 2 R 2 (只考虑圆心在原点的圆)
y R x
2 2
(x,y)
对称性:若已知圆弧上一点( x,y),可以得到其关于四条对 称轴的其它7个点,这种性质 称为八对称性。 只要生成八分之一圆弧,就可 以求出整个圆弧的象素集。
13
4.1 直线生成算法
4.1.2 中点画线法
中点画线算法程序:
void MidpointLine (int x0, int y0, int x1, int y1, int color) { int a, b, d1, d2, d, x, y; a=y0-y1; b=x1-x0; d=2*a+b;d1=2*a; d2=2* (a+b); x=x0; y=y0; putpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} putpixel (x, y, color); } /* while */ } /* mid PointLine */
21
4.1 直线生成算法
4.1.3 Bresenham画线算法 例3:用 Bresenham 法画直线(20,10)和(30,18)。

解: Dx = 10, Dy = 8, k = Dy / Dx = 0.8, 2 Dy = 16, 2 Dy-2Dx =- 4 e0 = 2 Dy - Dx = 6。 画初始点(20, 10), 并根据判别式确定沿线段路径的后续像素 位置如下表:
4.1.2 中点画线法 原理:

假定直线斜率k<1, 当前象素点为(xp, yp), 下一象素点可有两种选择: p1(xp+1, yp) p2(xp+1, yp+1)。 若M=(xp+1, yp+0.5),为 p1 与 p2之中 点,Q为理想直线与 x=xp+1垂线的交 点。 当M在Q的下方,则下一象素点应为 P2 ; 当M在Q的上方,则下一象素点应为 应取P1 。



17
4.Biblioteka Baidu 直线生成算法
4.1.3 Bresenham画线算法
原理:
假定直线斜率0<k<1,起点坐标为(x,y),误差项d = 0; 下一象素可能是:右方像素(x+1, y); 或右上方像素(x+1,y+1)。 考察误差项d,d = d+k, 当d>1 时 d=d-1,保证0< d <1; 当d > = 0.5 时, 直线接近右上方像素; d < 0.5 时,直线接近右方像素。 令 e = d - 0.5, 则当e >= 0, 取右上方像素, (x+1, y+1) d d 当 e < 0, 取右方像素 d d e 的初始值为-0.5。
P2
Q M
P1
P(Xp, Yp) 中点画线法原理
11
4.1 直线生成算法
4.1.2 中点画线法
算法实现:
假设直线的起点、终点分别为:(x0,y0), (x1,y1) 该直线方程可表示为: F(x,y)=a*x+b*y+c (1) 其中: a=y0-y1, b=x1-x0, c=x0*y1-x1*y0 当: F(xt,yt) = 0 点(xt,yt) 在直线上; F(xt,yt) < 0 点(xt,yt) 在直线下方; F(xt,yt) > 0 点(xt,yt) 在直线上方。 因此:将中点M坐标代入(1)式,并判断其符号即可确定 象素点的选取。构造如下判别式: d = F(M)=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c 由上式可看出,d是x,y线性函数,可推导d的增量公式。
。 。
(X i , Yi)

栅格交点表示象素点位置

(X i+1 ,Yi + k)
(X i , Int(Yi +0.5))
6
4.1 直线生成算法
4.1.1 数值微分法(DDA Digital Differential Analyzer)
直线的斜率: k = (y1- y0) / (x1- x0) 为讨论方便,假定 |k| ≤ 1, 直线方程: y = k* x +B 设X的增量为Δ x =1,可得如下y的增量方程: y i+1 = k x i+1 + B = k (x i + Δx) + B = k x i + B + kΔ x = y i + kΔ x = yi+k 即:当x每递增1,y递增k(即直线斜率);

x, y (x+1, y)
18
4.1 直线生成算法
4.1.3 Bresenham画线算法 程序:

void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int i, x, y, dx, dy; float k, e; dx = x1-x0; dy = y1- y0; k=dy/dx; e=-0.5; x=x0; y=y0; for (i=0; i <=dx; i++) { putpixel (x, y, color); x=x+1;e=e+k; if (e>=0) { y++; e=e-1;} } }
12
4.1 直线生成算法
4.1.2 中点画线法
算法实现:(续)
当d>= 0时,取象素P1,此时再下一个象素的判别式为: d1 = F(xp+2, yp+ 0.5)=a(xp + 2)+b(yp + 0.5)+c = a(xp + 1)+b(yp + 0.5)+c +a = d + a; 当d < 0 时, 取象素P2,此时再下一个象素的判别式为: d2 = F(xp + 2, yp + 1.5)=a(xp + 2)+b(yp + 1.5)+c = a(xp + 1) + b(yp + 0.5)+c +a +b = d + a + b; d的初始值可按下式计算: d0 = F(x0+1, y0+0.5) = a(x0 +1)+b(y0 +0.5)+c = F(x0, y0)+a+0.5b = a+0.5b 由于只用d 的符号作判断,为了只包含整数运算, 可取2d 代替 d,这样可得如下中点算法程序:
i 0 1 2 3 4 5 6 7 8 9 e’ i 6 2 -2 14 10 6 2 -2 14 10 (x i+1,yi+1) (21,11) (22,12) (23,12) (24,13) (25,14) (26,15) (27,16) (28,16) (29,17) (20,18)
19
18 17 16 15 14 13 12 11
第四章
基本图形生成算法
1
第四章 基本图形生成算法
光栅图形显示器可以看作一个象素的矩阵,可直接显
示二维图形。 二维图形的基本类型有:
直线; 圆、圆弧,椭圆、椭圆弧; 区域填充; 文本; 平面曲线等。
二维图形生成技术(算法)即是根据图形的矢量描述
,找出逼近此图形的一组象素,按扫描线顺序,对这 些象素进行写操作。(有些书将此过程称为图形的扫 描转换或光栅化)。 直线生成算法是二维图形生成技术的基础。
相关文档
最新文档