Presentation is loading. Please wait.

Presentation is loading. Please wait.

计算机图形学 傅向华 深圳大学信息工程学院 Email: fuxh@szu.edu.cn 电话: 26534380 办公楼339.

Similar presentations


Presentation on theme: "计算机图形学 傅向华 深圳大学信息工程学院 Email: fuxh@szu.edu.cn 电话: 26534380 办公楼339."— Presentation transcript:

1 计算机图形学 傅向华 深圳大学信息工程学院 电话: 办公楼339

2 倪明田、吴良芝,计算机图形学,北京大学出版社,1999.11 主要参考书:
课程性质:综合选修课 学分:2.5 上课时间地点: 每周四1,2节 A209教室,双周周五3,4节 D506机房 教材: 倪明田、吴良芝,计算机图形学,北京大学出版社, 主要参考书: 1. 孙家广、胡事民,计算机图形学基础教程,清华大学出版社,2005.2 2. David F. Rogers,Procedural Elements for computer Graphics,机械工业出版社, (计算机图形学的算法基础) 3. Zhigang Xiang, Roy Plastock著,陈泽琳,陈展文,陈屹等译. 计算机图形学习题与解答.机械工业出版社.

3 考试(成绩分布): 平时成绩 30-40%,期末考试成绩60-70%

4 第一章 计算机图形学概述 计算机图形学的研究内容 计算机图形学应用举例 计算机图形学发展历史 图形显示设备 交互式图形系统的逻辑结构
当前的研究动态

5 计算机图形学的研究内容(1/2) 图形:计算机图形学的研究对象 构成图形的要素 计算机中表示图形的方法
能在人的视觉系统中产生视觉印象的客观对象 包括自然景物、拍摄到的图片、用数学方法描述的图形等等 构成图形的要素 几何要素:刻画对象的轮廓、形状等 非几何要素:刻画对象的颜色、材质等 计算机中表示图形的方法 点阵表示 枚举出图形中所有的点 简称为图像(数字图像) 参数表示 形状参数+属性参数 简称为图形

6 计算机图形学的研究内容(2/2) 计算机图形学的研究内容 图形的输入 图形的处理 图形的输出 与相关学科的关系 数字图像 数据模型
图像生成(计算机图形学) 数字图像 数据模型 图像变换 (图像处理) 模型变换 (计算几何) 模型(特征)提取 (计算机视觉,模式识别)

7 计算机图形学应用举例(1/8) 图形用户界面 命令行界面CLI 人 机 界 图形用户界面GUI 面 多通道用户界面(MMI) 发展历程
操作系统 Macintosh,OS/2,Windows,Unix/X-Window 命令行界面CLI 图形用户界面GUI 多通道用户界面(MMI)

8 计算机图形学应用举例(2/8) 计算机辅助设计 Computer-Aided Design
应用领域:飞机、轮船、汽车外形,大规模集成电路,建筑,服装,玩具 优点:设计周期短,成本低,质量高

9 计算机图形学应用举例(3/8) 科学计算可视化 波在单向环氧石墨中传播的可视化演示 Scientific Visualization
必要性:直接分析大量的测量数据或统计数据有困难 目标:用图形表现抽象的数据 应用领域:医学,遥感,流场等等 波在单向环氧石墨中传播的可视化演示

10 计算机图形学应用举例(4/8) 科技、教育、商业领域的交互式绘图 股票趋势分析

11 计算机图形学应用举例(5/8) 计算机艺术 书法、艺术图片 输入工具:键盘、鼠标、手写笔等等
软件工具:PhotoShop、CorelDraw、PaintBrush等等 优点:功能多、创作轻松、调色方便等等 缺点:目前难以容入人的灵感(未来的研究课题)

12 计算机图形学应用举例(6/8) 地理信息系统 计算机动画及广告影视创作 Geographical Information System
建立在地理图形之上的关于各种资源的综合信息管理系统 例如百度地图搜索 ( 计算机动画及广告影视创作 传统动画:费时费力,质量差, 例子:《大闹天宫》,90*60*24=129,600张胶片,几十位动画工作者近4年的时间 (1960 – 1964年),近7万张画作 计算机动画(Computer Animation):效率高,质量高 例子:《侏罗纪公园》 计算机动画创作工具:3D MAX, MAYA等等

13 计算机图形学应用举例(7/8) 电脑游戏 多媒体系统
实时性 逼实性 蕴含了先进的图形处理技术 DirectX演示 多媒体系统 在计算机控制下,对多种媒体信息进行生成、操作、表现、存储、通信、或集成的信息系统,其中媒体至少应包括一种“连续媒体”及一种“离散媒体”。 计算机处理的常见媒体:文本、图形、图像、语音、音频、视频、动画,与图形处理相关的是关键。 特点:媒体的多样性、操作的交互性、系统的集成性

14 计算机图形学应用举例(8/8) 虚拟现实系统 Virtual Reality 或称虚拟环境(Virtual Environment)
是用计算机技术来生成一个逼真的三维视觉、听觉、触觉或嗅觉等感觉世界,让用户可以从自己的视点出发,利用自然的技能和某些设备对这一生成的虚拟世界客体进行浏览和交互考察。 主要研究用计算机模拟(构造)三维图形空间,并使用户能够自然地与该空间进行交互。对三维图形处理技术的要求特别高。 20世纪80年代初,美国的DARPA为坦克编队作战训练开发了一个实用的虚拟战场系统SIMNET。 1997年7月,地球上的工程师通过虚拟现实系统操纵距地1.9亿公里的火星上的火星车。 输入输出设备,如头盔式显示器、立体耳机、头部跟踪系统以及数据手套等。

15 计算机图形学应用举例(9/9) 网上虚拟现实:虚拟现实建模语言VRML (1994年3月在日内瓦召开的第一届WWW大会上,首次正式提出了VRML这个名字。) VRML例子 ( 校园漫游

16 计算机图形学发展历史 50年代,阴极射线管显示器出现,用于显示输出,不具交互功能。
随后, 林肯实验室 战术防空系统SAGE 交互图形技术诞生 1963 Ivan Sutherland研制SKETCH-PAD系统,第一台光笔交互式CRT显示器, 奠基人 60年代中后期,计算机辅助设计系统在航空、汽车等领域开展起来 80年代后,廉价图形输入输出和大容量存储介质的出现,图形处理芯片的出现,使得交互式图形学广泛应用。

17 画线显示器(矢量显示器/随机扫描显示器)
计算机图形学发展历史(1/7) 图形显示设备的发展 60年代中后期出现,只能绘制线条,任意方向连续扫描 画线显示器(矢量显示器/随机扫描显示器) 存储管式显示器 60年代末期, 具有内在的存储部件, 靶像,静态图像 70年代初, 以点阵形式表示图形. 点阵存放在专用缓冲区中,由视频控制器负责扫描,显示图形. 刷新式光栅扫描显示器 平板显示器 (液晶显示器, 等离子显示器)

18 计算机图形学发展历史(2/7) 刷新式 存储管式 画线显示器 存储管式显示器
电子束轰击荧光屏产生的亮点只能持续极短的时间,为了产生静态的不闪烁的图像,电子束必须周期性地反复扫描所要绘制的图形,这个过程称为刷新. 存储管式 内置金属网受到电子束轰击之后形成靶像,它可以持续发出电子,在荧光屏上产生静态图像 画线显示器 只能显示线条 价格昂贵 存储管式显示器 无需刷新,价格较低 没有动态修改图形的能力

19 计算机图形学发展历史(3/7) 刷新式光栅扫描显示器 等离子显示器 液晶显示器 价格低 性能高 成为当前的主流显示器
依靠高电压来激活显像单元中的特殊气体,使它产生紫外线来激发磷光物质发光。 用于比较大的屏幕,如等离子电视,大于40寸 液晶显示器 通过电流来改变液晶面板上的薄膜型晶体管内晶体的结构,使它显像。 用于比较小的屏幕,如30寸一下,电脑的显示器,液晶电视

20 计算机图形学发展历史(4/7) 图形输入设备的发展 第一阶段:控制开关、穿孔纸等等 第二阶段:键盘
第三阶段:二维定位设备,如鼠标、光笔、图形输入板、触摸屏等等, 第四阶段:三维输入设备(如空间球、数据手套、数据衣),用户的手势、表情等等 第五阶段:用户的思维? 发展方向是使人能够更自然、更方便地与计算机进行交互

21 计算机图形学发展历史(5/7)

22 计算机图形学发展历史(6/7)

23 计算机图形学发展历史(7/7) 图形软件的发展及软件标准的形成 诸侯割据 标准讨论 标准形成 发展历程 两类标准 70年代 早期
官方标准(标准组织制定的标准): 核心图形系统CGS(Core Graphics System),1977年美国计算机协会公布 计算机图形接口CGI(Computer Graphics Interface), ISO公布; 计算机图形元标准CGM(Computer Graphics Metafile); 计算机图形核心系统GKS(Graphics Kernel System); 1984年 ISO和ANSI 程序员层次交互式图形系统PHIGS(Programmer’s Herarchical Interactive Graphics System); 1986年ISO和ANSI 初始图形交换规范IGES(Initial Graphics Exchange Specification),1983年,美国国家标准局; 工业标准(事实上的标准):SGI等公司的OpenGL,微软公司的DirectX,X财团的Xlib(X-Windows),Adobe公司的PostScript等等 早期 70年代 1979年后 诸侯割据 标准讨论 标准形成

24 计算机图形学发展历史(7/7) 图形软件标准是指系统的各界面之间进行数据传递和通信的接口标准,称为图形界面标准;供各种应用程序调用子程序功能及格式标准,称为子程序界面标准。 交互式图形系统需要在四个层次上实现界面标准化   (1) 应用程序与它所处理的数据之间的数据接口   (2) 应用程序与图形软件包之间的接口 (3) 图形软件包与图形硬件之间的接口   (4) 数据文件接口

25 图形显示设备(1/21) (阴极射线管显示器) 阴极射线管(CRT, cathode-ray tube)
图形显示设备(1/21) (阴极射线管显示器) 阴极射线管(CRT, cathode-ray tube) 组成:包括电子枪、聚焦系统、加速电极、偏转系统、荧光屏 工作原理:电子枪发射电子束,经过聚焦系统、加速电极、偏转系统,轰击到荧光屏的不同部位,被其内表面的荧光物质吸收,发光产生可见的图形。 结构

26 某种CRT产生稳定图像所需要的最小刷新频率
图形显示设备(2/21) 荧光屏 (显示图形) 荧光物质:吸收电子束而发光 持续发光时间:电子束离开某点后,该点的亮度值衰减到初始值1/10所需的时间 刷新(Refresh):为了让荧光物质保持一个稳定的亮度值,不断重 复绘制图形. 刷新频率:每秒钟重绘屏幕的次数 像素(Pixel:Picture Cell):构成屏幕(图像)的最小元素 分辨率(Resolution):CRT在水平或竖直方向单位长度上能识别的最大像素个数,单位通常为dpi(dots per inch)。在假定屏幕尺寸一定的情况下,也可用整个屏幕所能容纳的像素个数描述,如640*480,800*600,1024*768,1280*1024等等 某种CRT产生稳定图像所需要的最小刷新频率 =1秒/荧光物质的持续发光时间 (例如)=1000ms/40ms=25Hz

27 图形显示设备(3/21) 彩色阴极射线管 产生彩色的常用方法:射线穿透法、影孔板法 射线穿透法 荧光涂层 产生颜色 低速电子束 电子束
原理 应用:画线显示器 优点:成本低 缺点:只等产生有限几种颜色 荧光涂层 产生颜色 低速电子束 电子束 较低速电子束 较高速电子束 高速电子束

28 图形显示设备(4/21) 影孔板法 原理:影孔板被安装在荧光屏的内表面,用于精确定位像素的位置 影孔板 外层玻璃 荧光涂层

29 图形显示设备(5/21) 影孔板的类型 点状影孔板 代表:大多数球面与柱面显像管 栅格式影孔板
代表:Sony的Trinitron (单枪三束)与Mitsubishi的Diamondtron 显像管 (三枪三束) 两大好处:一是把相互平行的垂直铁线阵形安装在一个铁框里,垂直部分没有任何东西阻挡,增强了电子流通量,也增强了纵向方向的透光度,透出的光线比荫罩式显像管多一倍,因而特丽珑显像管的明亮度和颜色饱和度要比其他的显像管都要好;二是间条式栅罩的阻碍光率十分少,长时间使用后也不会膨胀或变形,避免发生颜色突变或亮度变弱的情况。 沟槽式影孔板 代表:LG的Flatron显像管 (未来窗) 可以得到更大的电子流通量,也使荫罩网面的受力即稳定情况比较好。

30 图形显示设备(6/21) 点状影孔板工作原理 红、绿、兰三基色 三色荧光点 三个电子枪

31 如果每个电子枪有256个等级,则显示器能同时显示256*256*256=16M种颜色,称为真彩系统
图形显示设备(7/21) 显示器能同时显示的颜色个数 如果每个电子枪有256个等级,则显示器能同时显示256*256*256=16M种颜色,称为真彩系统

32 图形显示设备(8/21) 点距

33 图形显示设备(9/21) *纯平显示器* 走向平面的显像管 球面显象管: 柱面显象管: 平面直角显象管 纯平显象管 表面:球面的一部分
时间:~90年代初 柱面显象管: 表面:柱面的一部分,垂直方向上平直,水平方向上有弯曲 时间:90年代中期 代表:Sony公司的Trinitron,Mitsubishi公司的Diamondtron 平面直角显象管 表面:球面的一部分,类似于平面 时间:90年代中后期 现在市场上的主流显象管 纯平显象管 表面:纯平面 时间:90年代后期 代表:Sony公司的FD Trinitron,Mitsubishi公司的Diamondtron,Samsung公司的DanyFlat,LG公司的Flatron 今后的主流显象管

34 图形显示设备(11/21) 随机扫描显示系统 特点:电子束在任意方向上自由移动
逻辑部件:刷新存储器(Refreshing Buffer),显示处理器(DPU:Display Processing Unit),CRT 系统结构

35 图形显示设备(12/21) 光栅扫描显示系统 显示文件(Display File) 工作原理:
刷新存储器中所有绘图命令组成的文件 工作原理: 应用程序发出绘图命令,被解释成显示处理器可接受的命令格式,存放在刷新存储器之中.组成一个显示文件,驱动电子枪在屏幕上绘图. 光栅扫描显示系统 特点:光栅扫描 (按固定的扫描线从左到右,从上到下进行扫描) 扫描线 帧 (一次扫描所产生的图像) 水平回扫期 垂直回扫期

36 图形显示设备(13/21)

37 图形显示设备(14/21) 绘图过程

38 图形显示设备(15/21) 逻辑部件:帧缓冲存储器(Frame Buffer),视频控制器(Video Controller),显示处理器(Display Processor),CRT 帧缓冲存储器 作用:存储屏幕上像素的颜色值 简称帧缓冲器,俗称显存 工作原理 帧缓冲器中的单元数目与显示器上的像素数相同,单元与象素一一对应,各单元的数值决定了其对应的像素的颜色.

39 图形显示设备(16/21) 分辨率M*N、颜色个数K与显存大小V的关系 可以同时显示16兆种颜色的显示系统称为真彩显示系统
带宽T与分辨率、帧频F的关系 两个问题:显存问题和带宽问题 显存问题 高分辨率和真彩要求有大的显存; 曾经是个问题! 解决方法:采用查色表(Lookup Table)或称彩色表(Color Table) 查色表工作原理 帧缓冲器保存查色表各项的索引值. 1024*768真彩模式需要3M字节显存

40 图形显示设备(17/21) 带宽问题 高分辨率和高的刷新频率要求有高带宽 依然是个问题!
解决方法:隔行扫描(现在已经基本不用,主流地显示器都采用逐行扫描方式) 隔行扫描的工作原理:把一帧分两场,即奇数场与偶数场 场频:==2*帧频 1024*768/85模式需要85M带宽

41 图形显示设备(18/21) 简单的光栅扫描图形显示系统的结构 较为典型的光栅扫描图形显示系统的结构

42 图形显示设备(19/21) 视频控制器 普通显卡=视频控制器+显存 作用:负责刷新,建立缓冲单元与像素之间的一一对应 结构 工作原理
双缓冲机制(Double Buffer) 可以同时进行读写 Y 屏幕坐标 X 普通显卡=视频控制器+显存

43 图形加速卡=视频控制器+显存+显示处理器
图形显示设备(20/21) 显示处理器 作用:代替CPU完成部分图形处理功能,扫描转换、几何变换、裁剪、光栅操作、纹理映射等等 具有专用显示处理器的光栅显示系统的结构 图形加速卡=视频控制器+显存+显示处理器

44 图形显示设备(21/21) 光栅显示系统的特点 优点使其占据了市场主流 缺点正在被克服 优点: 缺点: 成本低 易于绘制填充图形 色彩丰富
刷新频率一定,与图形的复杂程度无关 易于修改图形 缺点: 需要扫描转换 会产生混淆 优点使其占据了市场主流 缺点正在被克服

45 交互式系统的逻辑结构(1/5) 多数交互式图形系统的逻辑结构 例子 Bmp 图像 Windows API 输入输 出设备
应用程序 用户通过其创建、修改、编辑应用模型 应用模型 用户设计图形的数据表示 图形软件包 由一系列输入输出汗水祖传,负责图形的最终显示 Bmp 图像 Windows API 输入输 出设备 PaintBrush

46 交互式系统的逻辑结构(2/5) 图形软件包 介于硬件设备和应用程序之间,起到桥梁作用 内容 对图形软件包的一般要求
图形软件包 介于硬件设备和应用程序之间,起到桥梁作用 内容 图形系统管理程序 显示输出图元的程序 图形变换 交互处理程序 对图形软件包的一般要求 风格好,概念明确一致 易于使用,便于扩充和移植 具有良好的层次结构和模块结构 一般分为三层 最低层 设备驱动程序 中间层 完成基本图元生成,设备管理等 最高层 建立图形数据结构,定义,修改和输出图形 例子:Windows API, OpenGL, DirectX, X/Lib等等

47 交互式系统的逻辑结构(3/5) 应用模型 描述图形对象及他们之间的关系 例如空间中两个立方体的应用模型 与应用程序相关
描述图形对象及他们之间的关系 例如空间中两个立方体的应用模型 包括描述图元的几何数据,属性数据以及相互关系的数据 与应用程序相关 数据模型:完全由数据刻画的应用模型

48 交互式系统的逻辑结构(4/5) 过程模型:有数据和一些过程共同刻画的应用模型

49 交互式系统的逻辑结构(5/5)

50 当前的研究动态(1/7) 造型技术(研究如何在计算机中构造二维、三维物体的模型,并合适表示) 规则形体:欧氏几何方法
(Bezier曲线、曲面、 非均匀有理B样条 NURBS) 不规则形体: (不能用欧氏几何描述,如山,水,草,云,烟等) 分形几何方法 粒子系统 纹理映射 (表面纹理,几何纹理)

51 当前的研究动态(2/7) 真实感图形绘制技术 实体造型 (特征造型,将物体表示成一组特征的集合)
实体造型 (特征造型,将物体表示成一组特征的集合) 基于物理的造型 (根据物体本身的物理特性及其所遵循的物理规律,自动产生它在各种状态下的模型) 基于图像的造型 真实感图形绘制技术 光照明模型 (局部光照模型、整体光照模型) 绘制算法 快速算法,并行算法 基于图像的绘制 (通过图像分析从真实世界获取对象的几何信息和表面纹理信息) 例子

52 当前的研究动态(3/7)

53 当前的研究动态(4/7)

54 当前的研究动态(5/7)

55 当前的研究动态(6/7)

56 当前的研究动态(7/7) 人机交互技术 三维空间的交互、多通道技术、交互的非精确性 与计算机网络技术的紧密结合 远程医疗与诊断
远程导航与维修 远程教育 VRML使用户在三维虚拟场景中漫游网络空间成为可能。

57 网络资源(7/7) 中 国 计 算 机 图 形 学 研 究 会

58 第二章 一个简单的二维光栅图形软件包 Windows API简介
用图形软件包绘图 基本的交互处理 光栅操作

59 用图形软件包绘图(1/6) 图元的声明 扫描转换 绘图纸,屏幕,坐标系 扫描转换:将转换为(像素)点阵表示的图形 顶点(参数) 表示的图形
用户 扫描转换 点阵表示 的图形 显示系统

60 用图形软件包绘图(2/6) SRGP支持的基本图元包括直线段,折线,多边形,圆弧,字符等. 点
COLORREF GetPixel( int x, int y ) const COLORREF SetPixel( int x, int y, COLORREF crColor ); 直线段 CPoint MoveTo( int x, int y ); BOOL LineTo( int x, int y ); 折线 BOOL Polyline( LPPOINT lpPoints, int nCount );

61 用图形软件包绘图(3/6) (x3,y3) (x4,y4) 多变形和矩形
Polygon(LPPOINT lpPoints, int nCount) Rectangle (int x1, int y1, int x2, int y2) 圆弧 BOOL AngleArc( int x, int y, int nRadius, float fStartAngle, float fSweepAngle ); 椭圆弧 BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );x1,y1,x2,y2 左上,右下;X3,Y3起始角射线上,X4,Y4终止角射线上 (x3,y3) (x4,y4)

62 用图形软件包绘图(4/6) 图元的属性 线型、线宽
CPen ( int nPenStyle, int nWidth, COLORREF crColor ); BOOL CreatePen (int nPenStyle,int nWidth, COLORREF crColor); 颜色 三种指定颜色的方式 通过查色表索引值 通过颜色名称 通过红、绿、兰三分量 COLORREF GetBkColor( ) const; COLORREF SetBkColor( COLORREF crColor ); COLORREF GetTextColor( ) const; COLORREF SetTextColor( COLORREF crColor );

63 用图形软件包绘图(5/6) 填充图元及其属性 (封闭图元的两种绘制方式:只画出边框, 填充内部) 椭圆
填充图元及其属性 (封闭图元的两种绘制方式:只画出边框, 填充内部) 椭圆 BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); 多边形 BOOL Polygon( LPPOINT lpPoints, int nCount ); 矩形 BOOL Rectangle( int x1, int y1, int x2, int y2 ); 填充模式 均匀填色 BOOL CreateSolidBrush( COLORREF crColor ); 以图像填充 BOOL CreatePatternBrush( CBitmap* pBitmap );

