计算机图形学 - dalian maritime...

Post on 22-Jan-2020

13 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

任鸿翔 dmu_rhx@163.com

大连海事大学航海学院航海动态仿真与控制室

0411-84729651

计算机图形学

掌握计算机图形学的基本理论、算法

掌握三维图形的显示流程和基本变换

学习目的

教材及参考书

《计算机图形学》(第3版) 蔡士杰译 电子工业出版社

《Computer Graphics with OpenGL》3rd Edition, Donald Hearn, Prentice Hall

《计算机图形学》 孙家广编 清华大学出版社

一、定义

计算机图形学(Computer Graphics)是研究通过计算机将数据转换

为图形,并在专门的显示设备上显示的原理、方法和技术的学科。

二、研究内容

图形输入、输出设备与技术

图形的生成和表示技术

图形操作与处理方法

图形信息的描述和表示

几何模型的构造技术

动画技术

图形实时性和真实感

第一章 计算机图形学综述

A picture is worth a thousand words.

硬件 (大->小)

五十年代 MIT — Whirlwind Computer (准备期)

六十年代 Ivan Sutherland -- Sketchpad绘图系统 (发展期)

七十年代 中型机、小型机 (实用化)

八十年代 图形工作站 (推广应用期)

九十年代 PC+图形加速卡 (普及和广泛应用期)

四、发展史

三、相关学科

模型或数据

数字图像

计算机图形学

模式识别

图像处理

计算几何

五、应用

软件 (从非标准->标准化;从与设备相关->与设备无关)

七十年代 ACM SIGGRAPH -- 3D Core Graphics System

八十年代 ISO -- GKS

ANSI -- PHIGS

SGI – GL

九十年代 OpenGL

DirectX

图和表

计算机辅助设计

虚拟现实环境

娱乐

图像处理

图形用户界面

数据可视化

教学和培训

计算机艺术

大连海事大学大型船舶操纵模拟器

Marine Simulator (CCTV-1)演示

Marine Simulator (Under-sea)演示

Marine Simulator (Wuhan-harbour)演示

Cloth Simulation演示

Fractal Terrain 演示

六、应用程序演示

第二章 图形学数学基础

1 向量

2 矩阵

3 齐次坐标

2.1 向量

向量具有两个基本特性:大小和方向。设有两个三维向量V1(x1,y1,z1),V2(x2,y2,z2)

向量的长度(大小)

21

21

211 zyxV

数乘向量

称为 的单位化向量1

1

VV

