You are on page 1of 27

第 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

You might also like