64 用图形软件包绘图(6/6) 保存和恢复图元的属性: 提高程序的模块化程度
void InquireAttributes(AttributeGroup *group) void SetAttributes(AttributeGroup *group) 在整个模块开始保存各种属性值,而在退出该模块时恢复原有属性值. 字符 (有大量属性:如字体,字形,字型,字间距,行间距等) BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); 点阵字符的含义

65 基本的交互处理(1/3) 设计交互程序的几条原则 逻辑输入设备 简单一致的交互操作序列 在交互的每一阶段,清晰地显示可选项
不能有过多的选项和繁杂的式样 给用户适当的反馈 Undo功能,允许用户取消操作 逻辑输入设备 目标:屏蔽物理设备的差异,获得系统的设备无关性 二维定位设备 键盘设备 设备驱动程序完成从物理设备到逻辑设备的映射 解决方法:菜单、按钮、加亮、变灰、光标变化等等

66 基本的交互处理(2/3) 输入方式 取样(轮询)方式 中断驱动方式 事件驱动方式 不管输入设备有没有变化,都按固定频率去查询它的值.
设备发出中断请求 输入事件存放在事件队列中,系统按先后顺序处理事件队列中的事件. 事件驱动方式

67 基本的交互处理(3/3) 事件驱动方式 简单的程序结构 初始化输入设备; Do{ waitEvent(event);
Switch(event) { Case EVENT1: precedure1; break; Case EVENT2: procedure2; } } while(TRUE);

68 光栅操作 光栅操作是光栅系统的特有操作,这些光栅操作被大量应用于各种窗口系统及相关的图形应用程序中 .
在基于窗口的系统中,选定菜单命令”Edit”,然后按ESC键,菜单出现后又消失,此过程中系统做了什么呢? (1) 把菜单将要覆盖的屏幕区域保存在像素图中; (2) 把系统保存的菜单拷贝到屏幕商; (3) 恢复屏幕区域,把保存的像素图重新拷贝到屏幕上

69 光栅操作 画布(Canvas) 抽象的数据类型,用户可以在其中画图; 包括一个用于绘图的像素图和一些控制信息(如像素大小,当前线型);
具有独立的坐标系,应用程序可以在其中绘图; 系统可以同时有多个画布,只有一个处于激活状态; 屏幕是一个特殊的画布,是唯一被显示的画布. 为使内存中的画布可见,需将其拷贝到屏幕上; 绘图命令的作用对象是处于激活状态的画布; Windows中对应的概念:DC

70 光栅操作 裁剪窗口 为什么裁剪?(有时希望将整个画布划分成若干个区域,相互不影响) 内裁剪:保留窗口之内的图形 外裁剪:保留窗口之外的图形
UINT SetBoundsRect( LPCRECT lpRectBounds, UINT flags ); UINT GetBoundsRect( LPRECT lpRectBounds, UINT flags );

71 dwRop参数指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
位块拷贝 将源画布中的矩形区域内的像素块拷贝到目标区域中,目标区域位于当前激活的画布内. BitBlt (Bit Block Transfer) BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); dwRop参数指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。 (x,y) (xSrs,ySrc)

72 光栅操作 位块拷贝和裁剪

73 光栅操作 显示模式 在光栅系统中,往屏幕上显示图形的过程就是向帧缓存里写数据的过程,该过程由位拷贝函数完成.
- 位拷贝可以在内存与内存之间,内存与帧缓存之间移动位块, - 拷贝的同时对源区域和目标区域的相应元素(像素)间进行指定的逻辑运算. 4中简单的显示模式 覆盖/Replace 或/Or 异或/Xor 与/And

74 光栅操作 Windows中的显示模式 int GetROP2( ) const; 获取绘图模式
int SetROP2( int nDrawMode ); 设置绘图模式 R2_BLACK   只用黑色绘图 R2_WHITE  R2_NOP   用无色绘图 R2_NOT    与背景颜色相反的颜色 R2_COPYPEN   用画笔颜色绘图 R2_NOTCOPYPEN    用与画笔颜色相反的颜色绘图 R2_MERGEPENNOT  R2_MASKPENNOT  R2_MERGENOTPEN  R2_MASKNOTPEN    R2_MERGEPEN    R2_NOTMERGEPEN    R2_MASKPEN    R2_NOTMASKPEN   R2_XORPEN  用把画笔色与背景色进行异或运算后的颜色绘图 R2_NOTXORPEN

75 光栅操作 11001001 Xor 11111111 ------------------- 00110110 多值图像的光栅运算
一个像素需要多个二进制位,相应单元间的按位逻辑运算. 覆盖模式: 用源图像块覆盖屏幕(或其他画布)上的一块区域. 或模式: 保留屏幕上已存在图像的同时再叠加源图像 与模式: 用于擦除屏幕上某块区域内的图像(清零) 异或的用途:光标的显示 Xor

76 第三章 二维线画图元的生成 简单的二维图形显示流程图 扫描转换直线段 扫描转换圆弧 生成圆弧的正负法 线画图元的属性控制

77 简单的二维图形显示流程图(1/2) 扫描转换 简单流程图 扫描转换 顶点(参数) 表示的图形 用户 点阵表示 的图形 光栅显示系统

78 简单的二维图形显示流程图(2/2) 裁剪的顺序 先裁剪 先扫描转换

79 扫描转换直线段(1/7) 扫描转换直线段 求与直线段充分接近的像素集 两点假设 直线段的宽度为1 直线段的斜率:

80 扫描转换直线段(2/7) DDA算法 条件: 直接求交算法: 待扫描转换的直线段: 斜率: 直线方程: 划分区间[x0,x1]:
计算纵坐标: 取整:

81 扫描转换直线段(3/7) 复杂度:乘法+加法+取整 DDA算法(增量算法) 复杂度:加法+取整

82 例:画直线段P0(0,0)--P1(5,2) k=2/5=0.4 x y int(y+0.5) 1 2 3 4 5 0.4 0.8 1
1 2 3 4 5 0.4 0.8 1 1.2 1 2 1.6 2.0 2

83 直线DDA算法核心代码 for (x=xa;x<=xb;x++) {
pDC->SetPixel (x,int(y+0.5),c); y=y+k; }