1V

),,( 1111 zyxV 为实数

向量和

),,(),,(),,(

212121

22211121

zzyyxxzyxzyxVV

V1

2V

1V + V 2

x

y

图 21 VV

向量的点积

2121212121 cos zzyyxxVVVV 为两向量之间的夹角

2121 0 VVVV

点积满足分配律、交换律和结合律

图 21 VV

向量的叉积

2121 0 VVVV

叉积满足分配律,不满足交换律和结合律

1221 VVVV 3121321 )( VVVVVVV

)()( 321321 VVVVVV

平行

垂直/平行 多边形的方向 多边形的凸凹性

P1 P2

P3

P4

P1 P2

P3

P4

P5

2.2 矩阵

其中 被称为A的第i行第j列元素, 称为第i个行向量, 称为第j个列向量,如果 称A为n阶矩阵或n阶方阵。

阶矩阵A定义为:nm

ijanm

矩阵的加法:

数乘矩阵:

矩阵的乘法:

nmijnppmnm cBAC )(

矩阵中的元素

p

kkjikij bac

1

ACABCBA )(矩阵的乘法满足分配律、结合律,不满足交换律

)()( BCACABABC BAAB

矩阵的转置:

TTTTTTTT ABABBABAAA )(,)(,)(

矩阵的逆:对于一个n阶方阵A,如果存在一个n阶方阵B,使得AB=BA=In(单位矩阵),则称B是A的逆,记为

2.3 齐次坐标

所谓齐次坐标就是用n+1维向量来表示n维向量,如向量用齐次坐标表示为 ,其中h为非0实数。显然一个向量的齐次坐标表示是不唯一的。

),,,( 21 nxxx

),,,,( 21 hhxhxhx n

第三章 输出图元

3.1 线段的扫描转换

3.2 圆的扫描转换

3.3 椭圆的扫描转换

3.4 区域填充

3.5 线段的裁剪

3.6 多边形的裁剪

3.7 反走样

对图形的扫描转换一般分两个步骤:

在光栅显示器上显示的任何一种图形,实际上都是一个象素的集合(具有一种或多种颜色)。显示一个图形的过程就是确定一个象素集合及其颜色过程,这个过程称为图形的扫描转换(或光栅化)。

1.先确定有关象素;

2. 再对象素进行写操作(如颜色等)。

33.1.1 线段的扫描转换线段的扫描转换

理想线段:

没有宽度无数个点

屏幕上显示(扫描转换)的线段:

一个象素宽度有限个象素点

显示器显卡

帧缓存 屏幕

存储位

象素

图3-1

bxmy

12

12

xxyym

11 xmyb

),( kk yx

11 kk xxmymbmxbxmy kkkk )1(1

))(,1(),( myRoundxyx kkkk

在屏幕上输入两端点(假定斜率 ),为找到组成线段的所有象素点,可让x从左端点到右端点变化,每步递增1个象素,计算对应的y的坐标,直到右端点。

10 m

3.1.1 数值微分法(DDA)

),( 11 kk yx

图3-2

))(,1(),( myRoundxyx kkkk

:x每步递增1个象素,y递增m(直线斜率)10 m))(,1(),( myRoundxyx kkkk

:可将x和y的规则交换,y每步递增1个象素,计算对应的x的坐标1m

)1),1((),( kkkk ym

xRoundyx

:x每步递减1个象素,y减少m(直线斜率)10 m))(,1(),( myRoundxyx kkkk

:同样可将x和y的规则交换,y每步递减1个象素,x减少1/m1m

)1),1((),( kkkk ym

xRoundyx

从左向右

从右向左

图3-3 局部显示屏幕

3.1.2 Bresenham画线算法

图3-4 向右绘制的直线 )10( m 图3-5 向左绘制的直线 )1( m

图3-6 对 两点间的线段进行扫描转换

),( ss yx ),( ee yx 图3-7 在取样位置 处,候选象素到线段y坐标之间的竖直距离

1kx

bxmy k )1(

kyyd 1

yyd k )1(2

122)1(212221 kkk ybxmyydd

2 2k ky x x y c )12(2 bxyc其中

e s

e s

y y ymx x x

1 2( ) [2 ( 1) 2 2 1]k kyx d d x x b yx

给定线段从左向右绘制, ,所以 的符号与 的符号相同。0x 1 2( )x d d 21 dd

2 2 2 (2 1)k ky x x y y x b

令 ,1 2( )kp x d d 称 为Bresenham画线算法中第k步的决策参数。kp

<0,则 <0, , 选择绘制 ;kp 21 dd 21 dd ),1( kk yx

>0,则 , 选择绘制 ;kp 2121 ,0 dddd )1,1( kk yx

=0,选择绘制 或 都可以,约定绘制 。kp )1,1( kk yx ),1( kk yx ),1( kk yx

11 kk xx0kp0kp

11

k

kk y

yy

0kp

0kp

1 1( , ) ( , )k k k kx y x y

1 2( )kp x d d 2 2k ky x x y c

Bresenham画线算法中第k+1步的决策参数:

cyxxyp kkk 111 22

)(2)(2)22(22

11

111

kkkk

kkkkkk

yyxxxycyxxycyxxypp

cyxxyp kkk 22

0kp

1kp0kp

0kp

0kp

由 , ,可得11 kk xx0kp0kp

11

k

kk y

yy

ypk 2

xypk 22

)(2)(2 111 kkkkkk yyxxxypp

)12(2220 bxyyxxyp ss

2 2 ( ) 2 (2 1)

2 2 (2 1)2

s syy x x x b y x bx

x b y x by x

由此可见,如果计算出第一个决策参数 ,其它的决策参数可以由递推算出(递推算法中只有整数的加减法,易于硬件实现),根据决策参数的符号可以决定选择哪个象素点绘制,直到整个线段绘制完毕。

0p kp

0kp

1kp0kpypk 2

xypk 22

时的Bresenham画线算法:

1.输入线的两个端点,并将左端点存储在 中;

2.将 装入帧缓冲存储器中,画出第一个点;

3.计算决策参数的第一个值: ;

4.从k=0开始,在沿线的每个 处,进行下列检测:

假如 ,下一个待画点是 ,且 ;

否则下一个待画点是 ,且 ;

5.重复步骤4,共 -1次。

),( ss yx

),( ss yx

xyp 20

kx),1( kk yx ypp kk 21

)1,1( kk yx xypp kk 221

x

10 m

0kp

222 )()( ryyxx cc

y

x

平移变换

图3-8 图3-9

222 ryx

33.2.2 圆的扫描转换--中点画圆法圆的扫描转换--中点画圆法

),(),( 11 kkkk yxyx22

11 )1(,1 kkkk xryxx

)))1((,1(),( 22 kkkk xrRoundxyx

222 ryx

图3-10

222),( ryxyxfcircle

<0 (x,y)位于圆边界内

=0 (x,y)位于圆边界上

>0 (x,y)位于圆边界外

坐标系中任意一点(x,y)与圆的位置关系:在圆内、在圆上和在圆外。

222 )5.0()1()5.0,1( ryxyxfp kkkkcirclek

为中点画圆算法的决策参数

<0,中点在圆内,选择绘制 ;kp ),1( kk yx

>0,中点在圆外,选择绘制 ;kp )1,1( kk yx

=0,选择绘制 或 都可以,约定绘制kp )1,1( kk yx )1,1( kk yx),1( kk yx

222),( ryxyxfcircle

11 kk xx0kp0kp

11

k

kk y

yy

第k步的决策参数 :kp0kp

0kp

1 1( , ) ( , )k k k kx y x y

中点画圆算法第k+1步的决策参数:

221

21111 )5.0()1()5.0,1( ryxyxfp kkkkcirclek

222 )5.0()1()5.0,1( ryxyxfp kkkkcirclek 中点画圆算法第k步的决策参数:

])5.0()5.0[(])1()1[( 221

2211 kkkkkk yyxxpp

0kp0kp

1

,1 11k

kkkk y

yyxx

0kp

1kp0kp1232 1 kkkk xpxp

11 212)1(232 kkkkkk yxpyxp

kk pp 1

])5.0()5.0[(])1()1[( 221

221 kkkk yyxx

])5.0()1[()5.0()1( 222221

21 ryxryx kkkk

在起始位置(0,r)处,初始决策参数为:

rrrrfp circle 45)5.0(1)5.0,1( 22

0

由此可见,如果计算出第一个决策参数 ,其它的决策参数可以由递推算出(递推算法中只有整数的加减法,易于硬件实现),根据决策参数的符号可以决定选择哪个象素点绘制,直到八分圆绘制完毕。其它七个八分圆可由圆的对称性进行绘制。

0p kp

0kp

1kp0kp121)1(2 1 kkkk xpxp

11 212)1(21)1(2 kkkkkk yxpyxp

中点画圆算法:

1.输入圆的半径r和圆心 ,得到圆心在原点的圆周上的第一点为:

=(0,r);

2.计算决策参数的初始值: ;

3.从k=0开始,进行下列检测:

假如 ,下一个待画点是 , ;

否则下一个待画点是 ,且 ;

4.确定在其它七个八分圆的对称点;

5.将每个计算出的象素位置(x,y)移动到中心在 的圆路径上,

并画坐标值。

6.重复步骤3-5,直至 。

),( cc yx

),( 00 yx

rp 45

0

0kp ),1( kk yx 12 11 kkk xpp

)1,1( kk yx 122 111 kkkk yxpp

),( cc yx

yx cc yyyxxx ,

图3-11 中心 ,长半轴 和短半轴 的椭圆

),( cc yxxr yr

1)()( 22

y

c

x

c

ryy

rxx

椭圆中心在坐标原点的标准位置椭圆

椭圆中心在其它地方的标准位置椭圆

非标准位置的椭圆

平移变换

旋转变换

图3-12 椭圆的对称性

33.3.3 椭圆的扫描转换--中点画椭圆法椭圆的扫描转换--中点画椭圆法

斜率为

-1

图3-13 椭圆的处理区域

椭圆某点处的斜率为:

yrxr

dxdy

x

y2

2

22

在区域1和区域2的交界处斜率为-1

yrxrdxdy

xy22 22

1

所以从区域1移至区域2的条件是 yrxr xy22 22

中心在坐标原点(0,0)的标准位置椭圆,定义椭圆函数为:

222222),( yxxyellipse rryrxryxf

<0 (x,y)位于椭圆边界内

=0 (x,y)位于椭圆边界上

>0 (x,y)位于椭圆边界外

])5.0()5.0[()1(211

)5.0()5.0()5.0()1(2)1(1

)5.0(]1)1[(1

)5.0()1(1

)5.0,1(1

221

2221

22222221

222221

2221

2221

2221

221

21

111

kkxykykk

kxkxyxkxykykyk

yxkxkyk

yxkxkyk

kkellipsek

yyrrxrpp

yryrrryrrxrxrp

rryrxrp

rryrxrp

yxfp 图3-14区域1 ),( kk yx

222222 )5.0()1()5.0,1(1 yxkxkykkellipsek rryrxryxfp

01 kp ),1( kk yx

01 kp )1,1( kk yxkk yy 1

11 kk yy

为中点画椭圆算法的决策参数,区域1的决策参数记为 :),( yxfellipse222222),(1 yxkxkykkellipsek rryrxryxfp

在区域1,中点画椭圆算法第k+1步的决策参数:

kp1

第k+1步绘制

第k+1步绘制

第k步绘制 假设第k+1步绘制),( kk yx ),( 11 kk yx

])5.0()5.0[()1(211 221

2221 kkxykykk yyrrxrpp

01 kp2

1222

1 21)1(211 ykykykykk rxrprxrpp

01 kp

122

12222

1 221)1(2)1(211 kxykykkxykykk yrrxrpyrrxrpp

2220 4

1)5.0,10(1 xyxyyellipse rrrrrfp

kk yy 1

11 kk yy

由此可见,在区域1中如果我们能计算出第一个决策参数 ,其它的决策参数 可以由递归算出,把两个候选象素的中点代到决策参数中,根据决策参数的符号可以决定选择哪个象素点绘制,直到区域1绘制完毕。在区域1中,决策参数的初始值可通过椭圆函数在起始点 处求值得到:

01pkp1

),0( yr

斜率为

-1

222222 )1()5.0()1,5.0(2 yxkxkykkellipsek rryrxryxfp

02 kp )1,1( kk yx02 kp )1,( kk yx

])5.0()5.0[()1(222

)5.0()5.0()1(2)1()5.0(2

)]1)1[()5.0(2

)1()5.0(2

)1,5.0(2

221

2221

222222222221

21

222221

21

2221

221

21

111

kkyxkxkk

kykyyxxkxkxkyk

yxkxkyk

yxkxkyk

kkellipsek

xxrryrpp

xrxrrrryryrxrp

rryrxrp

rryrxrp

yxfp

11 kk xx

kk xx 1

区域2的决策参数记为 :222222),(2 yxkxkykkellipsek rryrxryxfp

在区域2,中点画椭圆算法第k+1步的决策参数:

图3-15区域2 ),( kk yx

kp2

第k+1步绘制

第k+1步绘制

第k步绘制 假设第k+1步绘制),( kk yx ),( 11 kk yx

])5.0()5.0[()1(222 221

2221 kkyxkxkk xxrryrpp

02 kp

122

12222

1 222)1(2)1(222 kyxkxkkyxkxkk xrryrpxrryrpp

02 kp

11 kk xx

kk xx 12

1222

1 22)1(222 xkxkxkxkk ryrpryrpp

由此可见,在区域2中如果我们能计算出第一个决策参数 ,其它的决策参数 可以由递归算出,把两个候选象素的中点代到决策参数中,根据决策参数的符号可以决定选择哪个象素点绘制,直到区域2绘制完毕。在区域2中,决策参数的初始值可由区域1中最后点 求值得到:

02pkp2

),( yx222222

0 )1()5.0()1,5.0(2 yxxyellipse rryrxryxfp

斜率为

-1

中心在坐标原点的标准位置椭圆扫描转换算法:

1.输入椭圆长短轴 、 ,得到椭圆第一点为:

2.计算区域1中决策参数的初始值: ;

3.在区域1中,从k=0开始,进行下列检测,直至

假如 ,下一个待画点是 , ;

否则下一个待画点是 , ;

确定其它三个象限中的对称点

4.使用区域1中最后点 来计算区域2决策参数的初始值:

5.在区域2中,从k=0开始,进行下列检测,直至y=0:

假如 ,下一个待画点是 , ;

否则下一个待画点是 , ;

确定其它三个象限中的对称点

),( 00 yx

01 kp ),1( kk yx )1,1( kk yx

xr ),0( yr222

0 411 xyxy rrrrp

yrxr xy22 22

21

21 211 ykykk rxrpp

122

12

1 2211 kxykykk yrrxrpp

),( yx222222

0 )1()5.0(2 yxxy rryrxrp

02 kp )1,( kk yx2

12

1 222 xkxkk ryrpp

)1,1( kk yx 122

12

1 2222 kyxkxkk xrryrpp

yr

区域填充实心填充

图案填充填充方法

扫描线填充算法

种子填充算法

3.4 3.4 区域填充区域填充

图3-16 一个多边形和若干水平扫描线

3.4.1 多边形的填充--扫描线填充算法

扫描线填充算法的基本思想:按扫描线顺序,计算扫描线与区域的相交区间,再用要求的颜色显示这些区间的象素。

多边形扫描线填充算法,对于每一条扫描线,填充可分为四个步骤:

两个问题:

一 填充时,多边形边界上的象素是否填充?

二 当扫描线与多边形顶点相交时,交点算几个?

扫描线y=6: 11,7,3.5 ,2

求交

->[2,3.5],[7 ,11]

排序

->2,3.5,7 ,11

交点配对

1. 求交:计算扫描线与多边形各边的交点;

2. 排序:把所有交点按递增顺序进行排序;

3. 交点配对:对排序交点从头到尾两两配对,

每对交点就代表扫描线与多边形的一个相交区间;

4. 区间填色:把这些相交区间内的象素置成填充色。

问题一:填充时,多边形边界上的象素是否填充?

规定:

只填充左、下边界的象素,右、上边界的象素不予填充。

左闭右开:对扫描线与多边形的相交区间取左闭右开

下闭上开:

图3-17 多边形边界上象素的填充

假定:当扫描线与多边形的顶点相交时,交点只算一个

解决方法:

问题二:当扫描线与多边形顶点相交时,交点算几个?

扫描线y=2: 2,8,2

求交

-> [2,2),8

排序

-> 2,2,8

交点配对

扫描线y=7: 11,9,2 -> [2,9),11-> 2,9 ,11

2,8 -> [2,8)-> 2,8

共享顶点的两条边分别落在扫描线的两侧,扫描线与顶点的交点只算1个;

共享顶点的两条边在扫描线的同侧,扫描线与顶点的交点算为0个或2个:

顶点是多边形的局部最高点,交点数算0个

顶点是多边形的局部最低点,交点数算2个

1. 求交:

扫描线填充算法的四个步骤:

3. 交点配对:

2. 排序:

4. 区间填色:

1yy k1k

1bmxbmx k1k

m1

k1k xx

y=mx+b

k

k+1

k k

k+1 k+1

Scan Line y

Scan Line y

(x ,y )

(x ,y )

图3-18 与多边形相交的两条相邻扫描线

B

A

C扫描线 与AB的交点:ky kx

1ky扫描线 与AB的交点: m1

kx

1. 求交:

扫描线填充算法的四个步骤:

3. 交点配对:2. 排序: 4. 区间填色:

每个结点包含相交边的如下信息:

扫描线y=4的活性边表:

活性边表:把与扫描线 相交的边信息按交点x坐标递增的顺序保存在一个链表中,此链表称为扫描线 的活性边表(活化边表)。

pp pp6 1 3 4

027

pp pp6 1 3 4

0118027

pp pp6 1 3 4

kyky

:边的最大y值

:扫描线 与边的交点x坐标

:边斜率的倒数

箭头 :指向下一个结点的指针

maxy

x

m1

yx

ky

扫描线y=5的活性边表:

扫描线y=6的活性边表:

1ky扫描线 的活性边表:

扫描线 的活性边表:ky

ymax

xk m

1

活性边表的构建原则:

1.修改原则:相邻扫描线 、 和多边形的相交边很可能相同。当扫描线 处理完后,不必为扫描线 从新构建活性边表,只需在扫描线 活性边表的基础上进行修改即可。

ky 1ky

ky

ky1ky

xymax +k m

1m1

扫描线y=6的活性边表:

扫描线y=7的活性边表:

2.删除原则:与扫描线 相交的边,若其 ,则该边与下一条扫描线不再相交,要从扫描线 的活性边表中删除。

1ky

ky

1ky

3. 新增原则:如果扫描线 有新交上的边,则在构建扫描线 的活性边表时,需将新交上的边插入到 活性边表的适当位置,保持有序性。

1ky 1ky

1ky

新边表

1max kyy

8

7

6

5

4

3

2

1

0

353-351 2 2 3pp pp2

8

7

6

5

4

3

2

1

0

353-351 2 2 3pp pp2

8

7

6

5

4

3

2

1

0

6 1 pp 027

353-351 2 2 3pp pp2

8

7

6

5

4

3

2

1

0

0118 pp 3 4

6 1 pp 027

57 -1.5pp pp4 5 5 6

353-351 2 2 3pp pp2

8

7

6

5

4

3

2

1

0

0118

258

pp 3 4

6 1 pp 027

图3-20 各扫描线新边表

maxy :边的最大y值

:该扫描线与边的初始交点x坐标

:边斜率的倒数

minx

m1

yx

新边表:把与扫描线 交的新边信息按交点x坐标递增的顺序保存在一个链表中,此链表称为扫描线 的新边表。若某边的最低位置为 ,则该边就放在扫描线 的新边表中。

kyky

kyky

7 2 0pp 6 1

3 4 pp

8 5 2

8 11 0

0

1

2

3

4

5

6

7

2pp pp1 2 2 3

5 -3 3 5 3

4 5 5 6pp pp -1.57 5

扫描线新边表 扫描线活性边表

图3-21 新边表到活性边表

新边表

活性边表的三个构造原则

修改原则

删除原则

新增原则

3.4.2 种子填充算法

种子填充算法的基本思想:如在区域内部有一象素已知,由此出发找到区域内的所有象素。

四向算法

八向算法

种子填充算法适用于用边界定义的区域,该算法也可称为边界填充算法。

种子填充算法

图3-22

可以使用栈结构实现四向算法,步骤如下:

种子象素入栈,当栈非空时重复执行如下三步操作:

1. 栈顶象素出栈;

2. 将出栈象素置成填充色;

3. 按右、上、左、下逆时针顺序检查与出栈象素相邻的四个象素,若其中某个象素不在边界且未置成填充色,则把该象素入栈。

图3-23椎栈动态示意图

考虑更有效的方法,步骤如下:

图3-24 填充象素区间及椎栈示意图

种子象素入栈,当栈非空时重复执行如下三步操作:

1. 栈顶象素出栈;

2. 将出栈象素所在水平扫描线的连续象素段置成填充色,直至遇到边界象素为止;

3. 按下、上顺序检查当前扫描线相邻两条扫描线的有关象素是否为边界象素或已填充象素,若存在非边界、未填充的象素,则把每一区间的最左象素入栈。

线段明显落在裁剪窗口外(丢弃该线段);L

K

DC

J

I

H

G

F

EB

A

图3-26 线段与裁剪窗口

用计算机显示图形时,必须确定图形中哪些部分落在指定区域内,哪些部分落在指定区域外,这个处理过程称为裁剪。指定区域称为裁剪窗口,一般把裁剪窗口定义为矩形。

窗 口裁 剪

(x ,y )

(x ,y )

L B

R T

对于点(x,y)的裁剪,只要判别四个不等式:

TBRL yyyxxx ,

屏 幕

图3-25

线段完全落在裁剪窗口内(显示该线段);

线段与裁剪窗口的位置关系:

不能明确判定线段与裁剪窗口的位置关系(必须通过交点计算,得到线段在裁剪窗口内的部分并显示)。

3.5 3.5 线段的裁剪线段的裁剪

窗口

**1*

窗 口裁 剪

图3-27 区域编码

3.5.1 Cohen-Sutherland线段裁剪算法

采用编码方法,每个区都用一个四位二进制区域码表示该区与裁剪窗口的位置关系:

****

裁剪窗口的右上方区域:

1010

0100

0000

1001

0001

0101

1000

0010

0110

上下右左

裁剪窗口的正下方区域:

裁剪窗口区的区域码: 0000

判定一条线段与裁剪窗口的位置关系,可先求出线段两端点所在区的区域码code1和code2。设端点的坐标为 :)y,x(

Lxx Rxx Byy Tyy

1010

0100

*1**1***

***1

L

K

DC

J

I

H

G

F

EB

A

1001     1000       1010

0001     0000     0010

0101     0100     0110

有了端点的区域码code1和code2,可方便快速地判定线段与裁剪窗口的位置关系:

code1&code2 0

显示线段两端点的区域码都为0000,两端点在裁剪窗口区

两端点的区域码至少有一位同时为1,两端点同在裁剪窗口的上方/下方/右方/左方

丢弃线段

code1|code2=0

code1|code2=0 code1&code2 0 均不成立

求交点计算不能判定线段与裁剪窗口的位置关系

图3-28

,

,

,,

,

4

3

3

2

1

p

p

pp

p

p

p0101     0100     0110

0001     0000     0010

1001     1000       10101

1

2

求交点计算:计算线段与窗口的一条裁剪边的交点,在交点处把线段一分为二,其中一段必完全落在裁剪窗口外,可丢弃,对线段的另一段与其余裁剪边重复进行上述处理,直到该线段完全被丢弃或找到落在裁剪窗口内的一段线段为止。

设端点为 线段的斜率截距方程为 ,线段与各裁剪边的交点(x,y):

),(),,( 2211 yxyx bxmy

左裁剪边 右裁剪边 下裁剪边 上裁剪边

x

y )xx(my 1L1 )( 11 xxmy R myyx B 1

1

myyx T 1

1

By Ty

Lx Rx

窗 口裁 剪 p11p

p1

3.5.2 NLN线段裁剪算法

图3-29

1. 延长裁剪窗口的四个裁剪边,将整个二维平面分成9个区。NLN算法只考虑线段 的起点 落在三个区域里:窗口内、窗口左侧、窗口左上侧;

2. 点的位置确定后,从 点向窗口的四个角发出射线,这四条射线和窗口的四条裁剪边一起将二维平面重新画分区域;

21pp 1p

1p 1p

NLN算法的基本思想是通过对二维平面更详细的划分,减少线段与裁剪边的求交次数。NLN算法可分为以下四步:

p11p

p1

R

T

L

B

L

LT

RL

LB

TL

TR

TBLB

p1

TRT

LRL

LB

点在窗口内1p 点在窗口左侧1p

点在窗口左上侧(1)1p 点在窗口左上侧(2)1p

图3-30 根据 点位置对区域进行画分1p

,

,

,,

,

4

3

3

p

p

pp

p

p

p0101     0100     0110

0001     0000     0010

1001     1000       1010

2

1

1

1

2

1p

pRTLTp 2pLT

图3-31 通过比较斜率确定 所在区域

3 确定 点所在区域。根据线段 及各射线的斜率可确定 所在区域。

如图 点在窗口左侧, 点落在LT区域的充要条件是:

2p

T

pppppp

yymmm

LTRT

2

1211

1p 2p

T

L

T

R

T

yyxxyy

xxyy

xxyy

2

1

1

12

12

1

1即:

2p21pp

4 求交点, 点落在哪个区域就计算线段与相应裁剪边的交点,确定 的可见部分。21pp

2p

Cohen-Sutherland算法对线段进行裁剪时,必须对一条线段进行多次求交计算:对线段 的裁剪,先后求三个交点 ;对线段 的裁剪,求一个交点。

采用NLN算法,通过对二维平面更详细的画分,减少线段与裁剪边的求交次数:对线段 的裁剪,先后求两个交点 ;对线段 的裁剪,不求交点。

21pp43pp

21pp43pp

2p

e

sp

p

BT

LT

RT

TT

图3-32 线段 es pp

LUTU

RU

BU

3.5.3 Liang-Barsky线段裁剪算法

线段参数化形式的裁剪条件是:

TB

RL

yyuyyxxuxx

0

0

0

0

0

0

yyyuyyyuxxxuxxxu

T

B

R

L

这四个不等式可以表示为:

LL xxq 0,xpL 令

线段 , 的坐标为 , 的坐标为 ,线段 的参数方程为:

es pp sp ),( 00 yx ep ),( ee yxes pp

LL qup 得

令 ,xpR 得 RR qup 0xxq RR

令 ,ypB BB yyq 0 得 BB qup

令 ,ypT 0yyq TT 得 TT qup

yuyyyuyyxuxxxuxx

e

e

000

000

)()(

0

0

yyyxxx

e

e

10 u

这四个不等式可以写成一个通式:

KK qup K=L、R、B、T

当不等号取等号时,线段与裁剪边相交。

(K=L、R、B、T, )0KpK

KK p

qu

将参数 代入到线段的参数方程中得到线段与四个裁剪边或边延长线的交点 ( 对应于线段与左、右、下、上裁剪边的交点)。

Ku),( KKK yxU KU

yuyyxuxx

KK

KK

0

0

窗口每条裁剪边及其延长线把整个区域分成两部分,包含裁剪窗口的区域称为该裁剪边的内部,不包含裁剪窗口的区域称为该裁剪边的外部。

Ty

yB

窗口

口窗RxLx

内外

口窗

口窗

图 裁剪边的内部和外部

ps

epe

sp

p

ps

ep

内外

0Lp 0Lq

0,0 LL qp 当 (K=L、R、B、T)时,线段 完全落在裁剪窗口外。0,0 kK qp es pp

,线段平行于左裁剪边,起点 在左裁剪边的左侧sp0,0 RR qp ,线段平行于右裁剪边,起点 在右裁剪边的右侧sp0,0 BB qp ,线段平行于下裁剪边,起点 在下裁剪边的下侧sp0,0 TT qp ,线段平行于上裁剪边,起点 在上裁剪边的上侧sp

当 ,线段 可能落在裁剪窗口内。0,0 kK qp es pp

0,0 LL qp0,0 RR qp

0,0 LL qp0,0 RR qp

图3-33

外外

T

B

RL

内外

ps

ep

pspe

sp

eppe

sp

epsp

pe

sp

spep

ps

ep

spep

图3-33 线段从K裁剪边的外部延伸到内部0Kp

,线段从左(L)裁剪边的外部延伸到内部;

,线段从右(R)裁剪边的外部延伸到内部;

,线段从下(B)裁剪边的外部延伸到内部;

,线段从上(T)裁剪边的外部延伸到内部。

当 (K=L、R、B、T)时,线段 从相应裁剪边的外部延伸到内部;0Kp es pp,00 eL xxp exx 0

当 时,线段 从相应裁剪边的内部延伸到外部;0Kp es pp 当 时,线段 平行于相应裁剪边。0Kp es pp

把线段 两端无限延长并看成有向直线,方向是从 延伸到 。es pp sp ep

,00 xxp eR exx 0

,00 eB yyp eyy 0

,00 yyp eT eyy 0

,线段从左(L)裁剪边的外部延伸到内部;

,线段从右(R)裁剪边的内部延伸到外部;

,线段从下(B)裁剪边的外部延伸到内部;

,线段从上(T)裁剪边的内部延伸到外部。

00

0

0

xxpxxp

eR

eLexx 0

0Kp如果 (K=L、R、B、T),那么线段 不与裁剪边平行,线段一定从两条裁剪边的外部延伸到内部,再从另外两条裁剪边的内部延伸到外部。

es pp

图3-34 线段 由两裁剪边外部延伸到内部,再由另外两裁剪边内部延伸到外部

es pp

eyy 0

00

0

0

yypyyp

eT

eB

e

sp

p

BT

LT

RT

TT

LUTU

RU

BU

e

sp

p

BT

LT

RT

TT

LUTU

RU

BU

线段 从两条裁剪边的外部延伸到内部

es pp

从另外两条裁剪边的内部延伸到外部。

sp

和 中最靠近终点的点为:

LB UU , sp

(u值最大点)

(u值最小点)

LB UU ,得交点

得交点 RT UU , 和 中最靠近起点的点为:

RT UU , ep

TU

就是线段落在窗口的可见部分

TsUp

yuyyxuxx

0

0

10 u

线段 的参数方程为:es pp

0Kp

0Kp

00

0

0

xxpxxp

eR

eLexx 0

eyy 0

00

0

0

yypyyp

eT

eB

,线段 从裁剪边外部区域延伸到内部,由公式 求得0Kp es ppK

KK p

qu Ku点的参数 u = 0sp

,线段 从裁剪边内部区域延伸到外部,由公式 求得0Kp es ppK

KK p

qu Ku

点的参数 u = 1ep

}0,max{1 Kuu }0|{ KpKK

}1,min{2 Kuu }0|{ KpKK

Liang-Barsky算法总结:

在线段起点和线段由裁剪边外部延伸到内部与裁剪边的交点中找出参数值最大的点 ;在线段终点和线段由裁剪边内部延伸到外部与裁剪边的交点中找出参数 值最小的点 。若 线段落在窗口外,丢弃该线段;若 ,则 即为线段落在窗口内的可见部分。

u)( 1uU s

u

)( 2uUe

10 21 uu21 uu

esUU

的计算过程:21,uu

解:线段 的参数方程为:

uuyyuyyuuxxuxx

e

e

21)13(1)(101)19(1)(

00

00

es pp

22

1010

0

0

0

0

yyypyyyp

xxxpxxxp

eT

eB

eR

eL

314101

9)1(8101

0

0

0

0

yyqyyqxxqxxq

TT

BB

RR

LL

计算 :KK qp ,

例:使用Liang-Barsky算法裁剪线段 , ,裁剪窗口为: 。

es pp )3,9()1,1( es pp 4,0,8,0 TBRL yyxx

ps

ep

0 2 4 6 8

2

4

x

y

0Kp

2

10

B

L

p

p

21

21

101

101

B

BB

L

LL

pqu

pqu

sp 点的参数 0u

101}0,

21,

101max{}0,,max{1 BL uuu

0Kp

2

10

T

R

p

p

23

23

109

109

T

TT

R

RR

pqu

pqu

ep 点的参数 1u

109}1,

23,

109min{}1,,min{2 TR uuu

ps

ep

0 2 4 6 8

2

4

x

y

22

1010

T

B

R

L

pppp

3191

T

B

R

L

qqqq

514

1092121

8109101101

56

1012121

0101101101

22

22

11

11

uy

ux

uy

ux

将 、 代入线段参数方程求出交点坐标

1u 2u),(),,( 2211 yxUyxU es

故线段 中, 间的线段为落在裁剪窗口内的可见部分。es pp )56,0(sU )

514,8(eU

ps

ep

0 2 4 6 8

2

4

x

y

7.使用Cohen-Sutherland算法裁剪线段 ,

,裁剪窗口为:

请说明裁剪的过程。

es pp)6,2()2,6( es pp 0, 8,L Rx x

0 2 4 6 8

2

4

x

ps

ep

窗 口裁 剪

屏 幕

0, 4.B Ty y

作业二

5.已知多边形顶点坐标依次为(1,1)(6,2)(5,5) (4,4)(2,6),用扫描线算法对其填充,请用桶结构写出全部新边表和活性边表。

6.用VC或其他语言编写程序:先在屏幕中画一个矩形作为裁剪窗口,然后利用数值微分算法画线段,并用Liang-Barsky算法对所画线段进行裁剪。

E

C

B

A 1J

J2

D

图3-35 多边形的裁剪

裁剪前

Sutherland-Hodgeman算法的基本思想是:一次用窗口的一条裁剪边裁剪多边形。算法的输入是多边形的顶点序列,最终输出也是一个顶点序列。

图3-36 Sutherland-Hodgeman多边形裁剪算法

p1

p3

2

p3

2

1

JJ2

JJ21

2

J

J

3

4

JJ21

3J

2

JJ 56

J

J6J21

5

J3J

JJ7 8

原始多边形 左裁剪边裁剪 右裁剪边裁剪 下裁剪边裁剪 上裁剪边裁剪

321 ppp 2321 JppJ12432 JJJJp 212653 pJJJJJ 3871265 JJJJJJJ

3.6 3.6 多边形的裁剪--多边形的裁剪--SutherlandSutherland--HodgemanHodgeman算法算法

用线段裁剪算法处理多边形J2

C

B

1J

J2

C

B

1J

正确裁剪结果

在裁剪边外部, 在裁剪边内部;

都在裁剪边内部;

在裁剪边内部, 在裁剪边外部;

都在裁剪边外部;

21, pp

21, pp

1p 2p

1p 2p

在用当前裁剪边对多边形进行裁剪时,要逐个考虑多边形的每条边与裁剪边的位置关系:

内外

pp

1

2

1J

1p

内 2p 外 1p内

2

2pJ

p2

内p1

图3-37 左裁剪边与多边形一条边的位置关系

21, pJ

2p

2J无

输出输入

21, pp

使用Sutherland-Hodgeman算法对多边形进行裁剪

输入多边形的顶点序列为: 54321 ppppp经左裁剪边裁剪:

最终输出的顶点序列为:

2p经右裁剪边裁剪: 3p经下裁剪边裁剪:

经上裁剪边裁剪: 4J

3J 54 pJ

16pJ1p 2p

3J 4J 5J 2p 3p

5J 6J 1p 2p 1J 32JJ

4J 5J 6J 1p 2p 1J 32JJ

5p4p 1p3p

x

y

图3-39 象素(x,y)为正方形,中心为坐标点(x,y)

图3-38 线、圆的走样

图形的边界呈阶梯状

用有限个象素来表示连续的图形而引起的失真叫做走样(aliasing)。

用于减少或消除走样现象的技术,称为反走样(antialiasing)。

走样的表现形式: `

图形细节失真

图3-40 图形细节失真A B

3.7 3.7 反走样反走样

狭小图形的遗失或闪烁

图3-42 小三角形的闪烁图3-41 小三角形的遗失

纹理的走样

需要显示的运动小三角形

屏幕上显示结果

纹理 贴纹理的模型建筑物几何模型

图3-43

需要显示的静态小三角形

屏幕上显示结果

图3-44 分辨率提高一倍阶梯程度减小一倍

3.7.1 提高分辨率

3.7.2 过取样

过取样的基本思想是:高分辨率计算,低分辨率显示。

高分辨率计算:将屏幕上的象素划分成多个子象素,然后计算出各个子象素的颜色值(或灰度值)。

低分辨率显示:对一个象素内子象素的颜色值求平均值(可以取简单平均,也可取加权平均),将平均值作为该象素的颜色值显示。

直线过取样的具体方法:统计每个象素沿线路径的子象素数目,象素的灰度等级正比于这个子象素数目。

(1) 理想直线 (2) 直线扫描转换

(3) 不考虑线宽的过取样 (4) 过取样结果

nn maxI

maxInsI pixel

把一个象素划分成 个子象素,设 为系统支持的最大灰度,s为象素沿线路径的子象素数目,则象素的灰度值:

过取样的基本思想是:高分辨率计算,低分辨率显示。

(1) 理想直线

考虑线的宽度,统计每个象素中落在线条内的子象素数目,象素的灰度等级正比于这个子象素数目。

(2) 直线扫描转换

(3) 考虑线宽的过取样 (4) 过取样结果

nn

max2 InsI pixel

maxI把一个象素划分成 个

子象素,设 为系统支持的最大灰度,s为象素落在线条内的子象素数目,则象素的灰度值:

3.7.3 区域取样

1. 将直线看成具有一个象素宽度的线条;

2. 当直线与象素相交时,求出两者相交区域的面积;

3. 根据相交区域的面积,确定该象素的灰度值。

图3-47 区域取样

对于区域边界,可采用区域取样方法进行反走样:当象素与区域边界相交时,计算象素与区域边界的相交面积,以此面积来决定该象素的灰度值。

3.7.4 反走样区域边界

y

kxkx

+1

+1

k

ky

y

+0.5yk

d

图3-48 区域边界走样

图3-49 象素局部显示屏幕

Pitteway和Watkinson对中点画线法进行了改进,提出一种快速计算象素与区域边界的相交面积的方法。

),( kk yx 图3-50 在取样位置 处,候选象素中点与线段实际y坐标之间的比较

1kx

y

kxkx

+1

+1

k

ky

y

+0.5yk

d

)5.0(])1([)5.0( kkk ybxmyyd0d如果 ,选择绘制 ),1( kk yx 0d如果 ,选择绘制 )1,1( kk yx

5.0)1()5.0(])1([

)1(

kk

kk

ybmxmybxm

mdp令

+0.5-0.5

-0.5

+0.5

y=mx+b

yk

ky

ky

kk k xx x

y=m(x+0.5)+bk

ky=m(x-0.5)+b相交 域区

如果 ,选择绘制 ),1( kk yx

如果 ,选择绘制 )1,1( kk yxmp 1mp 1

区域边界与象素 的相交区域面积

21)]}5.0()5.0([)]5.0()5.0({[

kk

kk

ybxmybxmS

21)]}5.0([)]5.0({[

kk

kk

ybmxybmxS

5.0 kk ybmxS

),( kk yx

采用该算法在确定区域边界的同时,也确定了边界上象素的灰度值。

图3-51 边界与象素 的相交区域),( kk yx

top related