Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 50

第 5 章 基本图形生成算法

 光栅扫描式图形显示器:有一个点阵单元发生器,通过
控制每个点阵单元的亮度来显示一幅完整的图形。

计算机图形学 1
第 5 章 基本图形生成算法
 与 CRT 类似,液晶显示器, LED 显示器也都有一个点
阵单元发生器(像素点阵)。

一组荧光小点

一组亚像素 像素点阵

计算机图形学 2
第 5 章 基本图形生成算法
 图形的生成:是在指定的输出设备上,根据坐
标描述构造二维几何图形(点、直线、圆、椭
圆、多边形域、字符串及其相关属性等)。
 图形的扫描转换:在光栅显示器等数字设备上
确定一个最佳逼近于图形的像素集的过程。逼
近的过程就是连续量向离散量的转换。

计算机图形学 3
第 5 章 基本图形生成算法
 图形的扫描转换(图形的
光栅化)分为两步:
 第一步:根据图形的定义
在点阵单元上确定最佳逼
近于图形的像素集。
 第二步:给像素指定合适
的颜色值。

计算机图形学 4
第 5 章 基本图形生成技术

 5.1 直线段的扫描转换算法

 5.2 圆的扫描转换算法

 5.3 椭圆的扫描转换算法

 5.4 多边形的扫描转换与区域填充

 5.5-5.7 字符处理、属性处理、反走样

计算机图形学 5
第 5 章 基本图形生成技术
约定: 为像素点阵建立坐标系

建立
坐标系

计算机图形学 6
像素点的扫描转换
输入:点的坐标
输出:像素点的位置

P(3.6,4.7)

计算机图形学 7
5.1 直线段的扫描转换
 直线的绘制要求
( 1 )直线要直;

计算机图形学 8
5.1 直线段的扫描转换
 直线的绘制要求
( 2 )直线的端点要准确,无定向性无断裂;

计算机图形学 9
5.1 直线段的扫描转换
 直线的绘制要求
( 3 )直线的亮度、色泽要均匀;
( 4 )画线的速度要快;
( 5 )具有不同的色泽、亮度、线型等。

计算机图形学 10
5.1 直线段的扫描转换
直线是最基本的图形,一个动画或真实感图形
往往需要调用成千上万次画线程序,因此直线算
法的好坏与效率将直接影响图形的质量和显示速
度。

为了提高效率,把计算量减下来,关键问题就
是如何把乘法取消?
计算机图形学 11
5.1 直线段的扫描转换算法

 DDA 算法

 中点画线法

 Bresenham 画线算法

计算机图形学 12
一、数值微分法 (DDA)
 数值微分法( Digital Differential Analyzer,
DDA )直接从直线的微分方程生成直线。
 假定直线的起点、终点分别为:
P0 ( x0,y0), P1(x1,y1) ,且都为整数。
 我们可以得到直线的微分方程:
dy Δy y1  y 0
  k
dx Δx x1  x 0

计算机图形学 13
一、数值微分法 (DDA)
基本思想—增量思想

计算机图形学 14
一、数值微分法 (DDA)

 这个式子的含义是:当前步的 y 值等于前一
步的 y 值加上斜率 k

 这样就把原来一个乘法和加法变成了一个加
法!
计算机图形学 15
一、数值微分法 (DDA)
 例:画直线段 P0(0,0)--P1(5,3)

x int(y+0.5) y
0 0 0
1 1 0+0.6
2 1 0.6+0.6
3 2 1.2+0.6
4 2 1.8+0.6
5 3 2.4+0.6

计算机图形学 16
一、数值微分法 (DDA)- 习题 1
习题 1 : x int(y+0.5 y
)
画直线段: 0 0 0
P0(0,0)--P1(8,6) 1 1 0.75
2 2 1.5
x int(y+0.5) y 3 2 2.25
4 3 3
5 4 3.75
6 5 4.5
7 5 5.25
8 6 6

计算机图形学 17
一、数值微分法 (DDA)
 思考题: DDA 画直线算法: x 每递增 1 ,
y 递增斜率 k 。是否适合任意斜率的直线?
 对于 P0 ( 0, 0), P1(2,5)