84 直线DDA算法的VC代码 int x,y; void CMyView:: OnDdaline() {
CDC* pDC=GetDC(); //获得设备指针 int xa=100,ya=300,xb=300,yb=200,c=RGB(255,0,0); //定义直线的两端点,直线颜色 int x,y; float dx, dy, k; dx=(float)(xb-xa), dy=(float)(yb-ya); k=dy/dx, y=ya;

85 直线DDA算法VC代码 if (abs(k)<1) { for (x=xa; x<=xb; x++)
{ pDC->SetPixel (x,int(y+0.5),c); y=y+k; } } if(abs(k)>=1) //当k1的情形 for (y=ya; y<=yb; y++) { pDC->SetPixel (int(x+0.5),y,c); x=x+1/k; } ReleaseDC(pDC);

86 扫描转换直线段(4/7) 中点算法 目标:消除DDA算法中的浮点运算 条件: 同DDA算法 斜率: 直线段的隐式方程

87 扫描转换直线段(5/7) 直线的正负划分性 中点算法:

88 扫描转换直线段(6/7)

89 扫描转换直线段(7/7) 判别式 取判别式 递推计算 初值条件 程序:

90 中点画线法 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=a+a+b; //即d0 d1=a+a, d2=a+a+b+b; // d1为右上方点判断式增量 d2为右方点判断式增量, 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 */

91 Bresenham画线算法 在直线生成的算法中Bresenham算法是最有效的算法之一。 使用最广泛,最初的数字绘图仪设计。
About Bresenham E.Jack Bresenham Professor of Computer Science Ph.D., Stanford University, 1964 MSIE, Stanford University, 1960 BSEE, University of New Mexico, 1959 Retired from 27 years service at IBM as a Senior Technical Staff Member in Have taught 10 years at Winthrop. Holder of five patents.

92 Bresenham画线算法 采用增量计算,对于每一列,只要检查一个误差项的符号。 d0=0, d=d+k (k为直线斜率)
原理: 直线与垂直网格线求交点,交点最近的象素。 d0=0, d=d+k (k为直线斜率) (假设k<1,当d≥1时,减1) 保证d在0、1之间。 d>0.5, (X0,Y0)→ (X0+1,Y0+1) d<0.5, (X0,Y0)→ (X0+1,Y0)

93 为方便计算,令e=d-0.5, e的初值为-0.5, 增量为k。 e=e+k 当e≥0时,取当前象素(xi,yi)的右上方象素(xi+1,yi+1); 而当e<0时,更接近于右方象素(xi+1,yi)。 一旦e≥0, 就把它减去1,这样保证e在 [ ] 之间? -1、0

94 例:Line: P0(0, 0), P1(5,2) k=dy/dx=0.4 x y e =0.3-1

95 Bresenham画线算法 void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float k, e; dx = x1-x0, dy = y1- y0, k=dy/dx; e=-0.5, x=x0, y=y0; for (i=0; i<=dx; i++) { drawpixel (x, y, color); x=x+1,e=e+k; if (e0) { y++, e=e-1;} }

96 Bresenham画线算法 e0’=-0.5*2*dx= -dx ei+1’ = ei’ +2*dy+2*dx ei’>=0
可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换: e0’=-0.5*2*dx= -dx ei+1’ = ei’ +2*dy+2*dx ei’>=0 ei+1’ = ei’ +2*dy ei’<0

97 Bresenham画线算法 Int- Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy , e; dx = x1-x0; dy = y1- y0; e=- dx , x=x0, y=y0; for (i=0; idx; i++) { drawpixel (x, y, color); x=x+1,e=e+2*dy; if (e0) { y++, e=e-2*dx;} }

98 Bresenham算法的优点是: 1、不必计算直线之斜率,因此不做除法; 2、不用浮点数,只用整数; 3、只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现。 Bresenham 算法速度很快,并适于用硬件实现。

99 ei+1=ei+2*Dy 则有e1= e0+2*8 =-10+16=6 ei>=0
Bresenham 画线例 直线端点为(20,10)和(30,18), 用 Bresenham 法画线 解: Dx = 10, Dy = 8, k = Dy / Dx = 0.8, 2 Dy =16, 2 Dy-2Dx =-4 e0 = - Dx =-10, ei<0 ei+1=ei+2*Dy 则有e1= e0+2*8 =-10+16=6 ei>=0 ei+1 = ei +2*dy+2*dx = ei-4

100 画初始点(20, 10), 并根据判别式确定沿线段路径的后续像素位置如下表:
Bresenham 画线例 直线端点为(20,10)和(30,18) 画初始点(20, 10), 并根据判别式确定沿线段路径的后续像素位置如下表: 29 21 22 23 24 25 26 20 28 27 10 18 17 16 15 13 14 12 11 19 30

101 生成直线算法的进一步改进 1987年有人提出二步法,即每循环一次不是绘制一个象素,而是绘制二个象素,这样无疑可以把生成直线的速度提高一倍。
同样,我们先考虑当直线的斜率m属于区间[0,1]时,在x方向每增加两个单元,只可能出现以下的四种情况。 A B C D

102 生成直线算法的进一步改进 ε(xi+2)=yi+2-yir-0.5 假定 当yi+2-yir≤0.5时绘制图A。
我们利用前述方法来讨论这个问题。令 ε(xi+2)=yi+2-yir-0.5 假定 当yi+2-yir≤0.5时绘制图A。 当0.5 ≤ yi+2-yir≤1时绘制图B。 当1 ≤ yi+2-yir≤1.5时绘制图C。 当yi+2-yir≥1.5时绘制图D。 A B C D

103 ε(xi+4)=yi+4 - yi+2,r - 0.5 =yi+2 + 2m - yi+2,r - 0.5
yi+2 - yir + 2m - 0.5, 当ε(xi+2) ≤ 0 yi+2 - yir + 2m , 当1≥ε(xi+2)>0 yi+2 - yir + 2m , 当ε(xi+2)>1 ε(xi+2) + 2m, 当ε(xi+2) ≤ 0 ε(xi+2) + 2m - 1, 当1≥ε(xi+2)>0 ε(xi+2) + 2m - 2, 当ε(xi+2)>1 可取 ε(x3)=y3 - y = 2m - 0.5 相应的程序略 ={ ={

104 扫描转换圆弧(1/8) 处理对象:圆心在原点的圆弧 圆的八对称性 生成圆弧的隐函数方法

105 扫描转换圆弧(2/8) 生成圆弧的参数方程方法 圆弧的正负划分性

106 扫描转换圆弧 生成P点上方的弧段的弧段 X递增一个像素,y递增多少? 9 1 2 3 4 5 6 8 7 10

107 扫描转换圆弧 生成P点下方的弧段 Y递增一个像素,x递增多少? 9 1 2 3 4 5 6 8 7 10

108 扫描转换圆弧(3/8) 生成圆弧的中点算法 考虑对象: 的1/8圆弧段 在此圆弧段内,圆弧上各点的变化率

109 生成圆弧的中点算法 与直线情形类似 F(x,y)=x2+y2-R2=0, 切线斜率m in [-1,0]
中点 M=(xp+1,yp-0.5), 当F(M)<0时,M在圆内,说明P1距离圆弧更近,取P1,当F(M)>0时,P取P2

110 若 d<0, 则取P2为下一象素,而且再下一象素的判别式为
第 一个象素是(0,R),判别式d的初始值为

111 算法过程 MidPointCircle(int r int color) { int x,y; float d;
x=0; y=r; d=1.25-r; circlepoints (x,y,color); //显示圆弧上的八个对称点 while(x<=y) { if(d<0) d+=2*x+3; else { d+=2*(x-y)+5; y--; } x++; circlepoints (x,y,color); }

112 为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
使用e =d 代替d e0=1-R

113 生成圆弧的中点算法 第 一个象素是(0,R), E的递推公式: Ei+1=2(xi+1 )+3 = Ei+2
SE= 的初始值为: 5-2*R SE的递推公式: SEi+1=2[(xi+1)-(yi -1)]+5 = SEi+4

114 椭圆的扫描转换 隐函数形式:F(x,y)= b2x2+a2y2-a2b2=0 椭圆的4对称性,只考虑第一象限椭圆弧生成,
椭圆方程 x2/a2 + y2/b2 = 1 隐函数形式:F(x,y)= b2x2+a2y2-a2b2=0 椭圆的4对称性,只考虑第一象限椭圆弧生成, 分上下两部分,以弧上斜率为-1的点(法向两个分量相等的点)作为分界点。 椭圆上一点处的法向:

115 F(x,y)= b2x2+a2y2-a2b2=0 弧上一点(x,y) 处的法向量 从而弧上斜率为-1的点满足: 2b2x = 2a2y 可求得斜率为-1的点坐标:

116 椭圆的中点画法 与圆弧中点算法类似:确定一个象素后,接着在 两个候选象素的中点计算一个判别式的值,由判别 式的符号确定更近的点
考虑P点上方的椭圆弧段:斜率满足-1≤m≤0,下一 像素可能是中点的上方或下方 (Xp,Yp) 中点(Xp+1,Xp-0.5) d1=F(Xp+1,Yp-0.5)= b2(Xp+1)2+a2(Yp-0.5)2-a2b2

117 若d1<0,中心在椭圆内,取正右方象素,判别式更新为
d1'=F(Xp+2,Yp-0.5)=d1+b2(2Xp+3) d1的增量为 b2(2Xp+3) 当d1≥0,中点在椭圆外,取右下方象素,更新判别式: d1'=F(Xp+2,Yp-1.5)=d1+b2(2Xp+3)+a2(-2Yp+2) 沿右下方,判别式d1的增量为 b2(2Xp+3)+a2(-2Yp+2) d1 ≥ 0 d1<0

118 椭圆的扫描转换 椭圆弧起点为(0,b),d1判别式的初始条件: d10=F(1, b-0.5)=b2+a2(-b+0.25)
F(x,y)= b2x2+a2y2-a2b2=0 椭圆弧起点为(0,b),d1判别式的初始条件: d10=F(1, b-0.5)=b2+a2(-b+0.25) 转入P点下方的椭圆弧,斜率-1≤ 1/m≤0, y递减一个像素, x至多递增一个像素. 下一象素可能是一正下方或右下方,x和y角色互换,此时判别式要初始化。 下部分也可以:从 x轴的 x=a, y=0 点逆时钟方向开始计算

119 生成圆弧的多边形逼近法 用正多边形近似代替圆: 正内接多边形,等面积和正多边形
当圆的内接多边形边数足够多时,该多边形可以和圆接近到任意程度,因此在允许的范围内,可以用显示多边形代替显示圆。显示多边形的边(直线)可用中点或Bresenham算法来实现。 用正多边形近似代替圆: 正内接多边形,等面积和正多边形

120 生成圆弧的多边形逼近法 设要绘的圆的圆心为c(xc,yc),半径为R。设内接多边形的一个顶点为Pi(xi,yi),cPi的幅角为θi,则:
α θi Pi+1 Pi 用正多边形迫近圆弧法 xi = xc + Rcosθi yi = yc + Rsinθi cos(θi+α)=cosθi cosα-sinθi sinα sin(θi+α)= sinθi sinα+cosθi cosα 设多边形每条边所对的圆心角为α, 则下一个顶点Pi+1的坐标为 xi+1 = xc + Rcos(θi+α) = xc + (xi - xc)cosα- (yi - yc)sinα yi+1 = yc + Rsin(θi+ α) = xc + (xi - xc)sinα- (yi - yc)cosα

121 生成圆弧的多边形逼近法 若c为原点,则用矩阵表示为 一个顶点只需4次乘法,共4n次乘法, 外加直线段的中点算法的计算量。 Pi+1 Pi α
用正多边形迫近圆弧法 一个顶点只需4次乘法,共4n次乘法, 外加直线段的中点算法的计算量。

122 生成圆弧的多边形逼近法 误差分析 用递推公式要注意误差积累问题 (P58-59) 多边形直线点,带误差, 误差 A的特征值λ1,λ2
对初始误差稳定。 用矢量运算可以简化计算, 推出求顶点的逆推公式(p60)

123 生成圆弧的多边形逼近法 误差分析 用递推公式要注意误差积累问题(P58-59) 多边形直线点,带误差, 误差
A的特征值|λ1|=| λ2 |=1 对初始误差稳定。

124 扫描转换圆弧 生成圆弧的多边形逼近法 问题: 给定最大逼近误差delta, 确定多边形的边数n .
R-Rcos(α/2)<=delta cos (α/2)>=(R-delta)/R α <=2arccos (R-delta)/R 边数 n=360/ α

125 圆的等面积多边形逼近法 (1) 首先利用等面积,求多边形径长 从而求所有顶点坐标值 (2) 由逼近误差值,确定边所对应的圆心角α。

126 圆的等面积多边形逼近法 Pi+1 C P1 O B D E 扇形面积等于三角形面积 则有:

127 生成圆弧的正负法(1/4) 正负法简介 由隐函数形式F(X,Y)=0,作判断点与曲线之间关系. 基本原理

128 生成圆弧的正负法 易画曲线: 好处:只需判断F(Pi)的符号,不会有累计误差,计算方便,但需要满足一定条件:
如: Y=sin(1/x), 会在x点附近,震荡。 易画曲线: (1)F(X,Y)具有正负划分性, (2)F(X,Y)二阶连续 (3)曲线上各点的曲率半径大于步长△, 即在△的度量下,曲线较平坦。

129 生成圆弧的正负法(2/4) 初始定向 (从起始点P0(x0,y0)出发,向哪个方向前进) 确定 的符号 (根据曲线所处的局部坐标系象限确定)
确定 的符号 (根据曲线所处的局部坐标系象限确定) 对于单调曲线,符号一经确定,就不再改变

130 生成圆弧的正负法(3/4) 前进规则 取判别式

131 生成圆弧的正负法(4/4) 正负法生成圆弧 考虑第一像限圆弧段 圆弧是易画曲线 程序:见63页

132 Bresenham法生成圆弧: 正负法生成圆弧:

133 线画图元的属性控制 线宽、线型、颜色 线宽控制 刷子:刷子形状(圆,方)朝向,对线型的影响

134 线画图元的属性控制(1/5) 线宽控制 像素复制方法 (在扫描转换的同时显示k个像素) 优点: 缺点: 实现简单
线段两端要么为水平的,要么是竖直的 折线顶点处有缺口

135 线画图元的属性控制(2/5) 图元的宽度不均匀 产生宽度为偶数像素的图元效果不好

136 2.移动刷子产生宽图元 线宽与线段的斜率有关 切线斜率向 变化时,宽度变大 用方刷比用像素复制得到的线条粗

137 3.用填充图形表示宽图元 用等距线方法: 线宽均匀 端口处与边垂直 生成的图形质量高 缺点: - 计算量大 - 有些图形的等距线难以获得

138 线型控制 用位屏蔽器实现 缺陷: 位屏蔽器中每一位对应的是一个像素,而不是单位长度,会使笔画的长度与图元的斜率有关.对于工程图来说不能满足要求 工程图,笔画作单独的扫描转换

139 本章要点 直线段与圆弧的扫描转换中点算法 DDA算法, Bresenham算法 圆弧的各种算法

140 习题 将中点画线方法推广,使之能画出任意斜率的直线
用中点画线法或 Bresenham 算法,指出从(0,0)到(6,18)间的直线段的象素位置。 编写按逆时针方向生成中心在原点的第一个8分圆的中点画圆算法,导出递推公式 利用抛物线f(x,y)=x-y2=0的正负划分性和对称性,设计一个中点算法,生成它在[-20,20]之间的图形。

141 第四章 填充图元的生成 扫描转换矩形 扫描转换多边形 扫描转换扇形区域 区域填充 以图像填充区域 字符的表示与输出

142 一般步骤 确定哪些像素位于填充图元的内部 确定以什么颜色填充这些像素

143 扫描转换矩形(1/2) 方法: void FillRectangle(Rectangle *rect,int color)
{ int x,y; for(y = rect->ymin; y <= rect->ymax; y++) for(x = rect->xmin;x <= rect->xmax;x++) PutPixel(x,y,color); }/*end of FillRectangle() */

144 扫描转换矩形(2/ 2) 问题: 矩形是简单的多边形,那么为什么要单独处理矩形? 共享边界如何处理? 原则:左闭右开,下闭上开 属于谁?

145 扫描转换多边形(1/ 19) 多边形的表示方法 顶点表示 点阵表示 扫描转换多边形:将顶点表示形式转换成点阵表示形式
几何意义强,占空间少,易于几何变换 点阵表示 无几何信息,光栅系统显示时采用 扫描转换多边形:将顶点表示形式转换成点阵表示形式

146 扫描转换多边形(2/ 19) 逐点判断算法 方法 void FillPolygonPbyP(Polygon *P, int polygonColor) { int x,y; for(y = ymin;y <= ymax;y++) for(x = xmin;x <= xmax;x++) if(IsInside(P,x,y)) PutPixel(x,y,polygonColor); else PutPixel(x,y,backgroundColor); }/*end of FillPolygonPbyP() */

147 扫描转换多边形(3/ 19) 问题:如何判别点(x,y)关于多边形区域P的内外关系? 射线法 步骤: 奇异情况处理 从待判别点v发出射线
求交点个数k K的奇偶性决定了点与多边形的内外关系 奇异情况处理 通过多边形顶点的情况, 如果本该是一个交点的 被算做了两个交点,或 反过来,就会使判断结果 错误. (一般可使射线不交 于多边形的顶点, 如通过某边的中点)

148 扫描转换多边形(4/ 19) 累计角度法 步骤 奇异情况处理 即边在pipi+1上,预处理阶段进行处理 离散计算方法:编码方法
从v点向多边形P顶点发出射线,形成有向角 计算有相交的和,得出结论 奇异情况处理 即边在pipi+1上,预处理阶段进行处理 离散计算方法:编码方法

149 扫描转换多边形(4/ 19) 注意: 1. 保证 的绝对值不大于2; 2.当 编码方法 步骤 预处理:测试v是否在多边形P的边上;
以v为原点建立局部坐标系vxy,对其各象限按逆时针顺序编码,分别记为0,1,2,3, 对多边形各顶点编码,Pi落在哪个象限,其编码即为该象限的编码,记为IPi; 对多边形的各边编码,边PiPi+1的编码记为 计算 ,若=0,则位于P之外,若=±4,则v位于P之内. 注意: 1. 保证 的绝对值不大于2; 2.当 的绝对值等于2的情况 注意: 1. 保证 的绝对值不大于2; 2.当

150 扫描转换多边形(5/ 19) 扫描线算法 逐点判断算法优点:简单 算法缺点:计算量太大,速度慢
目标:充分利用像素之间的连贯性,提高算法效率,避免逐点判断和反复求交 处理对象:非自交多边形( 边与边除顶点外无其他交点)

151 扫描转换多边形(6/ 19) 演示:MorphInk 基本原理 一条扫描线与多边形的边有偶数个交点 扫描线的连贯性 步骤: 求交 排序 填充

152 扫描转换多边形(7/ 19) 边的连贯性 第一类交点:位于同一条边上的后继交点 第二类交点:新出现的边与扫描线的交点
为减少求交的计算量,要利用一条边与相继的两条扫描线的交点间的连贯性. 第一类交点:位于同一条边上的后继交点 若x为该边与y=e的交点的横坐标,边的斜率为m,则此边与y=d的交点的横坐标为x’=x+1/m. 第二类交点:新出现的边与扫描线的交点

153 扫描转换多边形(8/ 19) 交点的取整规则 要求:使生成的像素全部位于多边形之内 假定非水平边与扫描线y=e 相交,交点的横坐标为x,
用于线画图元扫描转换的四舍五入原则导致部分像素位于多边形之外,从而不可用 假定非水平边与扫描线y=e 相交,交点的横坐标为x, 规则如下

154 扫描转换多边形(9/ 19) X为小数 (a)交点位于左边之上,向右取整 (b)交点位于右边之上,向左取整

155 扫描转换多边形(10/ 19)) 2. (x,e)交点落在像素之上 (a) (x,e)位于左边之上,属于多边形
(b) (x,e)位于右边之上,不属于多边形

156 扫描转换多边形(11/ 19) 3. 交点为多边形的顶点 每条边视为下端闭,上端开 (a) 算作1个交点 (b) 算作1个交点
3. 交点为多边形的顶点 每条边视为下端闭,上端开 (a) 算作1个交点 (b) 算作1个交点 (c) 算作2个交点 (d) 算作0个交点

157 扫描转换多边形(12/ 19) 特殊情况处理 水平边:扔掉! 尖角:反混淆

158 扫描转换多边形(13/ 19) 数据结构 边 typedef struct {int ymax; float x, deltax;
边的分类表E( Edge *edges[ ]) 按照边的下端点y坐标对非水平边进行分类的指针数组 活化边表AEL(Edge *active) 纪录与当前扫描线相交的边(交点) typedef struct {int ymax; float x, deltax; Edge *nextEdge; }Edge;

159 扫描转换多边形(14/ 19)

160 扫描转换多边形(15/ 19) 算法 1、建立ET; 2、将扫描线纵坐标y的初值置为ET中非空元素的最小序号,如在上图中,y=1;
3、置AEL为空; 4、执行下列步骤直至ET和AEL都为空. 4.1、如ET中的第y类非空,则将其中的所有边取出并插入AEL中; 4.2、如果有新边插入AEL,则对AEL中各边排序; 4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,…),将每对边中x坐标按规则取整,获得有效的填充区段,再填充. 4.4、将当前扫描线纵坐标y值递值1; 4.5、将AEL中满足y=ymax边删去(因为每条边被看作下闭上开的); 4.6、对AEL中剩下的每一条边的x递增deltax,即x = x+deltax.

161 扫描转换多边形(16/ 19) 边缘填充算法 (扫描线算法需要对AEL中的各边排序,排序工作可以利用求余运算代替)
原理:以求余运算代替扫描线算法中的排序运算 求余(A=0xFFFFFFFF) 算法1:(以扫描线为中心的边缘填充算法) 1、将当前扫描线上的所有象素着上值为 的颜色; 2、求余: for(i = 0;i <= m; i++) 在当前扫描线上,从x坐标为交点向右求余;

162 扫描转换多边形(17/ 19)

163 扫描转换多边形(18/ 19) 1、将绘图窗口的背景色置为 ; 2、对多边形的每一条非水平边做: 算法2:(以边为中心的边缘填充算法)
1、将绘图窗口的背景色置为 ; 2、对多边形的每一条非水平边做: 从该边上的每个象素开始向右求余; 算法2:(以边为中心的边缘填充算法)

164 扫描转换多边形(19/ 19)

165 扫描转换扇形区域(1/5) 扇形区域的描述 原理:同扫描转换多边形 问题:如何确定扫描线与直线段和圆弧段的相交顺序 方法:分类
按点 和 点所处象限的不同,需要将扇形区域分成 4×4=16种情况

166 扫描转换扇形区域(2/5) 假设 点落在第一象限 ,扇形区域的扫描转换 分四种情况 1、 落在第一象限

167 扫描转换扇形区域(3/5) 2、 落在第二象限,此时又分为两种情况 当 时

168 扫描转换扇形区域(4/5) 3、 落在第三象限 4、 落在第四象限

169 扫描转换扇形区域(5/5) 遗留问题:当 落在其它区域时? 其它方法: 多边形迫近方法

170 区域填充(1/10) 区域:点阵表示的图形,像素集合 表示方法:内点表示、边界表示 内点表示 枚举出区域内部的所有像素
内部的所有像素着同一个颜色 边界像素像素着与内部像素不同的颜色 边界表示 枚举出边界上所有的像素 边界上的所有像素着同一颜色 内部像素着与边界像素不同的颜色

171 区域填充(2/10) 区域填充 将指定的颜色从种子点扩展到整个区域的过程,对区域重新着色. 区域的内点表示与边界表示

172 区域填充(3/10) 要求区域是连通的 连通性:4连通、8连通 4连通: 8连通

173 区域填充(4/10) 4连通与8连通区域的区别 连通性 4连通区域也是8连通区域
连通性 4连通区域也是8连通区域 对边界的要求 4连通区域的边界只需8连通,而8连通区域的边界必须是4连通的

174 区域填充(5/10) 递归填充算法 内点表示的4连通区域
void FloodFill4(int x, int y, int oldColor, int newColor) { if(GetPixel(x,y) == oldColor) { PutPixel(x,y,newColor); FloodFill4(x,y+1,oldColor,newColor); FloodFill4(x,y-1,oldColor,newColor); FloodFill4(x-1,y,oldColor,newColor); FloodFill4(x+1,y,oldColor,newColor); } }/*end of FloodFill4() */

175 区域填充(6/10)

176 种子填充算法(四向算法):允许从四个方向寻找下一象素,利用栈结构实现。
算法:种子象素入栈,当栈非空时,重复执行: (1)栈顶象素出栈; (2)将出栈象素置成多边形色; (3)四向检查象素,若其中某个象素不在边界对未置成 多边形色,该象素入栈。 可用于填充带内孔的平面区域。

177 缺点: (1) 有些象素会入栈多次,降低算法效率;栈结构占空间。 (2) 递归执行,算法简单,但效率不高,区域内每一象素都引起一次递归,进/出栈,费时费内存。 改进算法,减少递归次数。 解决方法是用扫描线填充算法;

178 4 3 2 1 S1 0 1 2 3 4 5 A. 简单的种子填充算法 例:下图情况堆栈内容看黑板 1. 初始化:种子像素入栈,当栈非空
1. 初始化:种子像素入栈,当栈非空 时,重复2~4的步骤 2. 栈顶像素出栈 3. 将出栈像素置为多边形颜色 4. 按右、上、左、下顺序依次检查与 出栈像素相邻的四个像素,若其中 某个像素不在边界上且未置成多边 形色,则该像素入栈 5. 当堆栈为空时,算法终止 4 3 2 1 S1

179 区域填充(7/10) 边界表示的4连通区域 void BoundaryFill4(int x,int y,int oldColor,int newColor) { int color; color = GetPixel(x,y); if((color != boundaryColor) && (color != newColor)) { PutPixel(x,y,newColor); BoundaryFill4(x,y+1,oldColor,newColor); BoundaryFill4(x,y-1,oldColor,newColor); BoundaryFill4(x-1,y,oldColor,newColor); BoundaryFill4(x+1,y,oldColor,newColor); } }/*end of BoundaryFill4() */

180 区域填充(9/10) 扫描线算法 目标:减少递归层次 算法思路 Step1:栈顶象素出栈,
到边界象素为止,即填充区间。 Step3:检查上下扫描线,选相应区间的最右象素作种子象 素入栈。 特点:由区域算法定区间(区段),再定上、下相邻区间

181 区域填充(9/10) 步骤 1、填充并确定种子区段; 2、初始化:将种子区段压入堆栈; 3、出栈:如果堆栈为空,则算法结束;否则取栈顶元素
(y,xLeft,xRight),以纵坐标为y的扫描线为 当前扫描线,[xLeft,xRight]为搜索区间; 4、填充并确定新的区段.确定当前扫描线上、下相邻的两条 扫描线上与区段(y,xleft,xRight)连通的位于给定区域 内的区段。

182 区域填充(10/10)

183 例: xL xR s B. 扫描线种子填充算法 为减少像素重复入栈,限定任一扫描线与多边形相交区间, 只取一个种子像素
1. 初始化:种子像素入栈,当栈非空时,重 复2~6的步骤 2. 栈顶像素出栈 3. 沿扫描线对种子像素的左右像素进行填充, 直至边界,从而填满该区间 4. 区间内最左和最右像素分别记为 xL 和 xR 5. 在区间[xL, xR]中检查与当前扫描线相邻的 上下两条扫描线是否全为边界或已经填充, 若存在非边界、未填充的像素,将检查区 间的最右像素作种子入栈 6. 当堆栈为空时,算法终止 11 10 9 8 7 6 5 4 3 2 1 s 分析堆栈内容

184 多边形扫描转换与区域填充方法比较 都是光栅图形面着色,用于真实感图形显示。 可相互转换。 不同点:
1.基本思想不同;前者用于将顶点表示转换成点阵表示;后者只改变区域内填充颜色,没有改变表示方法。 2.对边界的要求不同 前者:只要求扫描线与多边形边界交点个数为偶数。 后者:区域封闭,防止递归填充跨界。 3.基本的条件不同 前者:从边界顶点信息出发。 后者:区域内种子点。

185 以图像填充区域(1/3) 基本问题 四种填充方法: 建立绘图空间与纹理(图像)空间的1-1映射
(1)均匀着色方法;(2)位图不透明;(3)位图透明;(4)像素图填充。 基本问题 建立绘图空间与纹理(图像)空间的1-1映射 方法1:建立整个绘图空间与图像空间的1-1映射 图像(纹理)

186 以图像填充区域(2/3) 假定图像是M*N大小, 若用于填充的图像较小,将其周期性排列.
像素(x, y)的颜色值为pattern[x%M][y%N]

187 方法1:建立整个绘图空间与图像空间的1-1映射

188 以图像填充区域(3/3) 方法2:建立区域局部坐标空间与图像空间的1-1映射
像素(x,y)的颜色值,先求得它在局部坐标系O’x’y’中的坐标(x’,y’),然后才能确定对应的颜色值为pattern[x’%M][y’%N]

189 方法1:建立整个绘图空间与图像空间的1-1映射
方法2:建立区域局部坐标空间与图像空间的1-1映射

190 字符的表示与输出 字符集 点阵字体 矢量字体 矢量字体的变换,显示,存储

191 上机作业 1、实现已知顶点的多边形有序边扫描线转换算法。
2、实现已知区域的四连通种子填充算法和扫描线种子填充算法。要求种子点(x,y)可交互输入 实验报告要求: 1.  描述各个作业使用的算法和数据结构,并说明理由。如果有个人的创新工作,则应该详细说明。 2 简要说明实现的步骤,并总结实现的质量,如哪些方面实现的较好、哪些方面尚需完善、哪些方面未实现等(如有动态演示的闪烁问题等)。

192 C的代码如下 //用TURBO C实现 #include "stdio.h" #include "graphics.h"
#include "process.h" #define MAX 100 #define HEIGHT 480 typedef struct { int x; int y; } dcPt; //点结构

193 多边形结构体 typedef struct { int polygonnum; // 多边形顶点个数,scanfill函数中的cnt参数
dcPt verteces[MAX]; // 多边形顶点数组,scanfill函数中的*pts参数 //以下程序多次用到。 }Polygon; //多边形结构

194 yUpper xIntersect dxPerScan △X next
边结构(单链) typedef struct tEdge { int yUpper; float xIntersect, dxPerScan; struct tEdge *next; }Edge; //边结构(单链) yUpper xIntersect dxPerScan △X next //程序中用到的边表edges数组和活性边 Edge *edges[HEIGHT], *active;

195 怎样构造边结构? //用函数makeEdgeRec实现, //该函数调用了插入边记录的insertEdge函数
//将构成的边指针edge插入边表edges[] //参数lower, upper,表示一条边的高低两点, void makeEdgeRec( dcPt lower, dcPt upper, int yComp, Edge *edge, Edge *edges[] )

196 p0 p1 p4 p2 p3 { edge->xIntersect=lower.x;
edge->dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y); if(upper.y<yComp) //是否单调 edge->yUpper=upper.y-1; //算一个点 else edge->yUpper=upper.y; insertEdge(edges[lower.y],edge); } p0 p1 p2 p3 p4

197 ^ ^ ^ ^ ^ ^ 初始化边表edges数组代码 for(i=0;i<HEIGHT;i++) //初始化NET表 {
edges[i]=(Edge *)malloc(sizeof(Edge)); edges[i]->next=NULL; } ^ ….. ^ ^ ^ ^ ^

198 利用多边形的非水平边建立边表数组edges
buildEdgelist(int cnt, dcPt *pts, Edge *edges[]) // buildEdgelist函数的功能是:建立新边表edges //该函数调用了构造边记录函数makeEdgeRec

199 buildEdgelist函数(1) p0 p1 p4 第1条边由点p4和p0组成。 P3为Prev点,p2为next点 p2 p3
void buildEdgelist(int cnt,dcPt *pts,Edge *edges[]) { Edge *edge; dcPt v1,v2; int i, yPrev=pts[cnt-2].y; v1.x=pts[cnt-1].x; v1.y=pts[cnt-1].y; //第1条边由点pts[cnt-1]和pts[0]组成。 p0 p1 p2 p3 p4 第1条边由点p4和p0组成。 P3为Prev点,p2为next点

200 buildEdgelist函数(2) p0 p1 p4 p2 p3 for(i=0;i<cnt;i++) {
v2.x=pts[i].x; v2.y=pts[i].y; if(v1.y!=v2.y) { dge=(Edge *)malloc(sizeof(Edge)); if(v1.y<v2.y) makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges); else makeEdgeRec(v2,v1,yPrev,edge,edges); } yPrev=v1.y; v1=v2; p0 p1 p2 p3 p4

201 /* insertEdge函数的功能是: 将多边形的边 edge插入边表list(相当于edges表或NET表) 用edge的xIntersect与list->next->xIntersect逐一比较,进行插入*/ void insertEdge(Edge *list, Edge *edge) { Edge *p,*q=list; p=q->next;

202 while(p!=NULL) { if( edge->xIntersect < p->xIntersect ) p=NULL; // else q=p; p=p->next; } edge->next=q->next; q->next=edge;

203 //函数yNext的功能是:跳过水平边找下一个点的Y值
int yNext (int k,int cnt,dcPt *pts) { int j; if((k+1)>(cnt-1)) //若当前为最后一个点 j=0; else j=k+1; while(pts[k].y==pts[j].y)//若当前点与下一点为水平边 if((j+1)>(cnt-1)) j++; return(pts[j].y); }

204 //建立当前扫描线的活性边 void buildActivelist(int scan,Edge *active,Edge *edges[]) { Edge *p,*q; p=edges[scan]->next; while(p) q=(Edge *)malloc(sizeof(Edge)); q->yUpper=p->yUpper; q->xIntersect=p->xIntersect; q->dxPerScan=p->dxPerScan; insertEdge(active,q);//将edges[scan]的边链表插入活性边表 p=p->next; }

205 //对当前扫描线scan填充 void fillscan(int scan,Edge *active) { Edge *p1,*p2;
int i; p1=active->next; while(p1) p2=p1->next; for(i=p1->xIntersect;i<p2->xIntersect;i++) putpixel(i,scan,15); p1=p2->next; //跳过偶->奇区间 }

206 void deleteAfter(Edge *q) //删除*q的下一个边
{ Edge *p=q->next; q->next=p->next; free(p); }

207 //更新活性边表 void updateActivelist(int scan,Edge *active) {
Edge *q=active,*p=active->next; while(p) if(scan>=p->yUpper) //删除高点为当前扫描线的边 p=p->next; deleteAfter(q); } else { //更新交点值 p->xIntersect=p->xIntersect + p->dxPerScan; q=p;

208 //活性边重排序 void resortActivelist(Edge *active) {
Edge *q,*p=active->next; active->next=NULL; while(p) q=p->next; insertEdge(active,p); p=q; }

209 // 扫描线转换(1) void scanFill(int cnt,dcPt *pts) {
Edge *edges[HEIGHT],*active; /* ? */ Edge *p; int i,scan; for(i=0;i<HEIGHT;i++)//初始化NET表 edges[i]=(Edge *)malloc(sizeof(Edge)); edges[i]->next=NULL; } buildEdgelist(cnt,pts,edges); //将多边形各边插入NET表

210 //扫描线转换(2) active=(Edge *)malloc(sizeof(Edge));//申请活性边表空间
active->next=NULL;// 活性边表初始化 for(scan=0;scan<HEIGHT;scan++) //对每一条扫描线 { buildActivelist(scan,active,edges); //建立当前扫描线的活性边 if(active->next!=NULL) fillscan(scan,active); // 填充 updateActivelist(scan,active);//更新 resortActivelist(active); //重排序 }

211 //扫描线转换(3) // 以下释放活性边和边表的动态存储空间 p=active; while(p!=NULL) {
active=active->next; free(p); }

212 //扫描线转换(4) for(i=0;i<HEIGHT;i++) { p=edges[i]; while(p!=NULL)
edges[i]=p->next; free(p); }

213 主函数(1) main() { int n,i,x,y,gdriver=DETECT,gmode; dcPt *pts;
initgraph(&gdriver,&gmode,""); printf("Input The Vertex's Number Of PolyGon:"); scanf(“%d”,&n); //输入多边形顶点个数 pts=(dcPt *)malloc(n*sizeof(dcPt)); for(i=0;i<n;i++) //输入多边形顶点坐标 printf("\n Input (X,Y) Of The %dth Vertex's: ",i); scanf("%d%d",&x,&y); pts[i].x=x; pts[i].y=y; }

214 主函数(2) system("cls"); /* for(i=0;i<n-1;i++)
line(pts[i].x,pts[i].y,pts[i+1].x,pts[i+1].y); line(pts[n-1].x,pts[n-1].y,pts[0].x,pts[0].y); */ scanFill(n,pts); printf("Press any key to return...\n"); getch(); closegraph(); }

215 第五章 二维光栅图形的混淆与反混淆 混淆现象 反混淆方法

216 混淆(antialiasing) 在光栅显示器上显示图形时,直线段或图形边界呈锯齿状:图形信号连续,光栅显示系统中,离散表示。
光栅图形混淆: 阶梯状边界; 图形细节失真; 狭小图形遗失:动画序列中时隐时现,产生闪烁。

217 混淆现象(1/3) 不光滑(阶梯状)的图形边界 例子:PaintBrush

218 混淆现象(2/3) 图形细节失真

219 混淆现象(3/3) 狭小图形的遗失与动态图形的闪烁

220 反混淆方法(1/10) 什么是反混淆 在图形显示过程中,用于减少或消除混淆现象的方法 提高分辨率的反混淆方法

221 显示器提高分辩率,显示器距减少一倍,帧缓存容量增加到原来的4倍,传输带宽提高四倍,扫描转换花4倍时间。
另一种方法: 在较高分辨率的显示模式下计算,(对各自像素计算,再求(非)加权平均的颜色值),在较低的分辨率模式下显示。 只能减轻,不能消除。

222 反混淆方法(2/10) 非加权区域采样方法 两点假设 现实 假设与现实的矛盾是导致混淆出现的原因之一
1、象素是数学上抽象的点,它的面积为0,它的亮度由覆盖该点的图形的亮度所决定; 2、直线段是数学上抽象直线段,它的宽度为0。 现实 像素的面积不为0; 直线段的宽度至少为1个像素; 假设与现实的矛盾是导致混淆出现的原因之一

223 反混淆方法(3/10) 解决方法:改变直线段模型 实现步骤: 1、将直线段看作具有一定宽度的狭长矩形;
2、当直线段与某象素有交时,求出两者相交区域的面积; 3、根据相交区域的面积,确定该象素的亮度值

224 反混淆方法(4/10) 计算相交区域的面积 (1)像素宽度与相交区域面积成正比,和直线段与像素中心点的距离成反比。
非加权区域采样方法具有下面三条性质: (1)像素宽度与相交区域面积成正比,和直线段与像素中心点的距离成反比。 (2)直线与像素不相交,对象素的宽度没有影响。 (3)相交区域面积相同,像素的亮度相同,与相交区域的几何位置无关。 计算相交区域的面积

225 反混淆方法(5/10) 求相交区域的近似面积的离散计算方法 1、将屏幕象素分割成m个更小的子象素;
2、计算中心点落在直线段内的子象素的个数,记为k, 3、k/m为线段与象素相交区域面积的近似值

226 反混淆方法(6/10) 加权区域采样方法 非加权区域采样方法的性质 改进第3条性质
1、直线段对一个象素亮度的贡献与两者相交区域的面积成正比; 2、当直线段和一个象素不相交时,它对该象素的亮度没有影响; 3、相同面积的相交区域对象素的亮度贡献相同,而与这个相交区域落在象素内什么位置无关. 改进第3条性质 相交区域对象素亮度的贡献依赖于该区域与象素中心的距离

227 反混淆方法(7/10) 权函数W(x,y) 以象素A的中心为原点建立二维坐标系 w(x,y)反应了微面积元dA对整个象素亮度的贡献大小 权性

228 反混淆方法(8/10) 相交区域 对该象素的亮度贡献 特例: 时, 加权区域采样方法退化为非加权区域采样方法

229 反混淆方法(9/10) 实现步骤 问题:计算量大 1.求直线段与象素的相交区域 ; 2.计算的值 ;
1.求直线段与象素的相交区域 ; 2.计算的值 ; 3.上面所得到的值介于0、1之间,用它乘象素的最大灰度值,即设该象素的显示灰度。 问题:计算量大

230 反混淆方法(10/10) 离散计算方法 加权表的取法
1.将屏幕象素均匀分割成m个子象素 ,则每个子象素的面积为 , 计算每个子象素对原象素亮度的贡献,记为  ,将 保存在一张加权表中; 2.求出所有中心落于直线段内的子象素,记为 , 3.计算所有这些子象素对原象素亮度贡献之和 该值乘以象素的最大灰度值即为象素的显示灰度值. 加权表的取法

231 第六章 二维裁剪 直线段裁剪 多边形裁剪 字符裁剪

232 裁剪Clipping 裁剪的含义 裁剪是从数据集合中抽取信息的过程,是许多图形操作的基础。 裁剪的目的
从大的画面中抽取所需的具体信息,判断图形元素是否位于裁剪窗口之内。 裁剪的处理的基础 (1)图元关于窗口内外关系的判别 (2)图元与窗口的求交

233 线段裁剪 假定条件 矩形裁剪窗口:[xmin,xmax] X [ymin,ymax] 待裁剪线段: 待裁剪线段和窗口的关系:
(1)线段完全可见; (2)线段完全不可见; (3)线段至少有一个端点在裁 剪窗口之外,但非显然不可见

234 线段裁剪 点裁剪 点(x, y)在窗口内的充分必要条件是: 直接求交算法

235 线段裁剪

236 线段裁剪 Sutherland-Cohen算法 思路: 首先简化问题,排除无需操作的对象; 然后对需要处理的对象设法简化算法; 二维窗口 D
y C yT I J K L A B 然后对需要处理的对象设法简化算法; E F yB xL xB x 二维窗口

237 为了实现算法的第一部分,用窗口的四条边把整个平面分成九个区域,每个区域中的点采用同一编码,这一编码的特点是对于窗口的某一条边外侧的三个区域的四位编码中有一位全为1。
y x yT yB xL xB 0000 1001 1000 1010 0001 0010 0101 0100 0110 区域编码

238 Cohen-SutherLand算法(编码算法)
特点:对显然不可见线段的快速判别 编码方法:由窗口四条边所在直线把二维平面分成9个区域,每个区域赋予一个四位编码,CtCbCrCl,上下右左;

239 Cohen-SutherLand算法(编码算法)
如果两个编码都是0,则线段完全在区内,不用裁剪 完全接受;否则 0000 1001 0001 0101 1000 0100 1010 0010 0110 如果两个编码的逻辑乘不为0000,这时可断定两个编码的某一位都为1,这条直线段的两个端点位于窗口的一条边的外侧,因而是完全不可见的,完全拒绝。

240 通过区域编码进行判别: 1. 定义区域编码: Bit 0:左 Bit 1:右 Bit 2:下 Bit 3:上 0000 1001 0001 0101 1000 0100 1010 0010 0110 2. 将线段两端点逐位求“与”, 若结果非零,该线段完全不可见 3. 对求“与”结果为零线段, 如均为0,判别得完全可见线段 4. 对剩下的其它线段,作线段与窗口边 求交处理确定可见部分 * 特殊线段的处理:斜率无穷大或为零,一个端点编码为零等

241 例题: P1 P2 求左边交点,得P’1P2; P’1:(-1,1/2); 编码(0000) 判别知非完全可见,且P’1在窗口内,
x=x1+(y-y1)*(x2-x1)/(y2-y1) y=y1+(x-x1)*(y2-y1)/(x2-x1) (3) 求上边交点,得 P’’’1(-1/4, 1) P2(-1, 1/2); 并编码, 两端点编码全部为0, 线段完全可见,程序结束

242 Cohen-Sutherland 算法 (编码算法)
算法步骤: 第一步 判别线段两端点是否都落在窗口内,如果是, 则线段完全可见;否则进入第二步; 第二步 判别线段是否为显然不可见,如果是,则裁 剪结束;否则进行第三步 ; 第三步 求线段与窗口边延长线的交点,这个交点将 线段分为两段,其中一段显然不可见,丢弃。 对余下的另一段重新进行第一步,第二步判断, 直至结束 裁剪过程是递归的。

243 Cohen-Sutherland裁剪算法 1
#define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 int encode(float x,float y) //端点编码 { int c=0; if(x<XL) c|=LEFT; else if(x>XR) c|=RIGHT; if(x<YB) c|=BOTTOM; else if(x<YT) c|=TOP; retrun c; }

244 Cohen-Sutherland裁剪算法 2
void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) float x1,y1,x2,y2,XL,XR,YB,YT; /*(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界 */ { int code1,code2,code; code1=encode(x1,y1); code2=encode(x2,y2); while(code1!=0 ||code2!=0) { if(code1&code2 !=0) return; //放弃 code = code1; if(code1==0) code = code2;

245 Cohen-Sutherland裁剪算法 3
if(code) if(LEFT&code !=0) //左边界交点 { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1); } else if(RIGHT&code !=0) //右边界交点 { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1); } else if (BOTTOM&code !=0) //底边界交点 { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1); } else if(TOP & code !=0) //顶边界交点 { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1); }

246 Cohen-Sutherland裁剪算法 4
if(code ==code1) { x1=x;y1=y; code1 =encode(x,y);} else { x2=x;y2=y; code2 =encode(x,y);} } displayline(x1,y1,x2,y2); //裁剪后直线显示

247 Cohen-SutherLand算法(编码算法)
对于那些非完全可见、又非显然不可见的线段,需要 求交(如,线段AD),求交前先测试与窗口哪条边所在 直线有交?(按序判断端点编码中各位的值ClCtCrCb) 不可见但非显然 求交测试顺序固定(左上右下) 最坏情形,线段求交四次。 求交四次

248 Cohen-SutherLand算法(编码算法)
1)特点:用编码方法可快速判断线段-- 完全可见和显然不可见。 2)特别适用二种场合: 大窗口场合; 窗口特别小的场合(如, 光标拾取图形时, 光标看作小的裁剪窗口。)

249 中点分割法 基本思想: 与前一种Cohen-Sutherland算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况:
全在、完全不在和线段和窗口有交。 对前两种情况,进行一样的处理。 对于第三种情况,用中点分割的方法求出线段与窗口的交点。 P0 P1 A B Pm 图4.21 中点分割算法

250 中点分割法 设要裁剪的线段是P0P1。中点分割算法可分成两个平行的过程进行,即从P0点出发找出离P0最近的可见点(图中的A点),和从P1点出发找出离P1最近的可见点(图中的B点)。 P0 P1 A B Pm 中点分割算法

251 中点分割法 这两个可见点的连线就是原线段的可见部分。从P0出发找最近可见点的方法是先求P0P1的中点Pm,若P0Pm不能定为显然不可见,则取P0Pm代替P0P1,否则取PmP1代替P0P1,再对新的P0P1求中点Pm。重复上述过程,直到P1Pm长度小于给定的小数ε为止。

252 中点分割算法框图 Y Y Y Pm在裁剪框外 Pm在裁剪框内 Y P0可见否? P0P1显然不可见 Pm = (p0+p1)/2
exit 原线完全不可见 P = P0 中点分割算法框图 Y Y Y Pm在裁剪框外 Pm在裁剪框内 Y

253 从C,D和P1中找出最靠近P0的点。应该是点C。 那么P0C就是P0P1线段上的可见部分。
梁友栋-Barsky算法 设要裁剪的线段是P0P1。 P0P1和窗口边界交于A,B,C,D四点,见图。 y x yT yB xL xB A B C D P1 P0 P0C可见部分 y P1 算法的基本思想是从A,B和P0三点中找出最靠近P1的点,图中,显然是点P0。 从C,D和P1中找出最靠近P0的点。应该是点C。 那么P0C就是P0P1线段上的可见部分。 D yT C P0 B A yB xL xB x P0C可见部分

254 把窗口边界的四条边分成两类,一类称为始边,另一类称为终边。
梁友栋-Barsky算法 具体计算时,把P0P1写成参数方程 x = x0 + Δx · t y = y0 + Δy · t 其中Δx=x1 - x0,Δy=y1 - y0。 把窗口边界的四条边分成两类,一类称为始边,另一类称为终边。

255 称x=xL(y=yB)为始边, x=xR(y=yT)为终边。 当Δx<0(Δy<0)时,
梁友栋-Barsky算法 当Δx≥0(或Δy≥0)时, 称x=xL(y=yB)为始边, x=xR(y=yT)为终边。 当Δx<0(Δy<0)时, 称x=xL(y=yB)为终边, x=xR(y=yT)为始边。 y x yT yB xL xB A B C D P1 P0 p1 p0

256 t0 = max(t0’,t0’’,0 ) t1 = min(t1’,t1’’,1) 求出P0P1和两条始边的交点的参数t0’和t0’’,令
梁友栋-Barsky算法 求出P0P1和两条始边的交点的参数t0’和t0’’,令 t0 = max(t0’,t0’’,0 ) 则t0 就是图中A、B和P0三点中最靠近P1的点的参数。 求出P0P1和两条终边的交点的参数 t1’,t1’’ ,令 t1 t1 = min(t1’,t1’’,1) y yT yB xL xB A B C D P1 P0 则t1就是图中C、D和P1三点中最靠近P0的点的参数。 t0 x

257 参数t∈[t0, t1]的线段就是P0P1的可见部分。
x = x0 + Δx · t y = y0 + Δy · t 当t1>t0时, 参数t∈[t0, t1]的线段就是P0P1的可见部分。 P1 y x yT yB xL xB A B C D P0 t0’ t0’’ t1’ t1’’ lP0 lP1 当t0>t1时,整个直线段为不可见。

258 当Qi>0时,ti必是P0P1和终边的交点的参数。
QL = - Δx DL = x0 - xL QR = Δx DR = xR - x0 QB = - Δy DB = y0 - yB QT = Δx DT = yT - y0 x = x0 + Δx · t y = y0 + Δy · t 易知边界交点的参数为 ti = Di/Qi, i= L,R,B,T 当Qi<0时, 求得的ti必是P0P1和始边的交点的参数。 当Qi>0时,ti必是P0P1和终边的交点的参数。

259 若Di<0,则P0P1是完全不可见的(如图中AB,有QR=0,DR<0).
xL xB y x Qi=0的情况 E F A B QL = - Δx DL = x0 – xL QR = Δx DR = xR - x0 QB = - Δy DB = y0 - yB QT = Δx DT = yT - y0 C D 当Qi=0时, 若Di<0,则P0P1是完全不可见的(如图中AB,有QR=0,DR<0). 当Qi=0 而相应的 Di ≥0 时 则是另一种情况,图中的EF就是这种情况,它使QL=0,DL>0和QR=0,DR>0。这时由于EF和x=xL及x=xR平行,故不必去求出EF和x=xL及x=xR的交点,而让EF和y=yT及y=yB的交点决定直线段上的可见部分。

260 梁友栋-Barskey参数化裁剪算法 1 void LB_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) float x1,y1,x2,y2,XL,XR,YB,YT; { float dx,dy,u1,u2; tl=0;tu=1; dx =x2-x1; dy =y2-y1; if(ClipT(-dx,x1-Xl,&u1,&u2)) if(ClipT(dx,XR-x1, &u1,&u2)) if(ClipT(-dy,y1-YB, &u1,&u2)) if(ClipT(dy,YT-y1, &u1,&u2)) { displayline(x1+u1*dx,y1+u1*dy, x1+u2*dx,y1+u2*dy); return; } }

261 梁友栋-Barskey参数化裁剪算法 2 bool ClipT(p,q,u1,u2) float p,q,*u1,*u2; { float r; if(p<0) { r=q/p; if(r>*u2) return FALSE; else if(r>*u1) { *u1=r; return TRUE; } else if(p>0) { r=p/q; if(r<*u1) return FALSE; else if(r<*u2) { *u2=r; return TRUE; } else if(q<0) return FALSE;

262 多边形的裁剪

263 多边形的裁剪 对多边形的裁剪不等于把多边形的每一条边进行裁剪。
因为在图形学中,多边形被认为是一个封闭的区域,它把平面分为多边形内和多边形外, 对一个多边形的裁剪结果仍要求是多边形,且原来是多边形内的点也在裁剪后的多边形内。 一部分窗口的边界可能成为裁剪后的多边形的边界,一个凹多边形裁剪后可能成为几个多边形。

264 对多边形裁剪的Sutherland-Hodgman算法是一种简便的方法,只要对多边形用窗口的四条边依次裁剪四次,便可得到裁剪后的多边形。

265 Sutherland-Hodgman基本思想
基本思想是一次用窗口的一条边裁剪多边形。 考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧 多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种

266 Sutherland-Hodgman基本思想
假设当前处理的边为SP,顶点S在上一轮中已经处理. 对于情况(1)仅输出顶点P; 情况(2)输出0个顶点; 情况(3)输出线段SP与裁剪线的交点I; 情况(4)输出线段SP与裁剪线的交点I和终点P

267 Sutherland-Hodgman算法的框图
取点P 计算SP和 e的交点I 是否第一点? SP和e相交? 输出I F P (a) S P S在e的可见侧 设封闭多边形的顶点为P1,P2,…Pn,框图中e是表示窗口的四条边中正在裁剪的一条边, 每次裁剪时第一个点存放在F中,以便对最后一条边裁剪时使用。 用图(a)中的算法对边P1P2, P2P3, …Pn-1Pn作裁剪。 输出S 退出 图(a)

268 用图(b)中的算法对最后一条边PnP1作裁剪。裁剪好一条边便输出一条边。
取点F为P 计算SP和 e的交点I SP和e相交? 输出I 退出 (b) 图(b) 用图(b)中的算法对最后一条边PnP1作裁剪。裁剪好一条边便输出一条边。

269 裁剪结果的顶点构成:裁剪边内侧的原顶点;多边形的边与裁剪边的交点。顺序连接。
上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入。 裁剪结果的顶点构成:裁剪边内侧的原顶点;多边形的边与裁剪边的交点。顺序连接。 流水线过程(左上右下): 亦称逐边裁剪算法

270 多边形裁剪 一个凹多边形可能被裁剪成几个小的多边形,如何确定这些小多边形的边界?

271 Weiler-Athenton多边形裁剪算法
裁剪窗口为任意多边形(凸、凹、带内环)的情况: 主多边形:被裁剪多边形,记为A 裁剪多边形:裁剪窗口,记为B

272 Weiler-Athenton多边形裁剪算法
主多边形和裁剪多边形把二维平面分成两部分。 内裁剪:A∩B 外裁剪:A - B 裁剪结果区域的边界由A的部分边界和B的部分边界两部分构成,并且在交点处边界发生交替,即由A的边界转至B的边界,或由B的边界转至A的边界

273 Weiler-Athenton多边形裁剪算法
如果主多边形与裁剪多边形有交点,则交点成对出现,它们被分为如下两类: 进点:主多边形边界由此进入裁剪多边形内 如,I1, I3, I5, I7, I9, I11 出点:主多边形边界由此离开裁剪多边形区域. 如, I0, I2, I4, I6, I8, I10

274 Weiler-Athenton多边形裁剪算法
1、建立主多边形和裁剪多边的顶点表. 2、求主多边形和裁剪多边形的交点,并将这些交点按顺序插入两多边形的顶点表中。在两多边形顶点表中的相同交点间建立双向指针 。 3、裁剪 1)建顶点表; 2)求交点; 3)裁剪… …

275 Weiler-Athenton多边形裁剪算法
3、裁剪 如果存在没有被跟踪过的交点,执行以下步骤: (1)建立裁剪结果多边形的顶点表. (2)选取任一没有被跟踪过的交点为始点,将其输出到结果多边形顶点表中. (3)如果该交点为进点,跟踪主多边形边边界;否则跟踪裁剪多边形边界. (4) 跟踪多边形边界,每遇到多边形顶点,将其输出到结果多边形顶点表中,直至遇到新的交点. (5)将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向(如果上一步跟踪的是主多边形边界,现在改为跟踪裁剪多边形边界;如果上一步跟踪裁剪多边形边界,现在改为跟踪主多边形边界). (6)重复(4)、(5)直至回到起点

276 Weiler-Athenton多边形裁剪算法

277 Weiler-Athenton多边形裁剪算法
如果进入裁剪窗口多边形,记录交点,然后继续扫描目标多边形 如果离开裁剪窗口多边形,记录交点,并右转,然后以同样方式继续跟踪裁剪窗口多边形(即将裁剪窗口多边形作为目标多边形,将目标多边形作为裁剪窗口多边形,继续前面操作。) 当遍历路径产生子多边形时,将子多边形作为结果的一部分输出,然后从标记为没有遍历的边的起点或部分边的交点处开始,继续对原目标多边形进行遍历。当原目标多边形所有边都遍历后,算法结束。

278 Weiler-Athenton多边形裁剪算法
1 2 3 4 5 6 7 8 9 10 11 12 13 上图从1-2求交,2-3,3-4,4-5右转,5-6,6-7,7-8第二次右转,输出子多边形; 从第一次变换窗口处的交点开始遍历A,从9到10再到11,没有输出。跳过已经遍历的6和7后,继续遍历12和13直到结束。

279 平行投影时视域如图4.31(a)所示,它是由方程 x=0, x=1,y=0,y=1,z=0,z=1代表的六个平面围成的立方体。
三维图形的裁剪 在规范化坐标系定义了两种视域 平行投影时视域如图4.31(a)所示,它是由方程 x=0, x=1,y=0,y=1,z=0,z=1代表的六个平面围成的立方体。 透视时的视域如图4.31(b)的棱台,它是由方程 x=z, x=-z, y=z, y=-z, z=zmin和z=1代表的六个平面围成。 图形对三维的裁剪就是把视域内的图形保留下来,把视域外的部分裁剪掉。 y x z (a) (b) 图4.31 两种视域

280 点在视域下面,第二位为1,y<0, (y<-z) 点在视域右面,第三位为1,x>1, (x>z)
前面讲的各种裁剪方法均可以推广至三维。例如Sutherland-Cohen算法中的编码应为六位。括号中的条件适用于透视的情况,平行投影时用括号外的条件。 点在视域上面,第一位为1,y>1, (y>z) 点在视域下面,第二位为1,y<0, (y<-z) 点在视域右面,第三位为1,x>1, (x>z) 点在视域左面,第四位为1,x<0, (x<-z) 点在视域后面,第五位为1,z>1, (z>1) 点在视域前面,第六位为1,z<0, (z<zmin)

281 1=(y1 - y0)t’ + y0, t’=(1-y0)/(y1-y0)
设线段的起点和终点分别为P0(x0,y0,z0)和P1(x1,y1,z1),直线方程可表示成参数形式 x = x0 + (x1-x0)t, y = y0 + (x1-x0)t, x = x0 + (x1-x0)t (4.39) 和视域的边界面,例如y=1求交时,可由 1=(y1 - y0)t’ + y0, t’=(1-y0)/(y1-y0) 求得交点的参数t’,再把t’代入(4.39),即可得交点的坐标。求P0P1和平面x=z的交点时,可把(4.39)代入x=z中求得交点处的参数 t’=(z0-x0)/[(x1-x0)-(z1-z0)] (4.40) 把t’代入式(4.39)即可得到交点的坐标。

282 梁友栋-Barsky算法也很容易推广到三维。
当视域为立方体时,这种推广是直接的。 当视域为棱台时,对x=z,x=-z,y=z,y=-z四个平面来说,对应于二维裁剪时的Q和D值可取 QL = -(Δx + Δz), DL = z0 + x0 QR = (Δx - Δz), DR = z0 - x0 QB = -(Δy + Δz), DB = z0 + y0 QT = (Δy - Δz), DT = z0 - y0 对z=zmin和z=1两个平面,相应的Q和D值可取为 QF = -Δz), DF = z0 - zmin QRA = Δz, DRA = 1 - z0 易知相应平面和P0P1交点的参数值为ti=Di/Qi,i=L,R,B,T,F,BA。

