计算机图形学
description
Transcript of 计算机图形学
计算机图形学
武汉大学电子信息学院 王泉德[email protected]
第二章 直线 在光栅显示器的荧光屏上生成一个图形,实质上是往帧缓存寄存器的相应单元中
填入数据。 计算机生成图形时,需要绘制大量的直线,设计快速有效的直线绘制算法意义重
大。 一般来讲,水平、垂直直线和对角线能准确地画出,但要准确绘制一条斜线并不
容易。 在光栅显示器上画( x1, y1 )到( x2, y2 )的直线,实质上是确定最佳逼近直
线的象素序列。
( 1)生成的直线要直 选择最靠近直线的象素点来逼近直线。
理想绘制效果
1 、绘制直线的要求
实际绘制效果
( 2)起点和终点要准确: 在绘制直线的过程中由于受精度的影响,直线的终点与原终点有一个累积误差,导致直线的终点不准。
( 3 )直线的粗细要均匀 由于选点不均匀,造成直线粗细不均匀,直观上反映出直线的亮度不均匀。
( 4 )直线宽度应该与线段的长度和斜率无关: 要取得均匀的线段宽度,应该保持每单位长度的点数是常数。
( 5 )显示线段的速度应快:
直线的绘制是生成计算机图形的基础,其绘制速度直接影响到计算机图形生成的效率,常采用硬件来实现。
2 、直线的方程bxmy
若其始坐标和终点坐标分别为: ),( 11 yx ),( 22 yx
12
12
xx
yym
则斜率为
11 xmyb 截距为
(1)
(2)
(3)
直线的绘制算法以直线方程( 1 )、( 2 )和( 3 )式为基础。
直线的点斜式方程为:
对任何沿直线给定的 x 的增量△ x ,对应的 y 增量△ y : △y m· x﹦ △
同样,对应于 y 的增量△ y , x 的增量△ x 为: △x (1/m) y﹦ △
3 、 逐点比较法( 1 )算法的基本思想: 在绘制直线的过程中,每绘制一个点,就与原直线进行比较,根据比较的结果决定下一步的走向,这样一步一步逼近直线。保证要绘制的点尽可能的靠近直线而不发生远离直线的趋向。
偏差判别 选择象素点 终点判别
偏差计算
结束
否
( 2 )绘制思路 由当前点到下一个点的走法是只在 X 方向或 Y 方向走一步。
O
A
计算当前点偏差: =tg-tg
O
A
K1
K2
1) =0 ,点在直线上; 2) >0 ,点在直线上方,下一步走 X 方向;3) <0 ,点在直线下方,下一步走 Y 方向。
可以简化为 F Y X Y Xk k A A k
根据 计算出偏差,然后确定下一步的走向。
初始:
Fk
则 =0 ;
第一步:
第二步:
;0;11 101 YXX
;0;0 00 YX
51*57*0111 XYXYF AA
0F
;11;1 1212 YYXX
21*57*1222 XYXYF AA
假 定 起 点 为坐 标 原点偏差计算公式为:
kA
kAAkk XX
XYXYtgtgF
(7,5)A
(0,0)
偏差递推公式1 ) 时,走 X 方向一步,即0iF
;
;
;1
1
1
1
Aii
ii
ii
YFF
YY
XX
2 ) 时,走 Y 方向一步,即0iF
;
;1
1
1
1
Aii
ii
ii
XFF
YY
XX
F Y X Y Xk k A A k 偏差计算公式为:
以上讨论的是起点为原点, X 为最大步长方向的情况,对于起点是任意点,最大步长方向为其他情况下的绘制直线的偏差计算和偏差判别,可类似推导。判别终点的方法:设立计数器,计数取 X 或 Y 方向的最大增量值(计长方向),在计长方向每走一步,计数器减 1 ,只到计数器值为零为止。
O
A
2 、 DDA 算法 (Digital Differential Analyzer)
DDA 算法是建立在微分方程的基础上。由 到 的直线段满足的微分方程为:),( AA yx ),( BB yx
AB
AB
yydt
dy
xxdt
dx
因此有
AB
AB
yyt
y
xxt
x
则有
tyyy
txxx
AB
AB
)(
)(
令 ),max(
1
ABAB yyxxt
有
yyy
xxx
ii
ii
1
1
DDA 绘制的直线
t
O
A
1/15 ;
6.015
91
y
x
DDA 绘制直线的算法1. if |xb-xa|≤|yb-ya| then
计算直线在 y 方向上的增量: length=|yb-ya|
2. else 计算直线在 x 方向上的增量: length=|xb-xa|
3. 计算 x 方向的单位增量: dx=(xb-xa)/length
4. 计算 y 方向的单位增量: dy=(yb-ya)/length
5. 置初值: x=xa , y=ya
6. for i=1 to length do
begin
7. 输出点 (trunc(x), trunc(y))
8. 计算下一个点坐标 x=x+dx , y=y+dy
end
9. end of algorithm
3 、 Bresenham 算法算法的基本思想:每次迭代在增量最大方向上走一步,另一方向上是否也走,取决于计算出来的点与直线上的点的误差,根据误差决定是否走一步。即 x方向的步长总是1(斜率小于 1的情况 ), y方向是否有变化,取决于直线的理论值与假设点之间的误差值大小。例如取 X 方向为最大增量方向,则有:
,,1
1
1
x
ym
myy
xx
ii
ii
其中 <1 ;m0
绘制的直线时点的选取
riy ,
riy ,1
yi
yi+1
偏差计算
设偏差为 5.0)( ,11 riii yyx
当 时,计算的点(实际直线上的点)在 中点的上方,取当 < 0 时,计算的点(实际直线上的点)在 中点的下方,取
0)( 1 ix
)( 1ix
1,,1 riri yy
riri yy ,,1
整理后,有
0)(
0)(11
1,
1,,1
1
iri
iriri
ii
xy
xyy
xx
riy ,
riy ,1
yi
yi+1
偏差的递推关系5.0)( ,11 riii yyx误差
因为 myy ii 1
有
0)()(
0)(1)(
0)(5.0
0)(5.0)1(
5.0
5.0)(
,1
,1
,
,11
ii
ii
irii
irii
rii
riii
xmx
xmx
xmyy
xmyy
ymy
yyx
偏差初值 0=m - 0.5
将乘以 2x记为﹦ 2x ,则同有相同的符号,根据的符号确定象素点的过程仍然正确。此时偏差的表示式做如下变动:初始误差项: 0 2﹦ x 0
﹦ 2y-x ;积累误差 k+1 ﹦ k﹢m修改为: k+1 2﹦ x k+1
﹦2x(k﹢y/x ) ﹦2x k 2﹢ y
﹦ k 2﹢ y ;如果选取上面的象素点,积累误差还要减去 1 ,修改为: k+1 2﹦ x ( k+1 1﹣ ) ﹦ k 2﹢ y 2﹣ x
Bresenham 直线生成算法描述1. 计算 x 和 y 方向的增量: dx=|xb-xa| , dy=|yb-ya|
2. 计算递推公式的初值 d1: d=2dy-dx
3. 计算两个单位增量: incr1=2dy , incr2=2(dy-dx)
4. if(xa > xb) then 置起点为 x=xb , y=yb ,置终点为 xe=xa, ye=ya
5. else 置起点为 x=xa , y=ya ,置终点为 xe=xb , ye=yb
6. 输出起点 (x,y)
7. while(x < xe) do
8. begin9. x=x+110. if(d < 0) then d=d+incr111. else y=y+1 , d=d+incr212. 输出点 (x,y) 13. end14. end of algorithm
总结
前面所介绍的逐点比较法、数值微分法以及Bresenham 算法,它们各有优缺点。因此在使用不同的图形输出设备时要选用最适合于该设备的方法,如在绘图仪中多采用逐点比较法,在点迹技术的显示设备中多用 DDA 法和 Bresenham 算法。
4 、直线的属性任何影响图元显示方法的参数称为属性参数。线段的基本属性有线型、宽度和颜色。
线型:实线、虚线、点线等。
通过设置沿直线路径显示的实线线段的长度和间距来修改画线算法,产生各种类型的直线。
线宽:线刷子:沿着生成直线时获得的象素点,移动一把具有一定宽度的“刷子”来实现。斜率 k<=1 ,刷子设置为垂直方向,否则设置为水平方向
线的连接:一定宽度的折线段时,线段的接头处会出现缺口,典型的处理方式有:尖头,圆头和方头三种
线头:绘制具有宽度的线段,需要对线头进行处理,典型的线头有下述三种
第三章 二次曲线 圆也是图形系统中常用的元素。圆可以定义为所有以距离中心位置 为给定值 r 的点集。圆的方程为:
),( cc yx222 )()( ryyxx cc
利用这个方程,我们可以沿 x轴,从到 以单位步长计算对应的 y 值,从而得到圆周上每点的位置。
rxc rxc
可以利用圆的对称性:可以先绘制八分之一圆弧,再利用对称性绘制整个圆
1 、中点画圆算法考虑圆心在原点的圆。设函数:
222),( ryxyxF
故有 ( x,y) 位于圆边界内 ( x,y) 位于圆边界上 ( x,y) 位于圆边界外
0
0
0
),( yxF
对上述函数在每个取点步骤上,对接近圆周的两个象素点的中点进行测试来决定取点。
考虑一个四分之一圆弧从 x=0 到 x=y 的情况(第一象限的上八分之一圆弧),圆的曲率从 0变化到 -1 ,在该段弧上的正 x 方向取单位步长,并确定每一步更接近圆弧的 y 的位置。设已经取的点为 ,决策参数为:
222 )5.0()1(
)5.0,1(
ryx
yxFp
kk
kkk
),( kk yx
以此来判断下一步 的点如何取。是 还是 。
),( 11 kk yx),1( kk yx )1,1( kk yx
),( kk yx
1ky
1kx
),( 11 kk yx
故有
10
0
0
1
1
1
kkk
kkk
kkk
yyp
yyp
yyp 中点位于圆边界内中点位于圆边界上中点位于圆边界外
),( kk yx
1ky
1kx
),( 11 kk yx
222 )5.0()1(
)5.0,1(
ryx
yxFp
kk
kkk
递推决策函数
1)()()1(2
)5.0(]1)1[(
)5.0,1(
122
1
21
2
111
kkkkkk
kk
kkk
yyyyxp
ryx
yxFp
其中 的取值,决定于 的符号。kp1ky
中点画圆
圆弧上点的对称关系只画 1/8圆,其余点通过对称关系求得。
),( ii yx),( ii yx
),( ii yx
),( ii yx
),( ii xy
),( ii xy
),( ii xy
),( ii xy
象限判别在进行绘制圆弧曲线时,需要考虑轨迹点所在象限的情况,因此需要进行象限的判别。对于在坐标轴上的点,需要根据绘制圆的方向来决定。
A
B
C
D
2 、 Bresenham 算法仍然考虑圆心在原点的一个第一象限的圆弧 。对于圆弧上的点 p(x, y) ,其下一个可选择的点如图。
)2
,2
(~),0(rr
r
p p pH
DV
H H
V VD D
圆弧上点与该二点之间的关系1. H 、 D全在圆外;2. H 在圆外, D 在圆内;3. H 在圆外, D 在圆上;4. H 、 D全在圆内;
可以计算出这三点到圆心的距离与半径的差:
222
222
222
)1(
)1()1(
)1(
ryxV
ryxD
ryxH
p p pH
DV
H H
V VD D
分析:
1 )当 时,圆弧在 D 的上方,可以取的点是 H 或 D ,只要看 H 和 D两个点,哪个与圆弧的距离近。设:
0D
DHHD
0HD0HD
0HD
时, H 点距离圆弧近, H 为可取的下一个点。
表示了 H和 D点到圆弧的距离之差。
时, H 和 D 点均为可取的下一个点。
时, D 点距离圆弧近, D 为可取的下一个点。
当
p p pH
DV
H H
V VD D
2 )当 时,圆弧在 D 的下方,可以取的点是 D 或V ,只要看 D 和 V两个点,哪个与圆弧的距离近。设:
p p pH
DV
H H
V VD D
0D
DVHD
0VD0VD
0VD
时, V 点距离圆弧近, V 为可取的下一个点。
时, V 和 D 点均为可取的下一个点。
时, D 点距离圆弧近, D 为可取的下一个点。
当
3) 当 时, D 点在圆上,取 D 点。0D
3 、多边形逼近法考虑绘制圆心在 (xc, yc) ,半径为 r 的圆,一个第一象限的圆弧。对于内接正多边形顶点 Pi(xi, yi) ,其幅角为 i ,则: sin,cos ryyrxx cici
下一个顶点 Pi+1 坐标为:
)cos()()sin()(
)sin(
)sin()()cos()(
)cos(
1
1
cicic
ci
cicic
ici
yyxxy
ryy
yyxxx
rxx
只需要计算一次 sin() , cos() ,就可以递推计算其他顶点,计算一个顶点只需四次乘法。
3 、二次曲线参数拟合法研究二次曲线的参数方程以及通过已知的型值点构造二次曲线的参数拟合方法。 二次曲线的参数方程为:
]1,0[1
)(2
21
2210
ttete
tataatr
其中 是常数向量, 是常数,则 r(t)表示了二次曲线的轨迹。
210 ,, aaa21,ee
构造二次曲线已知二次曲线上的三个型值点 ,当 t=0 时,过 点,且与 相切,当 t=1 时,过 点,且与 相切。根据已知条件,可以建立方程:
321 ,, ppp
1p 3p 32 pp21 pp
1p
3p
2p
建立方程组
);()1(
)2)(()1)(2()1(
);()0(
;1
)1(
;)0(
23221
212102121'
12111101'
321
210
10
ppLee
eeaaaeeaar
ppKpeaeaar
pee
aaar
par
分类
1 )抛物线
]1,0[,)(,0 221021 ttataatree
2 )双曲线
3 )椭圆弧
]1,0[1
)(,0,12
21021
tt
tataatree
]1,0[1
)(,1,02
2210
21
t
t
tataatree
]1,0[1
)(2
21
2210
ttete
tataatr
绘制曲线 ( 步长为 0.4)
0t 4.0 8.0 1t
绘制曲线 ( 步长为 0.2)
0t 2.0 4.0 6.0 8.0 1t
绘制曲线 ( 步长为 0.1)
0t1.0
2.03.0 5.0 7.0 9.0
4.0 6.0 8.0 1t