K=5/2=2.5 > 1

x int(y+0.5) y
0 0 0
1 3 0+2.5
2 5 2.5+2.5

计算机图形学 18
一、数值微分法 (DDA)
 思考题: DDA 画直线算法: x 每递增 1 ,
y 递增斜率 k 。是否适合任意斜率的直线?
 对于 P0 ( 0, 0), P1(2,100)
用多少个点来表示?

3
计算机图形学 19
一、数值微分法 (DDA)

其实,上述分析的算法仅适用于 k ≤1 的情形。
在这种情况下, x 每增加 1,y 最多增加 1 。

当  k 1 时,必须把 x , y 地位互换
计算机图形学 20
一、数值微分法 (DDA)
DDA 算法原理:通过在当前位置( xi,yi )分别加
上两个小增量来求出下一点 (xi+1,yi+1) 的 x,y 坐标。
xi 1  xi    x
yi+1
yi 1  yi    y
y
ε△y
yi

令 ε=1/max(|△x|,|△y|) xi ε△x xi+1

x
使得 ε△ x 或者 ε△ y 中会有一个变成单位步长
算法在最大位移方向上,每次总是走一步 .
计算机图形学 21
一、数值微分法 (DDA)

第一种情况:
 max(|△x|,|△y|)=|△x| ,即 |k|≤1 的情况:
1
xi 1  xi    x  xi   x  xi  1
x
1
yi 1  yi    y  yi   y  yi  k
x

计算机图形学 22
一、数值微分法 (DDA)

第二种情况:
 max(|△x|,|△y|)=|△y| ,此时 |k|≥1 :

1 1
xi 1  xi    x  xi   x  xi 
y k
1
yi 1  yi    y  yi   y  yi  1
y

计算机图形学 23
数值微分 (DDA) 法
void DDALine(int x0,int y0,int x1,int y1,int color)
 int dx,dy,max1,i ;
float x, y, xIncre,yIncre;
dx=x1-x0; dy=y1-y0;
x=x0; y=y0;
if(abs(dx)>abs(dy)) max1=abs(dx);
else max1=abs(dy);
xIncre=(float)dx/(float)max1;
yIncre=(float)dy/(float)max1;
for (i=0; i<=max1; i++)
 setpixel (int(x+0.5), int(y+0.5), color);
x+= xIncre; y+= yIncre;

计算机图形学 24
一、数值微分法 (DDA)
 思考题: DDA 画直线算法: x 每递增 1 ,
y 递增斜率 k 。是否适合任意斜率的直线?
 对于 P0 ( 0, 0), P1(2,5)
K=5/2=2.5 > 1

x int(y+0.5) y
0 0 0
1 3 0+2.5
2 5 2.5+2.5

计算机图形学 25
一、数值微分法 (DDA)
 思考题: DDA 画直线算法: x 每递增 1 ,
y 递增斜率 k 。是否适合任意斜率的直线?
 对于 P0 ( 0, 0), P1(2,5) x int(x+0.5) y
K=5/2=2.5 > 1 0 0 0
0.4 0 1
0.8 1 2
1.2 1 3
1/K=0.4 1.6 2 4
2 2 5

计算机图形学 26
一、数值微分法 (DDA)
 增量算法:在一个迭代算法中,如果每一步
的 x 、 y 值是用前一步的值加上一个增量来
获得,则称为增量算法。
 直观、易实现
 不利于硬件实现: x 、 y 是 float ,且每
一步都必须对 x 或者 y 进行舍入取整,效
率太低。
 如何改进?
计算机图形学 27
在 DDA 算法的基础上如何改进?
( 1 )改进效率。这个算法每步只做一个
加法,能否再提高效率?

一般情况下 y 都是小数,而且每一步运算都
要对 y 进行四舍五入后取整。
能否把浮点运算变成整数加法?

计算机图形学 28
在 DDA 算法的基础上如何改进?
( 2 )从直线方程的类型入手

而直线的方程有许多类型,如两点式、一般式
等。如用其它的直线方程来表示这条直线会不
会有出人意料的效果?