283 三维图形的显示流程图 显示流程图 观察变换:从世界坐标系到观察坐标系的变换

284 三维图形的显示流程图 模型变换 模型坐标系 Modeling Coordinate 物体的局部坐标系 在模型坐标系中物体的表示简单

285 三维图形的显示流程图 模型变换 Modeling Transformation
将物体从本身的模型坐标系变换到上层物体的模型坐标系(或世界坐标系)的几何变换 模型变换是构造复杂物体的方法 例子: 模型变换1

286 三维图形的显示流程图 何时裁剪 投影之前裁剪----三维裁剪 投影之后裁剪----二维裁剪 优点 缺点 只对可见的物体进行投影变换
三维裁剪相对复杂 投影之后裁剪----二维裁剪 二维裁剪相对容易 需要对所有的物体进行投影变换

287 三维图形的显示流程图 采用二维裁剪的三维图形显示流程图 在投影之前裁剪的理由
三维物体的表面通常被离散表示成多边形或折线,而对这类简单图元,三维裁剪同样比较简单。 三维图形在显示过程中需要被消隐,做这个工作要有图形的深度信息,所以必须在投影之前完成 。 消隐很费时,如果在此之前裁剪(或部分裁剪)掉不可见的图形,可使 需要消隐的图形减至最小。

