Professional Documents
Culture Documents
5-1直线的生成 -2
5-1直线的生成 -2
光栅扫描式图形显示器:有一个点阵单元发生器,通过
控制每个点阵单元的亮度来显示一幅完整的图形。
计算机图形学 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
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 画线法
每次在最大位移方向上走一步,而另一个方向是
走步还是不走步要取决于中点误差项的判断。
计算机图形学 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 画线法
计算机图形学 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