计算机图形学 29
二、中点 Bresenham 画线法
 直线的斜截式方程:
y=kx+b

 直线的一般式方程:
F(x,y) =Ax+By+C=0
其中:

计算机图形学 30
二、中点 Bresenham 画线法

 位于直线上的点: F(x,y)=0
 对于直线上方的点: F(x,y)>0
 对于直线下方的点: F(x,y)<0
计算机图形学 31
二、中点 Bresenham 画线法
每次在最大位移方向上走一步,而另一个方向是
走步还是不走步要取决于中点误差项的判断。

假定: 0≤ k≤1 。因此,每次在 x 方向上加


1 , y 方向上加 1 或不变需要判断。

计算机图形学 32
二、中点画线法

 当 M 在 Q 的下方,则 Pu 离直线近,应为下
一个像素点
 当 M 在 Q 的上方,应取 Pd 为下一点

计算机图形学 33
二、中点画线法

 如何判断中点 M 在直线的上方还是下方?

计算机图形学 34
二、中点画线法

把 M 代入理想直线方程:
di=F(M)=F(xi+1,yi+0.5)
=A(xi+1)+B(yi+0.5)+C
计算机图形学 35
二、中点 Bresenham 画线法
di=F(M)=F(xi+1,yi+0.5)
=A(xi+1)+B(yi+0.5)+C
当 d<0 时: M 在 Q 下方,应取 Pu
当 d>0 时: M 在 Q 上方,应取 Pd
当 d=0 时: M 在直线上,均可。

计算机图形学 36
二、中点 Bresenham 画线法
下面来分析一下中点画线算法的计算量?

复杂的计
算过程

为了求出 d 值,需要两个乘法,四个加

计算机图形学 37
二、中点 Bresenham 画线法

能否也采用增量计算,提高运算效率呢?

计算机图形学 38
二、中点 Bresenham 画线法
如何推导出 d 值的递推公式?

计算机图形学 39
二、中点 Bresenham 画线法

计算机图形学 40
二、中点 Bresenham 画线法

计算机图形学 41
二、中点 Bresenham 画线法

下面计算 d 的初始值 d0 ,直线的第一个像素


P0(x0,y0) 在直线上,因此相应的 d 的初始值计算如
下:
计算机图形学 42
二、中点 Bresenham 画线法

计算机图形学 43
二、中点 Bresenham 画线法

可以用 2d 代替 d 来摆脱浮点运算,写出
仅包含整数运算的算法。
计算机图形学 44
二、中点 Bresenham 画线法

2( )
2

d0=2A+B

可以用 2d 代替 d 来摆脱浮点运算,写出
仅包含整数运算的算法。
计算机图形学 45
中点 Bresenham 画线法
void Midpoint Line (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;
setpixel(x, y, color);
while (x<=x1)
{ if (d<0) {x++; y++; d+=d2; }
else {x++; d+=d1;}
setpixel (x, y, color);
} /* while */
} /* mid PointLine */

计算机图形学 46
二、中点 Bresenham 画线法
 例:画直线段 P0(0,0)--P1(5,3)
A=-3 B=5 d0= -1
d1=2(A+B)=4 d2=2A=-6
x y d
0 0 -1
1 1 3
2 1 -3
3 2 1
4 2 -5
5 3 -1
计算机图形学 47
二、中点 Bresenham 画线法 - 习题 2
习题 2 : x y d
0 0 -4
画直线段:
1 1 0
P0(0,0)--P1(8,6) 2 1 -12
3 2 -8
x y d
4 3 -4
5 4 0
6 4 -12
7 5 -8
8 6 -4

计算机图形学 48
二、中点 Bresenham 画线法
思考题:

当 k>1 时,直线的绘制过程(原理、
误差函数、递推公式)

计算机图形学 49
三、 Bresenham 画线算法
 DDA 把算法效率提高到每步只做一个加法。

 中点算法进一步把效率提高到每步只做一个整
数加法。

 Bresenham 提供了一个更一般的算法。该算
法不仅有好的效率,而且有更广泛的适用范围

计算机图形学 50

You might also like