288 三维图形的显示流程图 规范视见体 平行投影的规范视见体 半立方体 透视投影的规范时间体 四棱台

289 三维图形的显示流程图 为什么引入规范视见体 规范化变换 规范投影坐标(三维屏幕坐标 ) 简化投影 简化裁剪
将任意视见体变换成规范视见体的变换 规范投影坐标(三维屏幕坐标 ) 经规范化的观察坐标系

290 三维图形的显示流程图 采用规范视见体的三维图形显示流程图

291 三维图形的显示流程图 平行投影视见体的规范化 将任意的平行投影视见体变换为规范平行投影视见体 方法:变换的分解与合成 步骤 结果

292 三维图形的显示流程图

293 三维图形的显示流程图 透视投影视见体的规范化 将任意的透视投影视见体变换为规范透视投影视见体 方法:变换的分解与合成 步骤 结果

294 三维图形的显示流程图

295 三维图形的显示流程图 规范视见体之间的变换 将透视投影的规范视见体变换为平行投影的规范视见体 为什么
关于长方体的裁剪较关于正四棱台的裁剪简单。 平行投影较透视投影简单。 透视投影与平行投影都采用同一套裁剪与投影程序,处理一致,便于用硬件实现。

296 三维图形的显示流程图 将视见体变换结合到透视投影的规范化变换矩阵中 采用视见体变换的三维图形显示流程图

297 三维裁剪 三维裁剪的两种方法 将齐次坐标转换为三维坐标,在三维空间关于视见体裁剪 直接在四维齐次坐标空间中进行裁剪 优点:三维裁剪相对容易
缺点:需要将齐次坐标转换为三维坐标 直接在四维齐次坐标空间中进行裁剪 优点: 不需要将齐次坐标转换为三维坐标 有理曲线曲面可能直接用齐次坐标来表示,对它们的裁剪只能在齐次坐标空间中进行 缺点:四维裁剪相对复杂

298 三维裁剪 关于规范视见体的裁剪 齐次坐标空间中的裁剪 四维裁剪体的定义
直线段裁剪的Cohen_Sutherland算法、*梁_Barskey算法的直接推广 多边形裁剪的Sutherland_Hodgman算法的直接推广 齐次坐标空间中的裁剪 四维裁剪体的定义

299 *图形显示过程小结 对应于三维裁剪的实现过程 1、将三维坐标扩展为齐项坐标,(x,y,z)(x,y,z,1); 2、进行模型变换;
3、进行观察变换; 4、进行视见体的规范化变换Npar或Nper; 5、除以h返回三维空间(有些情况下,h保持为1,所以不必做除法运算); 6、关于规范视见体进行裁剪; 7、将三维坐标扩展为齐项坐标; 8、进行投影变换Mort或Mper; 9、进行窗口至视区的变换; 10、除以h返回二维设备坐标系 ; 11、扫描转换(显示)。

300 *图形显示过程小结 对应齐次坐标空间裁剪的实现过程 1、将三维坐标扩展为齐次坐标(对于直接用齐次坐标表示的图形不需要进行这一步);
2、进行模型变换; 3、进行观察变换; 4、进行视见体的规范化变换Npar或 ; 5、在齐项坐标空间中关于裁剪窗口裁剪; 6、进行平行投影变换Mort。 7、进行窗口至视区的变换。 8、除以h返回二维设备坐标系。 9、扫描转换(显示)。

301 作业 编程实现直线段裁剪的Cohen_Sutherland算法、中点算法、梁_Barskey算法中任意两种(演示)。
2 编程实现多边形裁剪的Sutherland_Hodgman算法(逐边演示)。

302 第7章 图形变换 变换的数学基础 二维基本变换 齐次坐标与二维变换的矩阵表示 复合变换与变换的模式 其它变换 二维图形的显示流程图
第7章 图形变换 变换的数学基础 二维基本变换 齐次坐标与二维变换的矩阵表示 复合变换与变换的模式 其它变换 二维图形的显示流程图 窗口到视区的变换 三维几何变换 坐标系之间的变换

303 变换的数学基础 矢量 (n元组,对应n维空间中的一个点) 矢量和

304 变换的数学基础 矢量的数乘 矢量的点积 性质

305 变换的数学基础 矢量的长度 单位矢量 || U||=1 点积运算的几何解释 矢量的夹角 矢量的叉积

306 变换的数学基础 矩阵 阶矩阵 n阶方阵 当m=n时 零矩阵 矩阵元素全为零 行向量与列向量 m=1 行矩阵, n=1 列矩阵
零矩阵 矩阵元素全为零 行向量与列向量 m=1 行矩阵, n=1 列矩阵 单位矩阵 n阶矩阵的主对角线元素均为1,其余元素为0。

307 变换的数学基础 矩阵 矩阵的加法 矩阵的数乘 矩阵的乘法 矩阵的转置 矩阵的逆

308 二维基本变换 平移变换

309 二维基本变换 旋转变换 绕坐标原点旋转角度 (逆时针为正,顺时针为负)

310 二维基本变换 放缩变换 在x轴方向和y轴方向分别放缩sx和sy倍 以坐标原点为放缩参照点 不仅改变了物体的大小和形状,也改变了它离原点的距离

311 齐次坐标与二维变换的矩阵表示 为什么需要齐次坐标? 实际绘图中,常要对图形对象作连续的多个变换,例如先平移,再旋转、放大等。
如果需要对图形进行旋转和放缩变换,可以先对两个变换进行复合变换,将两次运算转换成一次性的矩阵与向量乘法。 但如果再加入平移变换,就不易合并了。 平移变换和旋转、缩放变换的表示形式不一样,平移是加法,旋转和缩放是乘法。为使变换合成容易,引入齐次坐标的概念。

312 齐次坐标与二维变换的矩阵表示 多个变换作用于多个目标 变换合成 变换合成的问题 引入齐次坐标 变换的表示法统一

313 齐次坐标与二维变换的矩阵表示 齐次坐标 定义 (x,y)点对应的齐次坐标为 (x,y)点对应的齐次坐标为三维空间的一条直线

314 齐次坐标与二维变换的矩阵表示 标准齐次坐标(x,y,1) 二维变换的矩阵表示 平移变换 旋转变换

315 齐次坐标与二维变换的矩阵表示 放缩变换 变换具有统一表示形式的优点 便于变换合成 便于硬件实现

316 齐次坐标与二维变换的矩阵表示 平移和旋转变换具有可加性 放缩变换具有可乘性

317 复合变换及变换的模式 问题:如何实现复杂变换? 关于任意参照点 的旋转变换 变换分解 变换合成

318 复合变换及变换的模式

319 复合变换及变换的模式 关于任意参照点 的放缩变换

320 复合变换及变换的模式 变换的结果与变换的顺序有关(矩阵乘法不可交换,先作用的变换放在连乘式的右端,后作用的变换放在连乘式的左端)
Translate2D(1,0); Rotate2D(45); House(); Rotate2D(45); Translate2D(1,0); House();

321 复合变换及变换的模式 变换的固定坐标系模式 相对于同一个固定坐标系 先调用的变换先执行,后调用的变换后执行 Rotate2D(45);
Translate2D(1,0); House();

322 复合变换及变换的模式 人的思维方式 变换的活动坐标系模式 每次变换产生一个新的坐标系
先调用的变换后执行,后调用的变换先执行(图形系统一般用堆栈实现)

323 复合变换及变换的模式 Rotate2D(45); Translate2D(1,0); House(); 例子

324 其它变换 对称变换 关于x轴的对称变换 关于y轴的对称变换

325 其它变换 关于任意轴的对称变换 总的变换:

326 其它变换 错切变换 (弹性物体有时会用到错切变换) 以y轴为依赖轴的错切变换 以y=0为参考轴,切变程度由shx=tanα
错切变换 (弹性物体有时会用到错切变换) 保持图形上各点的某一坐标值不变,而 另一坐标值关于该坐标 值呈线性变换。坐标不变的轴称为依赖轴,余下的坐标轴称为方向轴。 以y轴为依赖轴的错切变换 以y=0为参考轴,切变程度由shx=tanα

327 其它变换 以平行x轴的任意直线 为参考轴

328 其它变换 以x轴为依赖轴的错切变换

329 其它变换 仿射变换 (二维线性变换的一般形式,保持两条平行直线间的平行关系) 表示为: 变换矩阵为:

330 二维图形的显示流程图 图形以数字形式存储和处理,坐标系建立了图形与数之间的对应联系 世界坐标系(world coordinate)
用户坐标系(user coordinate) 局部坐标系(local coordinate)

331 二维图形的显示流程图 屏幕坐标系(screen coordinate) 设备坐标系(device coordinate)

332 二维图形的显示流程图 窗口 视区 窗口到视区的变换 在世界坐标系中指定的矩形区域 用来指定要显示的图形
在设备坐标系(屏幕或绘图纸)上指定的矩形区域 用来指定窗口内的图形在屏幕上显示的大小及位置 窗口到视区的变换

333 二维图形的显示流程图

334 窗口到视区的变换 目标 将窗口之中的图形变换到视区中 变换的求法 变换的分解与合成

335 复合变换及变换的模式

336 窗口到视区的变换(2/2) 当窗口的边与坐标轴不平行时

337 三维几何变换 三维齐次坐标 (x,y,z)点对应的齐次坐标为 标准齐次坐标(x,y,z,1) 采用右手坐标系

338 三维几何变换(2/5) 平移变换 放缩变换

339 三维几何变换(3/5) 旋转变换 绕x轴 绕y轴

340 三维几何变换(4/5) 绕z轴 错切变换

341 三维几何变换(5/5) 对称变换 关于坐标平面xy的对称变换 三维变换的一般形式

342 坐标系之间的变换 什么是? 建立坐标系之间的变换关系 将图形从一个坐标系中变换到另一个坐标系中,同一图形在不同坐标系中的表示 怎样求?

343 习题 7、在坐标系oxyz中,求一个变换将P(1,1,1)Q(2,2,2)变换到z轴上:P在坐标原点,Q在z轴正半轴。 y y Q M P
o(P) x y z P Q o M

344 第8章 投影 三维图形的基本问题 平面几何投影 观察坐标系中的投影变换 投影举例 三维图形的显示流程图 三维裁剪 图形显示过程小结

345 三维图形的基本问题(1/4) 在二维屏幕上如何显示三维物体? 显示器屏幕、绘图纸等是二维的 显示对象是三维的 解决方法----投影
三维显示设备 二维形体的表示----直线段、折线、曲线段、多边形区域 二维形体的输入----简单(图形显示设备与形体的维数一致) 在二维屏幕上如何显示三维物体? 如何表示三维物体?

346 三维图形的基本问题(2/4) 三维形体的表示----空间直线段、折线、曲线段、多边形、曲面片 三维形体的输入、运算、有效性保证----困难
解决方法----各种用于形体表示的理论、模型、方法 (线框模型、表面模型、实体模型) 物体之间或物体的不同部分之间存在相互遮挡关系 遮挡关系是空间位置关系的重要组成部分 解决方法----消除隐藏面与隐藏线 如何反映遮挡关系?

347 三维图形的基本问题(3/4) 如何产生真实感图形 何谓真实感图形 人们观察现实世界产生的真实感来源于
逼真的 示意的 人们观察现实世界产生的真实感来源于 空间位置关系----近大远小的透视关系和遮挡关系 光线传播引起的物体表面颜色的自然分布 解决方法----建立光照明模型、开发真实感图形绘制方法 如何产生真实感图形

348 三维图形的基本问题(4/4) 三维图形的基本研究内容 投影 三维形体的表示 消除隐藏面与隐藏线 建立光照明模型、开发真实感图形绘制方法

349 投影 将n维的点变换成小于n维的点 将3维的点变换成2维的点 投影(projection)变换
由于显示器和绘图机只能用二维空间来表示图形,要显示三维图形就要用投影方式来降低其维数。 投影 将n维的点变换成小于n维的点 将3维的点变换成2维的点

350 在三维坐标系统中,物体上的每一点都以三个分量(x,y,z)描述,这样的物体称为三维物体。要想将一个三维物体描画在一个二维的平面,如纸面,荧光屏面上,必须对三维物体进行投影。投影(project)是一种使三维对象映射为二维对象的变换。它可描述为: project(object(x,y,z))→object(x′,y′)

351 平面几何投影及其分类 投影中心(COP:Center of Projection) 投影面 视觉系统—观察点、视点 电影放映机—光源
不经过投影中心 平面--照相机底片 曲面—球幕电影,视网膜

352 平面几何投影分类 投影的要素除投影对象,投影面外,还有投影线。按照投影线角度的不同,有两种基本投影方法:
1平行投影(parallel projection)。它使用一组平行投影线将三维对象投影到投影平面上去(图3.21(a))。 2透视投影(perspective projection)。它使用一组由投影中心产生的放射投影线,将三维对象投影到投影平面上去。

353 投影分类 投影中心与投影平面之间的距离为无限 投影中心与投影平面之间的距离为无限 投影中心与投影平面之间的距离为有限
根据投影方向与投影平面的夹角 根据投影平面与坐标轴的夹角

354 一、 投影变换的分类: 正投影 (三视图) 正平行投影 正等测投影 (三轴变形系数相等) 正轴测投影 正二测投影 (两轴向变形相等)
斜平行投影 正平行投影 正等测投影 (三轴变形系数相等) 正二测投影 (两轴向变形相等) 正三测投影 (三轴变形系数各不相同) 平行投影 透视投影 斜等测投影 (三轴都不缩短,但一根轴倾斜) 斜二测投影 (一根轴倾斜,且缩短为1/2) 一点透视投影 二点透视投影 三点透视投影

355 在计算机图形软件中所采用笛卡尔(cartesian)直角三维坐标系统,按照z轴方向的不同有两种形式:
1右手系统:当用右手握住z轴时,大姆指指向z轴的正方向(图(a)),其余四个手指从x轴到y轴形成一个弧。(Z值越大,越靠近视点) 2左手系统:当用左手握住z轴时,大姆指指向z轴的正方向(图(b));其余四个手指从x轴到y轴形成一个弧。 (Z值越大,越远离视点) 两种三维直角坐标系统 (a)右手系统 (b)左手系统

356 平面几何投影分类

357 F为投影平面;p1p2为三维直线;p’1p′2是p1p2在F上的投影;虚线显示投影线;o是投影中心。
由平行投影方法表现三维对象的图,称为正视图和轴测图; 由透视投影方法表现三维对象的图,称为透视图。

358 平行投影 按照标准线与投影面的交角不同,平行投影分为两类:正交平行投影和斜交平行投影。
1、正交平行投影(orthographic P.P.)的投影线与投影平面成90°角。将一个三维点(x,y,z)用正交平行投影法投影平面xoy上,得到一个二维点(xp,yp)。这种变换,可以由正交平行交换公式来计算,它为 xp=x; yp=y; zp=0

359 三视图:投影面与某一坐标轴垂直,即投影方向与该坐标轴的方向一致。 分类(组成):主视图X、侧视图Y、俯视图Z
同样,也可以将三维物体正交平行投影于xoz和yoz平面上,分别获平视与侧视图。设计中常用正交平行投影来产生三视图称为正视图。它们具有x,y方向易于测量的特点,因此作为主要的工程施工图纸。 三视图:投影面与某一坐标轴垂直,即投影方向与该坐标轴的方向一致。 分类(组成):主视图X、侧视图Y、俯视图Z 注意:此处, X指前, Y指右,Z指上

360 平面几何投影(12/12) 三视图:正视图、侧视图和俯视图

361 三视图的变换矩阵(3D用户坐标系进行)                                            特点:三视图常用于工程制图。但一种三视图上只有物体一个侧面的投影,所以单独从某个方向的三视图上是很难想象出物体的三维形状的。只有将主、侧、俯三个视图放在一起,才能综合出物体的空间形状。 以CRT作图纸,显示三视图 用户坐标系3D设备坐标系视区 选择视图,建立相应的视图区选好视图后,在CRT上为其建立视图区,每个视图区代表一个坐标平面,操作一个视图。 根据3D物体的复杂程度,合理选择视图数目。原则:在能表示清楚物体的形状和尺寸的前提下,视图数目越小越好。

362 3)侧视图x 1)主视图(y) 2)俯视图 z 三视图的生成就是把x、y、z坐标系的形体投影到z=0的平面,变换到u、v、w坐标系。一般还需将三个视图在一个平面上画出,这时就得到下面的变换公式,其中(a,b )为u、v坐标系下的值,tx、ty、tz均如图中所示。 (注:这里以垂直Y轴为主视图)

363 平行正投影三视图 1.投影规律: 下 高平齐 主、俯视图 “长对正” 主、左视图 “高平齐” 长对正 俯、左视图 “宽相等” 宽相等
1.投影规律: 高平齐 主xoy 左yoz 主、俯视图 “长对正” 主、左视图 “高平齐” 长对正 俯、左视图 “宽相等” 宽相等 俯zox 主视图  上下、左右; 2.各视图中的方位: 俯视图  前后、左右; 左视图  前后、上下。

364 例三棱柱及表面上各点的三视图。

365 轴测图的形成与分类 正轴测图 斜轴测图 定义:用一个投影面来表达物体长、宽、高三个方 向形状的图样;
特点:直观性好,立体感强。但作图复杂且有变形; 用途:一般作为工程上的辅助图样。 正轴测图 按形成方法可分为二大类: 斜轴测图

366 轴测图的参数 相邻两轴测轴之间的夹角。 沿轴测轴测量而得到的投影长度与实际长度之比。 Y轴的轴向变形系数: q = ob / OB
Z X Y 1. 轴间角: 相邻两轴测轴之间的夹角。 2. 轴向变形系数: 沿轴测轴测量而得到的投影长度与实际长度之比。 X轴的轴向变形系数: p = oa / OA Y轴的轴向变形系数: q = ob / OB Z轴的轴向变形系数: r = oc / OC

367 (三) 轴测图的投影特性 其轴测投影仍相互平行; 其轴测投影仍与该轴测轴平行。 平行性: (1) 物体上相互平行的直线,
(2) 物体上与坐标轴平行的直线, 其轴测投影仍与该轴测轴平行。

368 (四) 常见的几种轴测图 1. 正(斜)等轴测图: p = r = q 2. 正(斜)二等轴测图:p = r  q
常见轴测图 3. 正(斜)三轴测图: p  r  q

369 正等轴测图 斜二等轴测图 正二等轴测图 变形 p = q = r p = r = 1 p = r  1
正等轴测图 斜二等轴测图 正二等轴测图 变形 p = q = r p = r = p = r  1 系数 = 0.82  q = q  0.5 轴 XZ: XZ:90 XZ:9710 间 XY:  XY: XY: 角 YZ: YZ: YZ: 13125 135

370 正 轴 测 图 (1) 以正投影面作为轴测投影面(P); (2) 投影方向垂直于轴测投影面( S  P );
形成的方法: (2) 投影方向垂直于轴测投影面( S  P ); (3) 改变物体与投影面的相对位置。 (使其三方向的轴均倾斜于轴测投影面)

371 斜 轴 测 图 (1) 以正投影面作为轴测投影面(P); (2) 投影方向倾斜于轴测投影面( S ∠ P );
形成的方法: (2) 投影方向倾斜于轴测投影面( S ∠ P ); (3) 物体与投影面的相对位置不变。 (使其 X、Z 轴平行于轴测投影面)

372 轴 测 图 半圆弧变成椭圆弧 圆形变成椭圆 矩形变成棱形 轴承座零件的轴测图

373 轴测图的平行性 Z Z X Y Y X 物体上平行的直线轴测投影仍平行 三视图 与轴平行的直线仍与该轴测轴平行

374 常见轴测图

375 Orthographic Projection

376 平行投影(Parallel ) 设给定的投影方向为(xd,yd,zd)。假设P(xp,yp)为任一点Q(x,y,z)在该投影方向上在z=0平面上的投影。又设Q和P在oxz平面上的投影分别为Q’和P’。α为Q’P’与x轴的夹角,易知 tgα=zd/xd。 x z y Q P Q’ P’ O z x Q’ P’ zc xP α β

377 = x + z*tg(α-π/2) = x – z*ctgα = x – z*xd/zd yp = y – z*yd/zd 平行投影计算公式
又从图中可以得出: xp= x + ztgβ = x + z*tg(α-π/2) = x – z*ctgα = x – z*xd/zd 同理可得 yp = y – z*yd/zd 上两式即平行投影的计算公式。 x z y Q P Q’ P’ O zc xP α β

378 透视投影 (Perspectiveprojection)

379 相机(Camera )模拟方式 实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 :
  第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation)。   第二步,将三维物体放在适当的位置(模型变换,Modeling Transformation)。   第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation)。   第四步,决定二维像片的大小(视口变换,Viewport Transformation)。  这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。

380 相机(Camera )模拟方式 透视投影(Perspectiveprojection)

381 透视投影(Perspective Projection)   透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。

382 Ys S 简单的一点透视投影变换 Y Qw P0 O Z X Xs Z1 Z2 Qs Qw (Xw, Yw, Zw) Qs (Xs, Ys)
当投影面与某轴垂直时为一点透视;当投影面平行于某坐标轴,但与另外两轴不垂直时为二点透视;否则为三点透视 P0 : 视点 S平面: 投影面,屏幕画面 点Qw的透视:P0Qw与平面S的交点

383 透视投影(Perspective projection)
x z y P为Q的投影 C Q P C’ Q’ zc xc 在oxz平面上的正投影 xP O 在坐标系oxyz中来讨论投影,假设投影平面就是z=0。 (一点透视) 设视点[PRP]C(xc,yc,zc),空间中任一点Q(x,y,z)在z=0平面上的投影为 P(xp,yp,zp)。设Q、P、C在 oxz 平面上的正投影为Q’,P’和C’,可得透视投影的计算公式

384 透视投影(Perspectiveprojection)计算公式。
(xp-xc)/ zc= (x-xc)/(zc-z) P’ z x C’ Q’ zc xc xP 整理后便有 xp=xc + (x-xc)zc/(zc-z) 同理可得 yp=yc + (y-yc)zc/(zc-z) 这两式便是透视投影的计算公式。把空间上任一点(x,y,z)的坐标代入上式便可求出在z=0平面的投影点P(xp,yp)。 当xc=0, yc=0时,则有

385 投影平面是任意平面的情况 透视投影的特征 由投影平面与主坐标轴的交点个数决定
投影中心与投影平面之间的距离为有限 参数:投影方向,投影面 灭点:不平行于投影平面的平行线,经过透视投影之后收敛于一点,称为灭点. 在坐标轴上的灭点叫做主灭点。主灭点数和投影平面切割坐标轴的数量相对应。按照主灭点的个数,透视投影可分为 一点透视 两点透视 三点透视 特点:产生近大远小的视觉效果,由它产生的图形深度感强,看起来更加真实。 由投影平面与主坐标轴的交点个数决定 主灭点的个数由什么决定?

386 投影平面是任意平面的情况

387 投影平面是任意平面的情况 在实际应用时投影平面的位置要允许改变。为了确定一个投影平面,先给定一个参考点R (xr,yr,zr)、投影平面的法线方向N(xn,yn,zn)和一个常数d。过点 R 沿N方向作射线,与投影平面的交点o’,并且使|o’R|=d。调整R和N可以很方便的改变投影平面的位置和方向。 y x U z’ x’ y’ R N o’ o Z 投影平面的指定

388 首先在投影平面上建立一个坐标系o’x’y’z’
首先在投影平面上建立一个坐标系o’x’y’z’.并且oz’的方向为投影平面的法线方向,同时给定一个向量U(xu,yu,zu),此向量在投影平面上的正投影所指的方向便是o’y’的方向。 y x U z’ x’ y’ R N o’ o 这样,对于坐标系(o’x’y’z’)来说,投影平面正好是z’=0平面,因此可以用透视计算公式或平行计算公式来计算这两种投影。现在我们只须求出这两个坐标系的转换关系。

389 设(x0,y0,z0)是点o’在坐标系oxyz中的坐标,o’x’,o’y’和o’z’轴的单位方向向量为(a11,a12,a13)、(a21,a22,a23)和(a31,a32,a33),那么从坐标系oxyz 到o’x’y’z’的变换是 x’ a11 a12 a x - x0 y’ a21 a22 a y - y0 z’ a31,a32,a z - z0 下面给出计算x0,y0,z0和aij(i,j=1,2,3)的方法。由图可知 x0= xr + dxn/(xn2 + yn2 + zn2)1/2 y0= yr + dyn/(xn2 + yn2 + zn2)1/2 z0= zr + dzn/(xn2 + yn2 + zn2)1/2 [ ] =[ ] [ ]

390 o’z’轴和N方向一致,故有 (a31,a32,a33)=(xn,yn,zn)/(xn2 + yn2 + zn2)1/2 o’x’轴和向量U×N方向一致,设 i j k U×N = xu yu zu = b1i + b2j +b3k xn yn zn 其中i,j和k分别为ox,oy,oz轴的单位方向向量,则 (a11,a12,a13)=(b1,b2,b3)/(b12 + b22 + b32)1/2

391 o’y’轴的单位方向向量应是o’z’和o’x’轴的单位向量的向量积,因此
(a21,a22,a23))= (a13a32 - a12a33,a11a33 - a13a31,a12a31 - a11a32) (4.30) 用式(4.25)至(4.30)可算出式(4.24)中全部常数,因此在坐标系oxyz中给定的投影方向或视点的坐标都可用式(4.24)变换到坐标系o’x’y’z’中的量(xd,yd,zd)和(xc,yc,zc)。

392 观察坐标系中的投影变换(1/15) 如何进行投影变换? 观察坐标系 生活中的类比--移动舞台还是移动摄像机 变换的分解与合成 移动舞台
投影(摄像)简单 移动难度大 移动摄像机 移动容易 投影复杂 采用观察坐标系,投影简单

393 观察坐标系中的投影变换(2/15) 什么是观察坐标系 如何建立观察坐标系 View Reference Coordinate或VRC
照相机所在的坐标系 如何建立观察坐标系 坐标原点----聚焦参考点在底片(投影平面)上的投影,称为观察参考点VRP(View Reference Point) n轴----照相机镜头方向(投影平面的法向) v轴----照相机向上的方向(观察正向) u轴----

394 观察坐标系中的投影变换(3/15)

395 观察坐标系中的投影变换(4/15) 视见体 为什么需要观察坐标系 视见体是三维裁剪窗口 建立步骤 简化和加速投影变换
投影平面---- n=0 投影中心---- (0,0,d) 视见体 视见体是三维裁剪窗口 建立步骤 定义窗口 发出射线 形成观察空间 前后裁剪面 形成视见体

396 观察坐标系中的投影变换(5/15) 投影参考点 PRP:Projection Reference Point 透视投影:COP==PRP
平行投影:投影方向DOP=窗口中心CW-PRP

397 观察坐标系中的投影变换(6/15)

398 观察坐标系中的投影变换(7/15) 投影参数 参数 作用 投影类型 定义投影是平行投影还是透视投影 观察参考点VRP
在世界坐标系中指定,为观察坐标系原点 观察平面法向VPN 在世界坐标系中指定,为观察坐标的n轴 观察正向UVP 在世界坐标系中指定,确定观察坐标系的v轴 投影参考点PRP 在观察坐标系中指定确定投影中心或投影方向 前裁剪面裁距F 在观察坐标系中指定,n=F为前裁剪面 后B裁剪面裁距 在观察坐标系中指定,n=B为后裁剪面 窗口umin、umax、vmin、vmax 在观察坐标系的uv平面上指定,确定窗口与视见体

399 观察坐标系中的投影变换(8/15) 透视投影变换
问题----在uvn中,投影平面为n=0,投影中心为(0,0,d),待投影点为P,求投影点Q

400 观察坐标系中的投影变换(9/15) 投影线的参数方程 投影平面方程 n=0 Q点的坐标

401 观察坐标系中的投影变换(10/15) 投影中心为(0,0,d)时的透视投影变换矩阵

402 观察坐标系中的投影变换(11/15) 平行投影变换
问题----在uvn中,投影平面为n=0,投影方向为(0,0,-1),待投影点为P,求投影点Q

403 观察坐标系中的投影变换(12/15) 投影线的参数方程 投影平面方程 n=0 Q点的坐标

404 观察坐标系中的投影变换(13/15) 平行投影变换矩阵 透视投影与平行投影之间的关系

405 观察坐标系中的投影变换(14/15) 从世界坐标系到观察坐标系的变换 条件 VRC的坐标原点(观察参考点)VRP 投影平面法向VPN n
观察正向VUP u ,,

406 观察坐标系中的投影变换(15/15) 结论

407 投影举例(1/5) 待投影的单位立方体 缺省投影参数 参数 值 投影类型 平行投影 VRP(WC) (0,0,0)
参数 值 投影类型 平行投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1) VUP(WC) (0,1,0) PRP(VRC) (0.5,0.5,1) 窗口(VRC) (0,1,0,1) F(VRC) 正无穷 B(VRC) 负无穷

408 投影举例(2/5) 透视投影 一点透视 参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1)
参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1) VUP(WC) (0,1,0) PRP(VRC)(0.5,0.5,4) 窗口(VRC)(-0.5,1.5,-0.5,1.5)

409 投影举例(2/5) 透视投影 一点透视 参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1)
参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1) VUP(WC) (0,1,0) PRP(VRC)(2.0,2.0,4.0) 窗口(VRC)(-0.5,1.5,-0.5,1.5) 顶点 1(0,0,1) 2(1,0,1) 3(1,1,1) 4(0,1,1) 透视投影坐标值 1(-3/2,-3/2,0) 2( 3/2,-3/2,0 ) 3( 3/2,3/2,0 ) 4( -3/2,3/2,0 )

410 投影举例(3/5) 两点透视 参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (1,0,1)
参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (1,0,1) VUP(WC) (0,1,0) PRP(VRC) (0.5,0.5,4) 窗口(VRC) (-1.5,1.5, -1.5, 1.5)

411 参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (1,0,1) VUP(WC) (1,1,0) PRP(VRC) (0.5,0.5,4) 窗口(VRC) (-1.5,1.5, -1.5, 1.5)

412 投影举例(4/5) 平行投影 参数 值 投影类型 平行投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1)
参数 值 投影类型 平行投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1) VUP(WC) (0,1,0) PRP(VRC) (0.5,0.5,1) 窗口(VRC) (-0.5,1.5,0.5,1.5) 参数 值 投影类型 平行投影 VRP(WC) (0,0,0) VPN(WC) (1,1,1) VUP(WC) (0,1,0) PRP(VRC) (0.5,0.5,2) 窗口(VRC) (-0.5,1.5,0.5,1.5)

413 投影举例(5/5) 前、后裁剪面的影响 参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1)
参数 值 投影类型 透视投影 VRP(WC) (0,0,0) VPN(WC) (0,0,1) VUP(WC) (0,1,0) PRP(VRC) (0.5,0.5,2) 窗口(VRC) (-0.5,1.5,-0.5,1.5) F(VRC) B(VRC)

414 三维图形的显示流程图(1/14) 显示流程图 观察变换:从世界坐标系到观察坐标系的变换

415 三维图形的显示流程图(2/14) 模型变换 模型坐标系 Modeling Coordinate 物体的局部坐标系
在模型坐标系中物体的表示简单

416 三维图形的显示流程图(3/14) 模型变换 Modeling Transformation
将物体从本身的模型坐标系变换到上层物体的模型坐标系(或世界坐标系)的几何变换 模型变换是构造复杂物体的方法 例子: 模型变换1

417 三维图形的显示流程图(4/14) 何时裁剪 投影之前裁剪----三维裁剪 投影之后裁剪----二维裁剪 优点 缺点
只对可见的物体进行投影变换 缺点 三维裁剪相对复杂 投影之后裁剪----二维裁剪 二维裁剪相对容易 需要对所有的物体进行投影变换

418 三维图形的显示流程图(5/14) 采用二维裁剪的三维图形显示流程图 在投影之前裁剪的理由
三维物体的表面通常被离散表示成多边形或折线,而对这类简单图元,三维裁剪同样比较简单。 三维图形在显示过程中需要被消隐,做这个工作要有图形的深度信息,所以必须在投影之前完成

419 三维图形的显示流程图(6/14) 规范视见体 平行投影的规范视见体 半立方体 透视投影的规范视见体 四棱台

420 三维图形的显示流程图(7/14) 为什么引入规范视见体 规范化变换 规范投影坐标(三维屏幕坐标 ) 简化投影 简化裁剪
将任意视见体变换成规范视见体的变换 规范投影坐标(三维屏幕坐标 ) 经规范化的观察坐标系

421 三维图形的显示流程图(8/14) 采用规范视见体的三维图形显示流程图

422 三维图形的显示流程图(9/14) 平行投影视见体的规范化 将任意的平行投影视见体变换为规范平行投影视见体 方法:变换的分解与合成 步骤 结果

423 三维图形的显示流程图(10/14)

424 三维图形的显示流程图(11/14) 透视投影视见体的规范化 将任意的透视投影视见体变换为规范透视投影视见体 方法:变换的分解与合成 步骤
结果

425 三维图形的显示流程图(12/14)

426 三维图形的显示流程图(13/14) 规范视见体之间的变换 将透视投影的规范视见体变换为平行投影的规范视见体 为什么
关于长方体的裁剪较关于正四棱台的裁剪简单。 平行投影较透视投影简单。 透视投影与平行投影都采用同一套裁剪与投影程序,处理一致,便于用硬件实现。

427 三维图形的显示流程图(14/14) 将视见体变换结合到透视投影的规范化变换矩阵中 采用视见体变换的三维图形显示流程图

428 三维裁剪(1/2) 三维裁剪的两种方法 将齐次坐标转换为三维坐标,在三维空间关于视见体裁剪 直接在四维齐次坐标空间中进行裁剪
优点:三维裁剪相对容易 缺点:需要将齐次坐标转换为三维坐标 直接在四维齐次坐标空间中进行裁剪 优点: 不需要将齐次坐标转换为三维坐标 有理曲线曲面可能直接用齐次坐标来表示,对它们的裁剪只能在齐次坐标空间中进行 缺点:四维裁剪相对复杂

429 三维裁剪(2/2) 关于规范视见体的裁剪 齐次坐标空间中的裁剪
直线段裁剪的Cohen_Sutherland算法、梁_Barskey算法的直接推广 多边形裁剪的Sutherland_Hodgman算法的直接推广 齐次坐标空间中的裁剪 四维裁剪体的定义

430 图形显示过程小结(1/2) 对应于三维裁剪的实现过程 1、将三维坐标扩展为齐项坐标,(x,y,z)(x,y,z,1); 2、进行模型变换;
3、进行观察变换; 4、进行视见体的规范化变换Npar或Nper; 5、除以h返回三维空间(有些情况下,h保持为1,所以不必做除法运算); 6、关于规范视见体进行裁剪; 7、将三维坐标扩展为齐项坐标; 8、进行投影变换Mort或Mper; 9、进行窗口至视区的变换; 10、除以h返回二维设备坐标系 ; 11、扫描转换(显示)。

431 图形显示过程小结(2/2) 对应齐次坐标空间裁剪的实现过程 1、将三维坐标扩展为齐次坐标(对于直接用齐次坐标表示的图形不需要进行这一步);
2、进行模型变换; 3、进行观察变换; 4、进行视见体的规范化变换Npar或 ; 5、在齐项坐标空间中关于裁剪窗口裁剪; 6、进行平行投影变换Mort。 7、进行窗口至视区的变换。 8、除以h返回二维设备坐标系。 9、扫描转换(显示)。

432 变换与投影题解 1. 在坐标系OXY中,求关于对称轴y=x+1的对称变换,并写出其在齐次坐标下的矩阵表示。 步骤:
步骤: (1)      作平移变换T(0,–1), 是对称轴y=x+1变为y=x (2)      作旋转变换R(-π/4),是对称轴y=x变为y=0 (3)      作关于对称轴 y=0的对称变换Ax; (4)      作旋转变换R(π/4); (5)      作平移变换T(0,1),恢复原对称轴位置;

433 变换与投影题解 总的变换为 M=T(0, 1)R(π/4) Ax R(-π/4)T(0,-1)=

434 解答: (1) 过P与投影中心的直线的参数方程为
2.   在观察坐标系oxyz中,选定投影平面为z=0,投影参考点为D(0,0,d),待投影的三维空间的点为P(xp.yp,zp),试求出P点在投影平面上的投影点Q(xq,yq,zq),并在齐次坐标系下,写出其透视投影变换矩阵。 解答: (1) 过P与投影中心的直线的参数方程为 投影平面的方程为 Z = 0 (0,0,d) X (xp.0,zp)

435 (2)联立两方程得 代入直线方程,求得Q的坐标 (3)从而透视投影变换的矩阵为

436 即: 若本题采用左手坐标系,投影参考点为D(0,0,-d),则投影矩阵如何? Z (xp.0,zp) X (0,0-d)


Download ppt "计算机图形学 傅向华 深圳大学信息工程学院 Email: fuxh@szu.edu.cn 电话: 26534380 办公楼339."

Similar presentations


Ads by Google