计算机图形学原理及算法教程(Visual C++版).


业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 《计算机图形学原理及算法教程》( Visual C++版)和青芳 清华大学出版社出版 内容提要 本书在系统介绍计算机图形学算法及原理基础上,利用 Visual C++开发环境,编制相应 的应用程序,较全面具体地把计算机图形学理论与计算机绘图的实践结合了起来,在计算机 理论与交互式图形软件设计之间架起一座桥梁,使学习者在掌握理论和实用知识两方面均感 到应用自如。随书光盘提供案例的全部源程序代码,供读者选用,读者可直接在 Visual C++ 中打开各程序包进行学习或在此基础上修改开发自己的绘图程序,特别适合学习者上机仿效 练习,其中的简单 CAD 系统开发实例为读者开发实际图形程序搭建了基本平台。 本书可作为各大专院校计算机图形学教材、上机教材或工程技术人员自学计算机图形学 和 VC++的参考书,亦可作为计算机图形学教师理论教学参考和课程设计的素材。CAD 教 育网(www.CADedu.com)提供学习支持,为教师免费提供电子教案。 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 目录 第 1 章 基本图形的生成 1.1 直线 1.1.1 生成直线的 DDA 算法 1.1.2 生成直线的中点算法 1.1.2 生成直线的 Bresenham 算法 1.1.3 程序设计案例 1.2 圆 1.2.1 DDA 算法 1.2.2 Bresenham 算法 1.2.3 程序设计案例 1.3 椭圆 1.4 区域填充 1.4.1 扫描线填充 1.4.2 种子填充 1.4.3 程序设计案例 1.5 字符的生成 1.6 图形裁剪 1.6.1 线裁剪 1.6.2 多边形裁剪 1.6.3 字符裁剪 1.6.4 裁剪程序设计案例 1.7 Visual C++中基本绘图函数 1.8 课后练习 第 2 章 二维图形 2.1 用户坐标到屏幕坐标的变换 2.1.1 窗口到视口的变换内容 2.1.2 窗口区到视图区的坐标变换 2.2 几何变换 2.1.1 基本变换 2.1.2 复合变换 2.1.3 几何变换程序设计案例 2.4 平面曲线图 2.4.1 正叶线 2.4.2 正叶线蝴蝶结 2.5 平面曲线程序设计案例 2.6 课后练习 第 3 章 图形交互技术 3.1 用户接口设计 3.2 逻辑输入设备与输入处理 3.2.1 逻辑输入设备 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 3.2.2 输入模式 3.3 交互式绘图技术 3.4 交互技术程序设计案例 3.5 课后练习 第 4 章 简单 CAD 绘图系统开发实例 4.1 计算机图形学绘图基础 4.1.1 Visual C++开发系统基本绘图知识 4.1.2 计算机图形学会图系统设计基本原则 4.1.3 图形程序设计步骤 4.1.4 在 Visual C++集成开发环境下程序的调试 4.1.5 计算机程序结构设计基础 4.1.6 绘图程序设计基本方法 4.1.6.1 图形层次结构和程序模块结构 4.1.6.2 面向对象程序设计 4.1.6.3 绘图子程序和主程序 4.1.6.4 编程绘图方法 4.2 图形的数据结构 4.2.1 图形信息的分类 4.2.2 图形数据结构 4.2.3 计算机对数据的管理—数据文件 4.2.4 图形数据的存储状态 4.2.5 动态文件数据结构的组织原则 4.2.6 简单 CAD 绘图系统编程实例中的数据结构 4.2.6.1 图形元素基类的组织 4.2.6.2 组织图形类系统文档 4.2.6.3 增加图形元素 4.2.6.4 实现各类图形的绘制 4.2.6.5 保存图形数据到文档 4.3 简单 CAD 绘图系统功能简介 4.3.1 简单 CAD 绘图系统运行界面 4.3.2 简单 CAD 绘图系统功能 第5章 三维图形 5.1 三维图形几何变换矩阵 5.2 三维图形基本变换 5.2.1 平移变换矩阵 5.2.2 比例变换矩阵 5.2.3 旋转变换矩阵 5.2.4 对称变换 5.2.5 错切变换 5.3 图形的投影变换 5.3.1 投影变换分类 5.3.2 平行投影 5.3.2.1 正平行投影(三视图) 5.3.2.2 斜平行投影 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 5.3.2.3 透视投影 5.4 三维变换程序设计案例 5.5 课后练习 第 6 章 曲线与曲面 6.1 曲线曲面参数表示的基础知识 6.1.1 非参数表示和参数表示 6.1.2 参数表示的基本特征 6.1.3 曲线段之间的连续性 6.1.4 曲线曲面设计中的几个概念 6.2 常用参数曲线 6.2.1 一般规则空间曲线 6.2.2 Bezier 曲线 6.2.3 B 样条曲线 6.3 参数曲面 6.3.1 函数式曲面 6.3.2 旋转曲面 6.4 常用曲面 6.4.1 双曲线曲面 6.4.2 Bezier 曲面 6.4.3 B 样条曲面 6.5 曲面与曲线程序设计案例 6.6 课后练习 第 7 章 几何造型 7.1 实体的表示模型 7.1.1 形体的边界表示模型 7.1.2 构造表示 7.1.3.边界表示 7.1.3.1 欧拉操作 7.1.3.2 集合运算 7.2 求交分类 7.2.1 求交分类 7.2.2 基本的求交算法 7.2.2.1 线与线的求交计算 7.2.2.2 线与面的求交计算 7.2.2.3 曲面与曲面的求交 7.3 图形相交-相切程序设计案例 7.4 非传统造型技术 7.4.1 基本概念 7.4.2 分形造型对模型的基本要求 7.4.3 分形造型的常用模型 7.4.4 分数维图形应用 7.5 分形造型程序设计案例 7.6 课后练习 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 第 8 章 消隐技术 8.1 线消隐 8.2 面消隐 8.2.1 区域排序算法 8.2.2 深度缓存(Z-buffer)算法 8.2.3 扫描线算法 8.3 消隐 8.4 消隐技术程序设计案例 8.5 课后练习 第 9 章 真实感图形绘制 9.1 颜色模型 9.1.1 CIE 色度图 9.1.2 常用的颜色模型 9.2 简单光照明模型 9.2.1 Phong 光照明模型 9.3 局部光照明模型 9.3.1 局部光照明模型 9.4 光透射模型 9.4.1 透明效果的简单模型 9.4.2 Whitted 光透射模型 4.4.3 Hall 光透射模型 9.4.4 简单光反射透射模型 9.5 纹理及纹理映射 9.5.1 纹理的概述 9.6 整体光照明模型 9.6.1 光线跟踪算法 9.6.2 辐射度方法 9.7 真实感图形学程序设计案例 9.8 课后练习 第 10 章 计算机动画 10.1 计算机动画概述 10.2 计算机动画的应用领域 10.3 计算机动画的分类和原理 10.4 目前计算机动画面临的问题 10.5 计算机动画程序设计案例 10.5.1 帧动画 10.5.1 实时动画 10.6 练习题 参考文献: 《计算机图形学原理及算法教程》(Visual C++版) 清华大学出版社出版 CAD 教育网制作www.cadedu.com 第一章 基本图形的生成 计算机图形学已成为计算机领域发展最快的领域,同时计算机图形软件 也相应得到快速发展。计算机绘图显示有屏幕显示、打印机打印屏幕上的图 样和绘图机输出图样等方式,其中用屏幕显示图样是计算机绘图的重要内 容。 计算机上常见的显示器为光栅图形显示器,光栅图形显示器可以看作像 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 2 素的矩阵。像素是组成图形的基本元素,一般称为“点”。通过点亮一些像 素,灭掉另一些像素,即在屏幕上产生图形。在光栅显示器上显示任何一种 图形,在显示器的相应像素点上画上所需颜色的像素点,即具有一种或多种 颜色的像素集合构成图形。确定最佳逼近图形的像素集合,并用指定属性写 像素的过程称为图形的扫描转换或光栅化。对于一维图形,在不考虑线宽 时,用一个像素宽的直、曲线来显示图形。二维图形的光栅化必须确定区域 对应的像素集,并用指定的属性或图案进行显示,即区域填充。 复杂的图形系统,都是由一些最基本的图形元素组成的。利用计算机编 制图形软件时,编制基本图形元素是相当重要的,也是必需的。点是基本图 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 3 形,本章主要讲述如何在指定的输出设备(如光栅图形显示器)上利用点构 造其它基本二维几何图形(点、直线、圆、椭圆、多边形域、字符串等)的 算法与原理,并利用 Visual C++编程实现这些算法。1.1 直线 数学上,理想的直线是由无数个点构成的集合,没有宽度。计算机绘制 直线是在显示器所给定的有限个像 素组成的矩阵中,确定最佳逼近该 直线的一组像素,并且按扫描线顺 序,对这些像素进行写操作,实现 图 1-1 DDA 方法扫描转换连接两点 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 4 显示器绘制直线,即通常所用说直线的扫描转换,或称直线光栅化。 由于一图形中可能包含成千上万条直线,所以要求绘制直线的算法应尽 可能的快。本节我们介绍一个像素宽直线的常用算法:数值微分法(DDA)、 中点画线法、Bresenham 算法。 1.1.1 DDA (数值微分)算法 一.DDA 算法原理 如图 1-1 所示,已知过端点 ),(),,( 111000 yxpyxp 的直线段 10 pp ;直线斜率为 ,从 x 的左端点 0x 开始,向 x 右端点步进画线,步长=1(个像素), CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 5 计算相应的 y 坐标 Bkxy += ;取像素点( x , )(yround )作为当前点的坐标。计 算 xkyxkBkxBkxy ii D+=D++=+= ++ 1111 当□ kyyx ii +== +1,1 即:当 x 每递增 1,y 递增 k(即直线斜率); 注意:上述分析的算法仅适用于□k□≤1 的情形。在这种情况下,x 每 增加 1,y 最多增加 1。当 1³k 时,必须把 x,y 地位互换,y 每增加 1,x 相 应增加 1/k(请参阅后面的 Visual C++程序)。 1.1.2 生成直线的中点画线 法 图 1-2 中点画线法每步迭代涉及的像素和中点示意图 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 6 中点画线法的基本原理,如图 1-2 所示,在画直线段的过程中,当前像 素点为 p,下一个像素点有两种选择,点 p1 或 p2 。M 为 p1 与 p2 中点,Q 为理 想直线与 x=xp+1 垂线的交点。当 M 在 Q 的下方,则 P2 应为下一个像素点;M 在 Q 的上方,应取 P1 为下一点。 中点画线法的实现。令直线段 L(p0(x0,y0), p1(x1, y1)), 其方程式 F(x,y)=ax+by+c=0。 其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0; 点与 L 的关系: 在直线上: F(x,y)=0; CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 7 在直线上方: F(x, y)>0; 在直线下方: F(x, y)<0; 把 M 代入 F(x,y)判断 F 的符号,可知 Q 点在中点 M 的上方还是下 方。为此构造判别式:d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c 当 d<0,L(Q 点) 在 M 上方,取 P2 为下一个像素; 当 d>0,L(Q 点)在 M 下方,取 P1 为下一个像素; 当 d=0,选 P1 或 P2 均可,取 P1 为下一个像素; 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 8 其中 d 是 xp, yp 的线性函数。 1.1.3 Bresenham 算法 一.Bresenham 算法原理 Bresenham 算法是计算机图形 学领域使用最广泛的直线扫描转换算法。由误差项符号决定下一个像素取右 边点还是右上方点。 设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为方程 y =mx+b, 其中 b=y1-m*x1 ,m=(y2-y1)/(x2-x1)=dy/dx; 此处的讨论直线方向限 图 1-3 第一象限直线光栅化 Bresenham 算法 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 9 于 1a 象限(图 1-3),当直线光栅化时,x 每次都增加 1 个单元,设 x 像素为 (xi,yi)。下一个像素的列坐标为 xi+1,行坐标为 yi,或者递增 1 为 yi+ 1,由 y 与 yi 及 yi+1 的距离 d1 及 d2 的大小而定。计算公式为 y=m(xi+1)+ b (1.1) d1 = y - yi (1.2) d2 = yi +1 - y (1.3) 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 10 如果 d1-d2>0,则 yi+1=yi+1,否则 yi+1=yi。 式(1.1)、(1.2)、(1.3)代入 d1-d2,再用 dx 乘等式两边,并以 Pi=(d1- d2) dx 代入上述等式,得 Pi = 2xidy-2yidx+2dy+(2b-1) dx (1.4) d1-d2 是用以判断符号的误差。由于在 1a 象限,dx 总大于 0,所 以 Pi 仍旧可以用作判断符号的误差。Pi+1 为 Pi+1 = Pi+2dy-2(yi+1-yi) dx (1.5) CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 11 求误差的初值 P1,可将 x1、y1 和 b 代入式(2.4)中的 xi、yi 而得到 P1 = 2dy-dx 综述上面的推导,第 1a 象限内的直线 Bresenham 算法思想如下: l ⒈ 画点(x1, y1),dx=x2-x1,dy=y2-y1,计算误差初值 P1=2dy-dx, i=1; l ⒉ 求 直线的下一点位置 xi+1 = xi + 1 如果 Pi>0 , 则 yi+1=yi+1,否则 yi+1=yi; l ⒊ 画点(xi+1, yi+1); l ⒋ 求下一个误差 Pi+1,如果 Pi>0,则 Pi+1=Pi+2dy-2dx,否则 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 12 Pi+1=Pi+2dy; l ⒌ i=i+1;如果 i1 时 y 每增加 1,x 相应增加 1/k。在这个算法中,y 与 k 用浮点数表示, 而且每一步都要对 y 进行四舍五入后取整。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 19 //中点算法生成直线代码见纸书 说明: 1. 其中 d 是 xp, yp 的线性函数,为了提高运算效率程序中采用增量计 算。具体算法如下:若当前像素处于 d>0 情况,则取正右方像素 P1 (xp+1, yp),判断下一个像素点的位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a;其中增量为 a;若 d<0 时,则取右上 方像素 P2(xp+1, yp+1)。判断再下一像素,则要计算 d2= F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b,增量为 a+b。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 20 2. 画线从(x0, y0)开始,d 的初值 d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b 因 F(x0, y0)=0,则 d0=a+0.5b。 3. 程序中只利用 d 的符号,d 的增量都是整数,只是初始值包含小数, 用 2d 代替 d,使程序中仅包含整数的运算。 //Bresenham 算法生成直线 代码见纸书 说明: 1. 以上程序已经考虑到所有象限直线的生成。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 21 2. Bresenham 算法的优点如下:(⒈) 不必计算直线的斜率,因此不做 除法。( ⒉ ) 不 用 浮 点 数 , 只 用 整 数 。( ⒊ ) 只做整数加减运算和乘 2 运 算,而乘 2 运算可以用移位操作实现。 4. ()Bresenham 算法的运算速度 很快。 1.2 圆 给出圆心坐标(xc, yc)和半径 r,逐点画出一个圆周的公式有下列两 种:1.2.1 直角坐标法(x-xc)2 + (y-yc)2 = r2 由上式导出: cc 22()yyrxx=±-- 当x-xc从-r到r作加1递增时,就可以求出对应的圆 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 22 周点的 y 坐标。但是这样求出的圆周上的点是不均匀的,|x-xc|越大,对应 生成圆周点之间的圆周距离也就越长。因此,所生成的圆不美观。1.2.1 中 点画圆法 如图 1-7 所示,函数为 的构造圆 ,圆上的点为 ,圆外的点 ,圆内的 点 ,构造判别式 若 则应取 P1 为下一像素,而且再下 一像素的判别式为 图 1-7 中点画圆法 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 23 若 则应取 P2 为下一像素,而且下一像素的判别式为 我们讨论按顺时针方向生成第二个八分圆,则第一个像素是(0,R),判别 式 d 的初始值为 1.2.3 圆的 Bresenham 算法 设圆的半径为 r。先考虑圆心在(0, 0),并从 x=0、y=r 开始的顺时针方 向的 1/8 圆周的生成过程。在这种情况下,x 每步增加 1,从 x=0 开始,到 x=y 结束。即有 xi+1 = xi + 1 相应的 yi+1 则在两种可能中选择: yi+1 = yi 或者 yi+1 = yi-1。选择的原则是考察精确值 y 是靠近 yi 还是靠近 yi- 1(图 1-8),计算式为 y2 = r2-(xi+1)2d1 = yi2-y2 = yi2-r2+(xi+1)2d2 = y2-(yi-1)2 = 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 24 r2-(xi+1)2-(yi-1)2 令 pi=d1-d2,并代入 d1、d2,则有 pi = 2(xi+1)2 + yi2 + (yi-1)2-2r2 (1.6) pi 称为误差。如果 pi<0 则 yi+1=yi,否则 yi+1=yi-1。 pi 的递归式为 pi+1 = pi + 4xi +6+2(yi2+1- yi2) -2(yi+1-yi) (1.7) pi 的初值由式(1.6)代入 xi=0,yi=r 而得 p1 = 3-2r (1.8) 根据上面的推导,圆周生成算法思想如下: ⒈ 求误差初值,p1=3-2r,i=1,画点(0, r); ⒉ 求下一个光栅位置,其中 xi+1=xi+1,如果 pi<0 则 yi+1=yi,否则 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 25 yi+1=yi-1; ⒊ 画点(xi+1, yi+1);⒋ 计算下一个误差,如果 pi<0 则 pi+1=pi+4xi+6,否则 pi+1=pi+4(xi-yi)+10; ⒌ i=i+1,如果 x=y 则结束,否则返回步骤 2。 二.程序设计 1. 创建应用程序框架,以上面建立的单文档程序框架为基础。 2. 编辑菜单资源 在工作区的【ResourceView】标签中,单击 Menu 项左边“+”, 然 后 双击其子项 IDR_MAINFRAME,并根据 1.3 表中的添加编辑菜单资源。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 26 此时建好的菜单如图 1-9 所示。 表 1.3 菜单资源表 图 1-9 3. 添加消息处理函数 菜单标题 菜单项标题 标示符 ID 中点画圆 ID_MIDPOINTCIRCLE 圆 Bresenham 画圆 ID_BRESENHAMCIRCLE CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 27 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处 理函数,ClassName 栏中选择 CMyView,根据表 1.4 建立如下的消息映射函 数,ClassWizard 会自动完成有关的函数声明。 表 1.4 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_MIDPOINTCIRCLE CONMMAN OnMidpointcircle ID_BRESENHAMCIRCLE CONMMAN OnBresenhamcircle 4. 程序结构代码,在 CMyView.cpp 文件中相应位置添加如下代码: 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 28 1.3 椭圆的扫描转换 1.3.1 椭圆的 特征 • 对于椭圆上的点,有 F(x,y)=0; • 对于椭圆外的点,F(x,y)>0; • 对于椭圆内的点,F(x,y)<0。以弧上斜率为-1 的点作为分界将第一象限 椭圆弧分为上下两部分(如图 1-9 所示)。 法向量 引理:若在 0),( 222222 =-+= bayaxbyxF yjaxibj y Fi x FyxN 22 22),( += ¶ ¶+ ¶ ¶= 上半部分 下半部分 二分量相等的法向量 图5-15 第一象限的椭圆弧 y x 图 1-9 第一象限的椭圆弧 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 29 当前点,法向量的 y 分量比 x 分量大,即 而在下一个点,不等号改变方向,则说明椭圆弧从上部分转入下部分。 3.3.2 椭圆的中点 Bresenham 算法算法原 理推导上半部分的椭圆 绘制公式 )5.0()1( 22 -<+ ii yaxb p(xi,yi) pu(xi+1,yi) pd(xi+1,yi-1) M(xi+1,yi-0.5) 5-17 上半部分椭圆弧的绘制原理图 1-11 上半部分椭圆弧的绘制原理 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 30 判别式•若d1≤0,取 Pu(xi+1,yi) •若d1>0 , 取 图 1-10 Bresenham 椭圆绘制算法原理 (a) d<=0的情况 P xi yi-2 xi+1 yi yi-1 xi+2 (b) d>0的情况 P xi xi+2xi+1 yi-1 yi yi-2 1-12 d CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 31 Pd(xi+1,yi-1) 误差项的递推 d1≤0: d1>0: 推导椭圆弧下半部分的绘制公式 )x(bd )x(bba).(ya)(xb ba).(ya)(xb).,yF(xd i iii iiii 32 32501 502502 2 1 2222222 222222 1 ++= ++--+++= --++=-+= )22()32( )22()32()5.0()1( )5.1()2()5.1,2( 22 1 22222222 222222 1 +-+++= +-+++--++= --++=-+= ii iiii iiii yaxbd yaxbbayaxb bayaxbyxFd 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 32 原理判别式 判别式的初始值 )25.0( )5.0()5.0,1( 22 22222 10 +-+= --+=-= bab bababbFd 222222 2 )1()5.0()1,5.0( bayaxbyxFd iiii --++=-+= p(xi,yi) pl(xi,yi-1)pr(xi+1,yi-1) M(xi+1,yi-0.5) 5-19 下半部分椭圆弧的绘制原理 (a) d>0的情况 P xi yi-2 xi+1 yi yi-1 xi+2 (b) d<=0的情况 P xi xi+2xi+1 yi-1 yi yi-2 图 1-13 下半部分椭圆弧的绘制原理 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 33 •若d2>0,取 Pl(xi,yi-1) •若d2≤0,取Pr(xi+1,yi-1) 误差项的递推 d2≤0: d2>0: )y(ad )y(aba)(ya)(xb ba)(ya)(xb),yF(xd i iii iiii 32 3215.0 25.025.0 2 2 2222222 222222 2 +-+= +-+--++= --++=-+= )32()22( )32()22()1()5.0( )2()5.1()2,5.1( 22 2 22222222 222222 2 +-+++= +-+++--++= --++=-+= ii iiii iiii yaxbd yaxbbayaxb bayaxbyxFd 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 34 算法步骤: 1.输入椭圆的长半轴 a 和短半轴 b。 2.计算初始值 d=b2+a2(-b+0.25)、x=0、y=b。 3.绘制点(x,y)及其在四分象限上的另外三个对称点。4.判断 d 的符号。若 d ≤0,则先将 d 更新为 d+b2(2x+3),再将(x,y)更新为(x+1,y);否则先将 d 更 新为 d+b2(2x+3)+a2(-2y+2),再将(x,y)更新为(x+1,y-1)。 5.当 b2(x+1)0 时,重复步骤 7 和 8。否则结束。 二.程序设计 1. 创建应用程序框架,以上面建立的单文档程序框架为基础。 222222 )1()5.0( bayaxbd --++= 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 36 2. 编辑菜单资源 在工作区的【ResourceView】标签中,单击 Menu 项左边“+”, 然 后 双击其子项 IDR_MAINFRAME,并根据 1.5 表中的添加编辑菜单资源。 此时建好的菜单如图 1-14 所示。 表 1.5 菜单资源表 图 1-14 3. 添加消息处理函数 菜单标题 菜单项标题 标示符 ID 椭圆 中点画椭圆 ID_MIDPOINTELLISPE CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 37 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处 理函数,ClassName 栏中选择 CMyView,根据表 1.6 建立如下的消息映射函 数,ClassWizard 会自动完成有关的函数声明。 表 1.6 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_MIDPOINTELLISPE CONMMAN OnMidpointellispe 4. 程序结构代码 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 38 1.4 多边形的扫描转换与区域填充 在计算机图形学中,多边形有两种重要的表示方法:顶点表示和点阵表 示。顶点表示是用多边形的顶点序列来表示多边形,特点直观、几何意义 强、占内存少,易于进行几何变换,但由于它没有明确指出哪些像素在多边 形内故不能直接用于面着色。点阵表示是用位于多边形内的像素集合来刻画 多边形。这种表示丢失了许多几何信息,但便于帧缓冲器表示图形,是面着 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 39 色所需要的图形表示形式。光栅图形的一个基本问题是把多边形的顶点表示 转换为点阵表示。这种转换称为多边形的扫描转换。 1.4.1 多边形的扫描转换 多边形可分为凸多边形、凹多边形、含内环的多边形。 ① 凸凸多边形:任意两顶点间的连线均在多边形内 ② 凹多边形 任意两顶点间的连线均在连线有不在多边内 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 40 ③ 含内环的多边形 形内的部分 2.4.1.1 扫描线算法 扫描线多边形区域填充算法是按扫描线顺序,计算扫描线与多边形的相 交区间,再用要求的颜色显示这些区间的像素。区间的端点可以通过计算扫 描线与多边形边界线的交点获得。对于一条扫描线,多边形的填充过程可以 分为四个步骤: CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 41 (1)求交:计算扫描线与多边形各边的交点; (2)排序:把所有交点按 x 值递增顺序排序; (3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线 与多边形的一个相交区间, (4)填色:把相交区间内的像素置成多边形颜色,把相交区间外的像素置 成背景色。 具体实现方法:为多边形的每一条边建立一边表;为了提高效率,在处 理一条扫描线时,仅对与它相交的多边形的边进行求交运算。我们把与当前 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 42 扫描线相交的边称为活性边,并把它们按与扫描线交点递增的顺序存放在一 个链表中,称此链表为活性边表。另外使用增量法计算时,我们需要知道一 条边何时不再与下一条扫描线相交,以便及时把它从扫描线循环删除出去。 为了方便活性边表的建立与更新,我们为每一条扫描线建立一个新边表 (NET),存放在该扫描线第一次出现的边。为使程序简单、易读,这里新边 表的结点应保存其对应边如下信息:当前边的边号、边的较低端点(xmin, ymin)与边的较高端点(xmax,ymax)和从当前扫描线到下一条扫描线间 x 的增量□ x。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 43 相邻扫描线间 x 的增量□ x 的计算,假定当前扫描线与多边形某一条边 的交点的 x 坐标为 x,则下一条扫描线与该边的交点不要重计算,只要加一 个增量△x。设该边的直线方程为:ax+by+c=0;若 y=yi,x=x i;则当 y = y i+1 时, 其中 为常数, 扫描线与多边形顶点相交的处理方法如图所示。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 44 1.扫描线与多边形相交 的边分处扫描线的两侧,则 记为一个交点,如点 P5,P6。 2.扫描线与多边形相交 的边分处扫描线同侧,且 yiyi-1,yi>yi+1,则计 0 个交点(不填色),如 P1 。 3.扫描线与多边形边界重合 (当要区分边界和边界内区域时需特殊处 理),则计 1 个交点。 图 1-15 扫描线与多边形相交,特殊情况的处理 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 45 具体实现时,只需检查顶点的两条边的另外两个端点的 y 值。按这两个 y 值中大于交点 y 值的个数是 0,1,2 来决定。 算法步骤: (1)初始化:构造边表; (2)对边表进行排序,构造活性边表; (3)对每条扫描线对应的对活性边表中求交点; (4)判断交点类型,并两两配对。 (5)对符合条件的交点之间用画线方式填充; (6)下一条扫描线,直至满足扫描结束条件。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 46 1.4.2 区域填充算法 这里的区域指已表示成点阵形式的填充图形,是像素的集合。区域有两 种表示形式:内点表示和边界表示。内点表示,即区域内的所有像素有相同 颜色;边界表示,即区域的边界点有相同颜色。区域填充指先将区域的一 点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。 区域填充算法要求区域是连通的。区域可分为 4 向连通区域和 8 向连通 区域。4 向连通区域指的是从区域上一点出发,可通过四个方向,即上、 下、左、右移动的组合,在不越出区域的前提下,到达区域内的任意像素; CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 47 8 向连通区域指的是从区域内每一像素出发,可通过八个方向,即上、下、 左、右、左上、右上、左下、右下这八个方向的移动的组合来到达。 图 1-16 四连通区域和八连通 图 1-17 区域的内点表示和边界 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 48 1.1.2.1 区域填充的递归算法 上面讨论的多边形填充算法是按扫描线顺序进行的。种子填充算法则是 假设在多边形内有一像素已知,由此出发利用连通性填充区域内的所有像 素。一般采用多次递归方式。 1.4.2.2 区域填充的扫描线算法 算法的基本过程如下:给定种子点(x,y),首先填充种子点所在扫描线 上给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上 位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 49 区域填充的扫描线算法可由下列三个步骤实现: (1)初始化:确定种子点元素(x,y)。 (2)判断种子点(x,y)是否满足非边界、非填充色的条件,满足条件,以 y 作为当前扫描线沿当前扫描线向左、右两个方向填充,直到边界。 (3) 确定新的种子点:检查与当前扫描线 y 上、下相邻的两条扫描线上的像 素。若存在非边界、未填充的像素,则返回第(2)步进行扫描填充。直至 区域所有元素均为填充色,程序结束。 扫描线填充算法提高了区域填充的效率。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 50 二.程序设计 1. 创建应用程序框架,以上述单文档程序框架为基础。 2. 编辑菜单资源 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 51 在工作区的【ResourceView】标签中,单击 Menu 项左边“+”, 然 后 双击其子项 IDR_MAINFRAME,并根据 1.7 表中的添加编辑菜单资源。 此时建好的菜单如图 1-18 所示。 表 1.7 菜单资源表 图 1-18 3. 添加消息处理函数 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处 菜单标题 菜单项标题 标示符 ID 区域填充 多边形扫描填充 ID_MIDPOINTELLISPE 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 52 理函数,ClassName 栏中选择 CMyView,根据表 1.8 建立如下的消息映射函 数,ClassWizard 会自动完成有关的函数声明。 表 1.8 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_MIDPOINTELLISPE CONMMAN OnMidpointellispe 4. 添加程序结构代码 (1) 在“基本图形的生成 View.h”适当位置添加以下黑体字部分代码 代码见纸书 说明:1。双击鼠标左键,出现需填充的多边形,点击相关功能菜单实现区 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 53 域填充。 2.进行种子填充,需用鼠标右键,单击多边形内一点,作为开始填 充的种子点。 代码见纸书 1.5 字符的生成 字符指数字、字母、汉字等符号。计算机中字符由一个数字编码唯一标 识。国际上最流行的字符集是“美国信息交换用标准代码集”简称 ASCII 码。它是用 7 位二进制数进行编码表示 128 个字符,包括字母、标点、运算 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 54 符以及一些特殊符号。我国除采用 ASCII 码外,还另外制定了汉字编码的国 家标准字符集 GB2312-80。该字符集分为 94 个区,94 个位,每个符号由一 个区码和一个位码共同标识。区码和位码各用一个字节表示。为了能够区分 ASCII 码与汉字编码,采用字节的最高位来标识:最高位为 0 表示 ASCII 码;最高位为 1 表示表示汉字编码。为了在显示器等输出设备上输出字符, 系统中必须装备有相应的字库。字库中存储了每个字符的形状信息,字库分 为矢量和点阵型两种。 1.5.1 点阵字符 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 55 在点阵字符库中,每个字符由一个位图表示。该位为 1 表示字符的笔画 经过此位,对应于此位的像素应置为字符颜色。该位为 0 表示字符的笔画不 经过此位,对应于此位的像素应置为背景颜色。在实际应用中,有多种字体 (如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间是 很庞大的。解决这个问题一般采用压缩技术。如: 黑白段压缩;部件压 缩;轮廓字形压缩等。其中,轮廓字形法压缩比大,且能保证字符质量,是 当今国际上最流行的一种方法。轮廓字形法采用直线或二/三次 bezier 曲线 的集合来描述一个字符的轮廓线。轮廓线构成一个或若干个封闭的平面区 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 56 域。轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信息就构成 了字符的压缩数据。 点阵字符的显示分为两步。首先从字库中将它的位图检索出来。然后将 检索到的位图写到帧缓冲器中。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 57 (a)点阵字符 (b)点阵字库中的位图表 示 (c) 矢量轮廓字符 图 1-19 字符的种类 1.5.2 矢量字符 矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美 观、变换方便等优点。对于字符的旋转、缩放等变换,点阵字符的变换需要 对表示字符位图中的每一像素进行;而矢量字符的变换只要对其笔画端点进 行变换就可以了。矢量字符的显示也分为两步。首先从字库中将它的字符信 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 58 息。然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显 示出字符。 1.5.3 字符属性 字符属性一般包括:字体、字高、字宽因子(扩展/压缩)、字倾斜角、对 齐方式、字色和写方式等,其中: 宋体:如仿宋体 楷体 黑体 隶书; 字倾斜角:如倾斜 ; 对齐:如左对齐、中心对齐、右对齐; 字色:如红、绿、蓝色; CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 59 写方式:替换方式时,对应字符掩模中空白区被置成背景色。与方式 时,这部分区域颜色不受影响。 1.6 图形裁剪 在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而 屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之 内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。这个选 择过程称为裁剪。最简单的裁剪方法是把各种图形扫描转换为点之后,再判 断各点是否在窗内。但那样太费时,一般不可取。这是因为有些图形组成部 分全部在窗口外,可以完全排除,不必进行扫描转换。所以一般采用先裁剪 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 60 再扫描转换的方法。 1.6.1 线裁剪 (a)裁剪前 (b) 裁剪后 图 1-20 多边形裁剪 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 61 1.直线和窗口的关系可以分 为如下 3 类(图 1-21): ⑴ 整条 直线在窗口内。此时,不需剪裁, 显示整条直线。 ⑵ 整条直线在 窗口外,此时,不需剪裁,不显示 整条直线。 ⑶ 部分直线在窗口内,部分直线在窗口外。此时,需要求出 直线与窗框的交点,并将窗口外的直线部分剪裁掉,显示窗口内的直线部 分。 直线剪裁算法有两个主要步骤。首先将不需剪裁的直线挑出,即删去 图 1-21 直线与窗口的关系 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 62 在窗外的直线。然后,对其余直线,逐条与窗框求交点,并将窗口外的 部 分删去。 2。Cohen-Sutherland 直线剪裁算法 以 区 域 编 码 为基础,将窗口及其周围的 8 个方向以 4 bit 的二进制数进行编码。如图 2-22 所示的编码方法将窗口及其邻域分为 5 个区域:⑴ 内域:区域 图1-22 窗口及其邻域的 5 个区域及与直线的关系 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 63 (0000)。⑵ 上域:区域(1001, 1000, 1010)。⑶ 下域:区域(0101, 0100, 0110)。⑷ 左域:区域(1001, 0001, 0101)。⑸ 右域:区域(1010, 0010, 0110)。 当线段的两个端点的编码的逻辑“与”非零时 ,线段为显然不可 见的。对某线段的两各端点的区号进行位与运算,可知这两个端点是否同在 视区的上、下、左、右。算法的主要思想是,对每条直线,如 P1P2 利用以 下步骤进行判断: ⑴ 对直线两端点 P1、P2 编码分别记为 C1(P1)={a1, b1, c1, d1}, C2(P2)={a2, b2, c2, d2}其中,ai、bi、ci、di 取值范围为{1, 0},i∈ {1, 2}。 ⑵ 如果 ai=bi=ci=di=0,则显示整条直线,取出下一条直线,返步骤 (1);否则,进入步骤(3)。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 64 ⑶如果|a1-a2|=1,则求直线与窗上边(y=yw-max)的交点,并删去交点以 上部分。如果|b1-b2|=1,|c1-c2= |=1,|d1-d2|=1,作类似处理。⑷ 返步 骤(1)判断下一条直线。 1.6.2 多边形裁剪 多边形剪裁算法的关键在于,通过剪裁,要保持窗口内多边形的边界部 分,而且要将窗框的有关部分按一定次序插入多边形的保留边界之间,从而 使剪裁后的多边形的边仍然保持封闭状态,以便填色算法得以正确实现 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 65 图 1-23 多边形裁剪原理示意图 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 66 Sutherland-Hodgman 算法:思路:将多边形的各边先相对于窗口的某一条 边界进行裁剪,然后将裁剪结果再与另一条边界进行裁剪,如此重复多次, 便可得到最终结果。实现方法: ①设置二个表 输入顶点表(向量)—用于存放被裁剪多边形的顶点 p1-pm。输出顶点表 (线性链表)—用于存放裁剪过程中及结果的顶点 q1-qn。 ②输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆时针方 向。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 67 ③相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪。 图 1-24 多边形裁剪操作示意图 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 68 具体操作: (1) P i 若位于边界线的可见一侧,则 Pi 送输出顶点表 (2) P i 若位于边界线的不可见一侧,则将其舍弃。 (3) 除第一个顶点外,还要检查每一个 Pi 和前一顶点 Pi-1 是否位 于窗口边界的同一侧,若不在同一侧,则需计算出交点送输出顶点表。 (4) 最后一个顶点 Pn 则还要与 P1 一起进行同样的检查。 1.6.3 字符裁剪 前面我们介绍了字符和文本的输出。当字符和文本部分在窗口内,部分 在窗口外时,就提出了字符裁剪问题。字符串裁剪可按三个精度来进行:串 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 69 精度、字符精度、以及笔画\象素精度。采用串精度进行裁剪时,将包围字 串的外接矩形对窗口作裁剪。当字符串方框整个在窗口内时予以显示,否则 不显示。采用字符精度进行裁剪时,将包围字的外接矩形对窗口作裁剪,某 个字符方框整个落在窗口内予以显示,否则不显示。采用笔画\象素精度进 行裁剪时,将笔划分解成直线段对窗口作裁剪,处理方法同上。 (a)待裁剪字符串 (b)串精度裁剪 (c)字符精度裁剪 (d)象素精度 裁剪图 1-25 字符裁剪 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 70 1.6.4 图形裁剪编程 一、程序设计功能说明 如图 1-26 所示为图形裁剪的实用程序界面。为本例程序运行时的主界 面,首先根据界面提示,在用户区双击鼠标左键,出现所需要裁剪的各种线 段,再单击菜单中【图形裁剪】可选择其下拉菜单的各图形裁剪选项完成各 种 图 裁剪(在窗口中红矩形框外的线段或多边形被裁减掉)。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 71 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 72 图 1-26 二、程序设计步骤 1. 建工程名称为“图形裁剪”单文档应用程序框架(参看上面单文档 应用程序框架的建立) CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 73 2. 编辑菜单资源 设计如图 1-26 所示的菜单项。在工作区的【ResourceView】标签 中,单击 Menu 项左边“+”, 然 后 双击其子项 IDR_MAINFRAME,并根 据 1.9 表中的定义编辑菜单资源。 表 1.9 菜单资源表 3. 添加消息处理函数 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处 菜单标题 菜单项标题 标示符 ID 线段裁剪 ID_CLIPLINE 图形裁剪 多边形裁剪 ID_CLIPPOLYGON 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 74 理函数,ClassName 栏中选择 CMyView,根据表 1.10 建立如下的消息映射 函数,ClassWizard 会自动完成有关的函数声明。 表 1.10 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_CLIPLINE CONMMAN OnIDTRANSLATION ID_CLIPPOLYGON CONMMAN OnIDROTATION 4. 添加代码,在图形裁剪应用程序的相应文件中添加如下黑体字部分 代码 1.在“图形裁剪 View.h”文档中的适当位置添加定义存储线段端点的 数组: CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 75 2.在“图形裁剪 View.cpp”文档中的适当位置手工添加以下黑体部分代 码: 代码见纸书 说明:为避免上述“图形裁剪”程序执行中,在没有双击左键就直接单 击【线段裁剪】或没有双击左键就直接单击【多边形裁剪】的情况发生,设 置了消息对话框进行警告。 1.7 Visual C++中基本绘图函数 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 76 实际利用 Visual C++中编制图形程序,我们可以利用上述算法自己动手 编制基本图形程序,作为图形程序的基类,当然我们还可利用系统中已提供 的图形基类。下面简单介绍 Visual C++提供的常用绘制图形函数。 1.点 画点是最基本的绘图操作,在绘图中,画点是通过调用 CDC::SetPixel() 或 CDC::SetPixel()函数来实现的,原型如: (1)COLORREF SetPixel(int x, int y, COLORREF crColor); (2) COLORREF SetPixel(POINT point, COLORREF crColor); (3) BOOL SetPixelV(int x, int y, COLORREF crColor); CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 77 (2)BOOL SetPixelV(POINT point, COLORREF crColor); 2. 画笔 一般格式:(1)Cpen( ):: Cpen(int nPenStyle, int nWidth, CORLORREF crColor); 各属性意义: nPenStyle 设置画笔的式样,式样有:PS_SOLID(实 线), PS_DASH(虚线)、 PS_DASHDOT(点划线)、 PS_DASHDOTDOT (双点划线)、 PS_DOT(点线)、 PS_NULL(空笔不画线);nWidth 设置线 的宽度,默认值为 1(1 个像素宽);crColor 表示颜色,可用 DWOR 表示, 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 78 也可用 RGB(r, g, b)表示。 3.画刷,用于指定填充的特征,画刷创建有格式有: (1) CBrush :: CBrush ( 创建一个空的画刷对象),可用 GreateSolidBrush() , GreatehatchBrush() , GreatehatchBrushIndrect() , GreatePatternBrush(),GreateDIBPatternBrush()建立画刷; (2) CBrush::CBrush()建立单一颜色的画刷,用次画刷画出的图形内部将会 填充指定颜色; (3) CBrush::CBrush(int nIndex, COLORREF crColor);构建名为 hatch 的 画刷,特点为画出的多边形内部将填充 nrColor 指定的线条格式, CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 79 nrColor 有 : HS_BDIAGONAL ( 45 度 左下→右上的斜线)、 HS_CROSS(垂直线和水平线)、 HS_DIAGCROSS(45 度左上→右 下、左上→右下的相交斜线)、 HS_HDLAGNAL(45 度左上→右下的 斜线)、 HS_HORIZONAL(水平线)、 HS_VERTICAL(垂直线) (4) CBrush::CBrush(Cbitmap *pBitmap)中 pBitmap 指向 Cbitmap 对象的 指针,这一位图对象包含用作画刷图按的位图,此位图必须为 8×8 大小,否则将对原位图进行裁剪。 创建画刷和画笔后,还要用 CDC 类选中画笔和画刷,用 CPaintDC, CClientDC 或 CWindowDC 来选中、绘图及撤销对象。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 80 CClientDC 对象代表客户程序区域的绘图画面只能在窗口的客户区域中 画图。若需处理整个画面(包括客户程序区域和非客户程序区)设备上下文 的调用和释放可用 CWindowDC。 4.绘制直线函数 (1)MoveTo()函数用来设置当前的 x,y 的位置,创建有格式有: CPoint MoveTo(int x, int y) CPoint MoveTo(POINT point) 其中 x,y 用于定义新位置的坐标,point 指定新位置,可为其传递一个 Point 对象。 CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 81 功能:是将线的起点从当前位置移到新位置(x,y), 并且只移动点不画 线。 (2)LineTo()用于绘制起点坐标到始点直线,创建有格式有: BOOL LineTo(int x, int y) BOOL LineTo(POINT point) 其中 x,y 用于定义线的终点坐标,point 指定线段端点位置,可为其传 递一个 Point 结构或 Point 对象。 功能:是从当前的位置到新位置(x,y)画线(不包括此端点)。 5 . 椭圆函数 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 82 创建格式有: BOOL Ellipse(int x1, int y1 , int x2, int y2) BOOL Ellipse(LPCRECT lpRect) 说明:x1, y1,限定椭圆范围的矩形左上角坐标;x2, y2 限定椭圆范围 的矩形右下角坐标。 LpRect 指定椭圆的限定矩形,可为其传递一个 CRect 对象。 6. 函数绘制一段椭圆弧 Arc() 创建格式有: BOOL Arc(int x1, int y1 , int x2, int y2, int x3, int y3 , int x4, int y4) CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 83 BOOL Ellipse(LPCRECT lpRect) x1, y1,限定椭圆弧范围的矩形左上角坐标;x2, y2 限定椭圆弧范围的 矩形右下角坐标。X3, y3 起点坐标;x2, y2 终点坐标。 7. 矩形函数 创建格式有: BOOL Rectangle(int x1, int y1 , int x2, int y2) x1, y1 矩形左上角坐标;x2, y2 矩形右下角坐标。 功能使用当前画笔画一矩形。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 84 8. 连续画线函数 创建格式有: (1)BOOL PolyLine(LPPOINT lpPoints , int nCount); 说明:lpPoints 指向 POINT 结构数组,数组中每一个结构标识一个点的 坐标; nCount::定义数组中的点数,使用当前画笔右第一个点开始经后续点连 续画线直到最后一个点。 (2) BOOL PolyLineTo(LPPOINT *lpPoints , int nCount); CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 85 说明:lpPoints 指向 POINT 结构数组指针,画一条或多条直线的指针, 数组中村方直线顶点的坐标; nCount::定义数组中的点数。 (3) BOOL PolyBezier(LPPOINT *lpPoints); 说明:lpPoints 指向 POINT 结构数组指针,画一条或多条直线的指针, 数组中包括曲线的重点和控制点; nCount::定义数组中的点数。 绘制三次贝塞尔曲线需要 2 个控制点和一个终点和一个起点,共 4 个点 决定一条贝塞尔曲线。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 86 (4)BOOL PolyBezierTo(LPPOINT *lpPoints);画一条或多条贝塞尔曲 线。 (5)BOOL PolyBezierTo(LPPOINT *lpPoints);画一条或多条贝塞尔曲线 lpPoints 指向 POINT 结构数组指针,画一条或多条直线的指针,数 组中包括曲线的重点和控制点; nCount::定义数组中的点数。 9. 多边形绘制函数 创建格式有: (1) BOOL Polygon(counst POINT lpPoints, int nCount); CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 87 说明:lpPoint 指定多边形顶点数组中每一点是一个 POINT 结构或一个 CPoint 对象,nCount 指定数组中顶点数。 (2) BOOL PolyPolygon(LPPOINT lpPoints,lpint lpPolyCounts, int lpPoints); 说明:lpPoint 指向一个 POINT 结构或 CPoint 对象数组,每个数组定义 一个多边形的顶点;lpPolyCounts 指向一个整数数组,每个整数说明 lpPoints 数组中一个多边形的顶点数,nCount::为 LpPolyCount 数组中 的项数,即指定要画的多边形数,最多为 2。 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 88 10. 填充函数 创建格式有: (1)BOOL FillSolidRect(LPCRECT lpRect, COLORREF crColor); (2)BOOL FillSolidRect(int x, int y ,int cx, int cy, COLORREF Clr); 说明:LpRect 指定矩形可传递一个指向 RECT 结构的指针或 CRect 对 象。 Clr 为填充颜色;x,y 矩形左下角,cx 为矩形宽,cy 为矩形高。 (3)BOOL ExtFloodFill(int x, int y , COLORREF crColor,UINT nFillType); 说明:X,y 为开始填充处坐标;crColor 为填充颜色;FloodFillBorder CAD 教育网制作www.cadedu.com CAD 教育网制作www.cadedu.com 89 指填充区域由 crColor 参数所指定颜色包围部分;FloodFillSurface 表示填充 区域是由 nColor 指定颜色来定义矩形填充 (5) BOOL FloodFill(int x, int y ,COLORREF Clr); 说明:x, y 为填充处逻辑坐标或边界颜色,crColor 指定填充颜色。 以上我们简单介绍了系统中提供的基本绘图函数,更多内容请参见其它 参考书。 1. 8 课后练习 1. 为什么说直线生成算法是二维图形生成技术的基础? 《计算机图形学原理及算法教程》(Visual C++版)和青芳.. ..清华大学出版社出版 CAD 教育网制作www.cadedu.com 90 2. 根据 DDA 算法编制绘制从(10, 10)到(300,400)直线的程序 3. 将中点画线算法推广以便能画出任意斜率的直线。 4. 使用中点分割算法实现对直线段进行裁剪的程序。 5. 利用本章所建程序框架,在菜单项【圆】的子菜单中添加【直角坐 标画圆】子菜单,并添加相应命令和代码实现直角坐标画圆程序,加 深对画圆算法的理解并与其它算法程序相比较。 6. 利用 Visual C++以定义函数实现上述直线、圆、椭圆等图形的绘 制,并进行区域填充。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 第二章 二维图形 利用计算机绘制的图形与我们日常见到的图片、照片是有相似之处。除 图片、照片等图形外,自然界中还存在丰富多彩的有形物体。一般,根据图 形所在空间的不同,可将图形分为:三维图形和二维图形。图片、照片属二 维图形,自然界中形形色色的物体属于三维图形。在计算机绘图的过程中, 二维图形的绘制是绘制三维图形的基础,研究计算机图形的生成必须从研究 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 2 二维图形开始。计算机绘制图形时,无论图形多么复杂,都是利用一些相应 图形基元经过图形变换组成的。在计算机绘图中,经常用到图形变换,图形 变换是指图形信息经过几何变换后产生新的图形。基本的几何变换研究物体 坐标在直角坐标系内的平移、旋转和变比等规则。下面介绍二维图形的这些 基本变换规则。 2.1 用户坐标到屏幕坐标的变换 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 3 实际图纸上坐标系是实数域中的直角坐标系或极坐标系,统称为用户坐 标系;计算机设备(如屏幕)上采用的坐标系为整数域(如屏幕一般为直角 左手系),称为设备坐标系。因此用户坐标系中图形需经过变换才能绘制在 图 2-1 窗口区和视口区示意图 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 4 设备(如屏幕)上。用户坐标系中图形一般只有部分图形需要在设备上显示 (或绘制),用户坐标中需要显示的图形(矩形区域)称为窗口,在设备 (屏幕)上,显示(或绘制)图形的区域(矩形区域)称为视口。在计算机 上绘制图形时,实际的窗口区与视图区往往不一样大小,要在视图区正确地 显示形体的,必须将其从窗口区变换到视图区 2.1.1 窗口到视口的变换内容 图形从窗口到视口的变换亦称为数据规格化。窗口到视口变换包括以下 内容: (1) 窗口逻辑坐标与设备坐标的转换,当把用户坐标系(逻辑单位)中 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 5 的图形变换到视口中,视口中的坐标单位不再为逻辑单位,而是设备 坐标(以像素为单位),根据设备的无关性,图形映射在视口上的图形 大小应是不变的,这要求有像素与逻辑单位的转换比例(这一比例的 大小随屏幕的大小和分辨率的高低有关)。 (2) 用户坐标系所选区域内图形的坐标转换到屏幕上坐标不一定为整 数,对转换后坐标值取整。可通过四舍五入的方法将实型值的绝对值 圆整化,最简单的方法是用赋值的类型转化规则来实现实型到整型的 变换。 (3) 用户坐标系到设备(屏幕)坐标系,坐标轴方向变换。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 6 (4) 屏幕坐标系水平方向与垂直方向刻度若不等(即像素间距不等) 时,为保证图形不走样,还要进行比例变换。 2.1.2 窗口区到视图区的坐标变换 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 7 如图 2-1 所示,根据图中比例关系,窗口区到视图区的坐标变换公 式可写为: 其中: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 8 总之,用矩阵表示为: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 9 2.2 二维几何变换 图形基本变换是指图形的比例变换、对称变换、旋转变换、错切变换、 平移变换等。通过对原图形上二维向量引进第三个坐标即三维点向量(又称 齐次坐标点),简称齐次坐标,在三维齐次坐标下,二维几何变换都可统一 用矩阵表示。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 10 所谓齐次坐标就是将一个原本是 n 维的向量用一个 n+1 维向量来表示。 如向量 的齐次坐标表示为 ,其中 h 是一个 实数。显然一个向量的齐次表示是不唯一的,齐次坐标的 h 取不同的值都表 示的是同一个点,比如齐次坐标[8,4,2]、[4,2,1]表示的都是二维点 [2,1]。 引进齐次坐标的优点: A. 提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从 一个坐标系变换到另一个坐标系的有效方法。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 11 B. 可以表示无穷远的点。n+1 维的齐次坐标中如果 h=0,实际上就 表示了 n 维空间的一个无穷远点。对于齐次坐标[a,b,h],保持 a,b 不变, 的过程就表示了在二维坐 标系中的一个点沿直线 ax+by=0 逐渐走向无穷远处的过程。 2.2.1 基本变换 1.平移变换 若图形上任意一点的坐标为 ),( yx ,通过沿 yx和 轴分别平移 yx TT 和 后成为 新图形上的一点 ),( yx ¢¢ ,坐标变换: yxT Tyy'xx' +=+= 用齐次坐标表示的平移变换为: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 12 [][] 100 11010 1xy xyxy TT éù êú¢¢ = êú êúëû 其中平移变换矩阵为 ú ú ú û ù ê ê ê ë é 1 010 001 yx TT 2. 比例变换 若图形上任意一点的坐标为 ),( yx ,通过沿 yx和 轴分别变比变换 yx SS 和 后 成为新图形上的一点 ),( yx ¢¢,坐标变换: 缩小 放大 1S0ySy' 1SxSx' <<×= >×= yy xx 用齐次坐标表示的比例变换为: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 13 [][] 00 1100 001 x y S xyxyS éù êú¢¢ = êú êúëû 其中比例变换矩阵为 ú ú ú û ù ê ê ê ë é 100 00 00 y x S S 3. 旋转变换 若图形上任意一点的坐标为 ),( yx ,通过将将对对象象上上的的各各点点((xx,, yy))围围绕绕原原点点 逆逆时时针针转转动动一一个个角角度度θ,, 后成为新图形上的一点 ),( yx ¢¢, 坐标变换: 顺时针0θ 0θ cosθysinθxy' sinθycosθxx' < > ×+×= ×-×= 逆时针 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 14 用齐次坐标表示的旋转变换为: [][] ú ú ú û ù ê ê ê ë é -=¢¢ 100 0cossin 0sincos 1,,1,, θθ θθ yxyx 其中旋转变换矩阵为 ú ú ú û ù ê ê ê ë é - 100 0cossin 0sincos θθ θθ 4. 对称变换 若图形上任意一点的坐标为 ),( yx ,关于 和原点、yx 分别作对称变换后成为 新图形上的一点 ),( yx ¢¢ ,对称变换可分别表示为: 关于 x 坐标对称变换 yy'xx' -== CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 15 用齐次矩阵表示的对称变换:[][] ú ú ú û ù ê ê ê ë é- =¢¢ 100 010 001 1,,1,, yxyx 其中关于x作对称变换矩阵为 ú ú ú û ù ê ê ê ë é- 100 010 001 关于 y坐标对称变换 yy'xx' =-= 用齐次矩阵表示的对称变换: [][] ú ú ú û ù ê ê ê ë é -=¢¢ 100 010 001 1,,1,, yxyx 其中关于y作对称变换矩阵为 ú ú ú û ù ê ê ê ë é - 100 010 001 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 16 关于原点坐标对称变换: yy'xx' -=-= 用齐次矩阵表示的对称变换:[][] ú ú ú û ù ê ê ê ë é - - =¢¢ 100 010 001 1,,1,, yxyx 其中关于原点作对称变换矩阵为 ú ú ú û ù ê ê ê ë é - - 100 010 001 5 .错切 1.沿 x 方向错切: 沿 + x 方向错切,坐标变换 yy' xcyx' = += c > 0 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 17 沿– x 方向错切 ,坐标变换 yy' xcyx' = +-= c > 0 用齐次矩阵表示的对称变换:[][] úû ù êë é ±= 1c 01yxy'x' 2.沿 x 方向错切: 向 + y 方向错切 ,坐标变换 ybxy' xx' += = b > 0 沿– y 方向错切 ,坐标变换 ybxy' xx' +-= = b > 0 用齐次矩阵表示的对称 变换: [][] úû ù êë é±= 00 b1yxy'x' CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 18 2.2.2 二维几何变换的级联 (1)实际中的几何变换一次有若干个; (2)基本形式有局限性。图形的 级联变换是指图形作一次以上的基本变换,变换结果为每次基本变换矩阵乘 积。 设图形经过 n 次基本几何变换,其变换矩阵分别为 T1, T2,…, Tn 则: 经T1后: [ ] [ ] 1T1yx1y'x' ×= 经 T2 后:[ ] [ ] [ ] 212 TT1yxT1y'x'1y"x" ××=×= 经 Tn 后:[ ] [ ] TTTT1yx1*y*x n21 =××= L 称T = T1·T2 … Tn 为级联变 换的变换矩阵。下面介绍几种常见级联变换。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 19 1.复合平移 若对图形首先做平移变换 1T ,然后再做平移变换 2T ,相应的平移变换矩 阵分别为: ú ú ú û ù ê ê ê ë é = 1 010 001 11 1 ml T ú ú ú û ù ê ê ê ë é = 1 010 001 22 2 ml T 变换结果为复合平移变换T ,其复合平移变换矩阵为: ú ú ú û ù ê ê ê ë é ++ = ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é = ×= 1 010 001 1 010 001 1 010 001 21212211 21 mmllmlml TTT CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 20 2.复合比例 设比例变换 1T 矩阵为: ú ú ú û ù ê ê ê ë é = 100 00 00 1 1 1 d a T 设比例变换 2T 矩阵为: ú ú ú û ù ê ê ê ë é = 100 00 00 2 2 2 d a T 则复合比例变换T 矩阵为: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 21 ú ú ú û ù ê ê ê ë é × × = ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é = ×= 100 00 00 100 00 00 100 00 00 21 21 1 1 1 1 21 dd aa d a d a TTT 3. 复合旋转 设比例变换 1T 矩阵为: ú ú ú û ù ê ê ê ë é -= 100 0cossin 0sincos 11 11 1 θθ θθ T 设比例变换 2T 矩阵为: ú ú ú û ù ê ê ê ë é -= 100 0cossin 0sincos 22 22 2 θθ θθ T CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 22 则复合比例变换T 矩阵为: ú ú ú û ù ê ê ê ë é ++- ++ = ú ú ú û ù ê ê ê ë é - ú ú ú û ù ê ê ê ë é -= ×= 100 0)cos()sin( 0)sin()cos( 100 0cossin 0sincos 100 0cossin 0sincos 2121 2121 22 22 11 11 21 θθθθ θθθθ θθ θθ θθ θθ TTT 旋转 变换合比例变换都与参考点有关,上面的旋转变换和比例变换均是相对与原 点的。如果相对于某一参考点 ),( 00 yx 作比例和旋转变换,则其变换过程是先 将坐标原点平移到 ),( 00 yx ,在再新的坐标系下作比例、旋转变换,然后将坐 标原点平移回去,即复合变换。 4.相对于点 ),( 00 yx 的比例变换 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 23 ú ú ú û ù ê ê ê ë é -- = ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é -- = 1)1()1( 010 001 1 010 001 100 00 00 1 010 001 000000 ydxayx d a yx T 5.相对于点 ),( 00 yx 的旋转变换 ú ú ú û ù ê ê ê ë é ×+×-×-×- -= ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é - ú ú ú û ù ê ê ê ë é -- = 1sin)cos1(sin)cos1( 0cossin 0sincos 1 010 001 100 0cossin 0sincos 1 010 001 0000 0000 θθθθ θθ θθ θθ θθ xyyx yxyx T CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 24 对于复合变换问题,关键是将其分解为一定顺序的基本变换,然后逐一 进行这些基本变换,最终得到复合变换结果;或者求出这些基本变换矩阵连 乘积,亦可得到复合变换。 综上所述,可以证明利用齐次坐标表示方法,二维图形几何变换矩阵的 一般变换过程为: ú ú ú û ù ê ê ê ë é ×=×=¢¢ sml qdc pba yxTyxyx D ]1[]1[]1[ 2 ,其中 DT2 称为二维几何变换得一 般表达时,进一步可分为以下四个矩阵: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 25 úû ù êë é= dc baT1 对图形进行比例、旋转、对称等变换; [ ]mlT =2 对图形进行平移变换; úû ù êë é= q pT3 对图形做投影变换。 [ ]sT =4 产生整体比例变换。 2.2.3 几何变换程序设计案例 1、 程序设计功能说明 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 26 程序为二维几何变换的应用程序,实现以上介绍的各种二维几何图形的 变换。如图 2-2 所示为程序运行时的主界面,通过单击菜单中【几何变换】 与【复合变换】及下拉菜单的各功能项完成分别各种几何变换。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 27 图 2-2 2. 程序设计步骤 (1) 创建工程名称为“几何图形变换”的单文档应用程序框架(详细过 程请参见第二章有关内容) (2) 编辑菜单资源 设计如图 3-1 所示的菜单项。在工作区的【ResourceView】标签中, CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 28 单击 Menu 项左边“+”,然后双击其子项 IDR_MAINFRAME,并根据 2.1 表中的定义编辑菜单资源。创建如图 2-3 所示的程序框架。 表 2.1 菜单资源表 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 29 菜单标题 菜单项标题 标示符 ID 平移 旋转 变比 ID_TRANSLATION ID_ROTATION ID_SCALING 基本图形变换 对称 关于 X 轴 对称 关于 Y 轴 对称 关 于 原点 对称 ID_MIRROR_X ID_MIRROR_Y ID_MIRROR_O 复合变换 相对非原点的变比 绕非原点旋转 ID_SCALINGXY ID_ROTATIONXY CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 30 图 2-3 (3) 添加消息处理函数 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处 理函数,ClassName 栏中选择 CMyView,根据表 2.2 建立如下的消息映射函 数,完成有关的函数声明。 表 2.2 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_TRANSLATION CONMMAN OnIDTRANSLATION ID_ROTATION CONMMAN OnIDROTATION ID_SCALING CONMMAN OnIDROTATION D_MIRROR_X CONMMAN OnIDMIRRORX ID_MIRROR_Y CONMMAN OnIDMIRRORY CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 31 ID_MIRROR_O CONMMAN OnIDMIRRORO ID_SCALINGXY CONMMAN OnIDSCALINGXY ID_ROTATIONXY CONMMAN OnIDROTATIONXY (4) 手工添加几何变换绘图基类 为程序模块化,我们对绘制几何图形变换编制了基类 MyClass 类。在工 程中单击【文件】|【新建】,在弹出的新建对话框中,选择 C/C++ Header File,在【文件】名称输入栏中输入“MyClass”;同样,在工程中单击【文 件】|【新建】,在弹出的新建对话框中,选择 C++ Source File,在【文件】 名称输入栏中输入“MyClass”。在工作区中系统自动创建的相应的空文件 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 32 中,分别添加以下此基类的头文件(.h 文件)和应用文件(.cpp 文件)。 程序代码见纸书 提示: 在以上 CMyClass 基类中,绘制了字符 M,本例的几何图形]变换应用案 例,即对此字符进行各种几何变换,读者可在此基类基础上,对一些函数如 ReadWorkpiece()、DrawViewV()、Calculate()中的部分代码稍加修改,即可 绘制各种二维图形,并进一步对所绘制图形进行各种几何变换。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 33 (5) 在几何图形变换 View.h、几何图形变换 View.cpp 添加完成各个菜 单消息处理函数,实现既定功能, 说明:下面仅列出几何图形变换 View.h、几何图形变换 View.cpp 的全部 代码,其它文件代码全部为系统维自动建立,无需改正,为节省篇幅此处省 略,详见光盘。下面代码中黑体部分为手工输入,其它代码为系统生成。 // 几何图形变换 View.cpp : implementation of the CMyView class 程序代码见纸书} CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 34 2.4 平面曲线图 无论在美术中还是在工程设计中,利用基本图形变换方式绘制的二维图 形和工程图都被广泛应用。日常生活中的美术图案(如纺织品图案、装饰图 案等)大多是将一个图案单元或几个图案单元经过图形变换、组合排列从而 形成一幅美丽的艺术图案。图形或称图案设计在现代生产和生活中也越来越 受到人们的重视,其应用范围也越来越广。尤其利用计算机进行图案设计前 景更广,计算机绘制图案速度快、线条清晰,也可绘制很复杂的图案,如函 数曲线图,随机图、各种简单图形经二维几何变换后的美丽图案等。下面我 们详细介绍用 Visual C++绘制几种图形或称为图案的程序设计实例 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 35 2.4.1 正叶线 正叶线是一种类似植物叶子形状的曲线,数学表达式: )sin( ,...)45,3,2,0()cos( )sin( thetary nathetarx thetanar = =>= ´= 程序经过下面通过修改数学表达式,绘制由二重、三重的正叶线组成的美丽 图形。 2.4.2 正叶线蝴蝶结 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 36 蝴蝶结故名词义即类似蝴蝶结的图案。是经过设置二维坐标 x,y 函数以 及利用旋转变换绘制的图案。画线点的 x 坐标、y 坐标移下列函数规律变 化,即: d=80; for(a=0;a<=2*pi;a+=pi/360) { e=d*(1+0.25*sin(4*a)); e=e*(1+sin(8*a)); x2=int(320+e*cos(a+pi/8)); x1=int(320+e*cos(a)); CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 37 y1=int(200+e*sin(a)); y2=int(200+e*sin(a+pi/8)); } 2.5 平面曲线程序设计案例 一、程序设计步骤 1. 创建工程名称为“平面曲线”的单文档应用程序框架(详细过程请 参见第二章有关内容)。 2. 菜单资源 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 38 设计如图 2-4 所示的菜单项,根据 2.3 表中的定义编辑菜单资源。 表 2.3 菜单资源表 图 2-4 3. 添加消息处理函数 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处 理函数,ClassName 栏中选择 CMyView,根据表 3.2 建立如下的消息映射函 菜单标题 菜单项标题 标示符 ID 正叶线 ID_DRAW_LEAF 函数曲线 蝴蝶结 ID_DRAW_ROSE 三次贝塞尔曲线 ID_DRAW_BEZIERNE 工程曲线 三次 B 样条曲线 ID_DRAW_BSPLINE CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 39 数,ClassWizard 会自动完成有关的函数声明。 表 3.2 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_DRAW_LEAF CONMMAN OnDrawLeaf() ID_DRAW_ROSE CONMMAN OnDrawRose() 4. 在 View.h、View.cpp 添加完成各个菜单消息处理函数,实现既定功 能。 说明:下面仅列出 View.h、View.cpp 中需要手工添加代码的部分 (黑体部分),其它文件代码全部为系统自动建立,无需改正,为节省篇幅 此处省略,详见光盘。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 40 // 平面曲线图 View.h : interface of the CMyView class ///////////////////////////////////////////////////////////////////////////// class CMyView : public CView { 2.5 课后练习 1. 请写出二维图形几何变换矩阵的一般表达式,并说明其中各个子矩 阵的变换功能。 2. 已知四边形各顶点坐标分别为(0,0)、(20,0)、(20,15)、(0, CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com 41 15)对此图形编程分别实现如下比例变换: (1) 使长度方向延长一倍,高度方向缩小一倍; (2) 整个图形放大两倍; 3. 已知三角形各顶点坐标分别为(10,10)、(10,30)、(30,15)对 此图形分别进行如下比例变换,写出变换矩阵,并画出变换后图形。 (1) 沿 x 正向平移 20,沿 y 正向平移 10,再绕原点旋转 90 度; (2) 绕原点旋转 90 度,再沿 x 正向平移 20,沿 y 正向平移 10; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网---www.cadedu.com 第三章 交互技术 交互式绘图是指设计者在操作计算机系统绘图时,人与计算机之间可进 行信息交换,从而完成复杂的绘图任务。利用一般高级语言绘制图形,为了 在屏幕上显示图形,首先需要编制相应的绘图程序,一个绘图程序画出一个 图形,需要修改时,必须先修改程序或根据要求再重新编写程序来实现。计 算机绘图软件要求通过人机交互式方式进行图形绘制、修改,交互技术计算 机绘图软件使用更方便、直观。目前几乎所有绘图应用软件都为人机交互式 方法,如 Autodesk 公司出品的 AutoCAD、PhotoShop、3DMAX 等等。交互式 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 2 绘图已成为编制计算机绘图软件必不可少的特点。Visual C++方便的创建界 面功能使编制交互式绘图程序变得相当简单。 交互式绘图系统中应具用数据结构的一些数据文件,这些文件中保存着 构造图形的几何信息和拓扑信息、属性信息、以及一些非几何数据信息等。 图形应用程序是系统中的核心部分,它从应用数据/模型中取得所需要的几 何数据及属性信息,按照要求对数据进行变换处理,生成图形,并在图形输 出设备上(屏幕、打印机)输出图形,图形的生成、修改、编辑等操作用户 可利用人机交互绘图软件、图形输入设备(如键盘、光笔、鼠标等)进行控 制输入,绘制需要的图形。 实现软件的交互技术首先应理解以下问题:如何设计一个好的用户接 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 3 口、为什么要定义逻辑输入设备、交互式绘图技术有哪些? 3.1 用户接口设计用户接口决定用户与计算机如何进行信息交换的技术。 用户接口包括用户通过什么途径与图形系统进行联系,通过什么手段来操作 系统的功能实现等。用户接口最重要的就是高效率和对用户的友好性。 用户接口一般需要处理用户模型、屏幕的有效利用、用户的反馈、设计 的一致性原则、回退和出错处理、联机帮助等。1. 用户模型用户模型 (User Mode)是用户接口设计的基础,它提供给用户有关他所处理的对象 以及作用于这些对象的处理过程的一个概念性模型。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 4 2. 显示屏幕的有效利用为使屏幕得到有效利用软件设计中应考虑如下几 个问题: (1) 信息显示的布局合理性。 (2) 充分而又正确地使用图符(应用图符(application icons)、控 制图符(control icons)) ( 3 ) 恰 当 地 使 用 各种表示方法进行选择性信息显示。3. 反馈反馈就 是动态地显示系统运行中所发生的一些变化,以便更有效地进行交互作用 4. 设计的一致性原则一致性原则是指在设计系统的各个环节时,应遵从统一 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 5 的、简单的规则,保证不出现例外和特殊的情况。还应考虑按照用户认为最 正常、最合乎逻辑的方式来设计,减少用户记忆量。 回退和出错处理 回退(undo)机制包括取消机制、确认机制等。对可能导致错误的一些 动作进行预测,设计好的诊断程序,提供出错消息等。约束机制:动作与 对象相一致 6. 联机帮助 为用户提供联机帮助(On-Line Help)措施,能在用户操作过程中的任何 时刻提供请求帮助。适应不同的用户,提供多种方法使软件能适应不同熟练 程度的用户。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 6 3.2 逻辑输入设备与输入处理 3.2.1 逻辑输入设备 为了使图形软件包独立于具体的硬件设施,图形输入命令常不涉及具体 的输入设备,而只涉及该命令所需的数据。 根据图形输入信息的不同性 质,PHIGS 和 GKS 将各种图形输入设备从逻辑上分为六种:⒈ 定位设备典 型方法是定位屏幕光标,把屏幕上的光标移到所需要的位置上,然后按下鼠 标,同志计算机取出该处的坐标值,再在此位置构件图形或进行其它操作。 定位设备有鼠标器、操纵杆、跟踪球、空间球、数字化仪的触笔或手动光标 等。 交互时绘图时,一般需要定位,定位就是提供当前绘图的所在位置的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 7 屏幕坐标。在绘制图形时,用户构造图形或对图形进行修改时都需要频繁地 定位。⒉ 笔划设备 笔划设备的输入等于多次调用定位设备,产生一系列 的坐标值,根据产生的坐标值可产生多边形和曲线等 ⒊ 定值设备 定值设备常用来输入各种参数和数据。⒋ 字符串设备 字 符 串设备即进行字符串输入 ⒌ 选择设备 选择设备用来选择菜单选项、属性选项和用于构图的对象形 状等。⒍ 拾取设备用拾取技术拾取一个图形对象。处理好设备的拾取技 术常利用以下方法:在图形对象生成时就对每一个对象确定其拾取优先级、 采用依次对拾取图形设立标志的办法、•找距离最近的对象优先拾取。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 8 3.2.2 输入模式输入模式即如何管理、控制多种输入设备进行工作。常用 的输入模式有请求(request)、采样(sample)、事件(event)及其组合形 式等几种。1. 请求方式(request mode) 输入设备在应用程序的控制下 工作,程序在输入请求发出后一直被置于等待状态直到数据输入。 2. 取样方式(sample mode)此时,应用程序和输入设备同时工作,当输 入设备工作时,存储输入数据,并不断地更新当前数据,当程序要求输入 时,程序采用当前数据值。3. 事件方式(event mode) 每次用户对输入 设备的一次操作以及形成的数据叫做一个事件(Event)。 思想:一般一个事件发生时,往往来不及进行处理,于是,就要把事件 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 9 按先后次序排成队列,以便先进先出,即先到的事件进入排队,先被取出进 行处理。 当某设备被置成事件方式,程序和设备同时工作。4. 输入方式 的组合使用一个应用程序同时可在几种输入模式方式下应用几个不同的输 入设备来进行工作。 3.3 交互式绘图技术 交互技术指使用输入设备进行输入的技术。下面介绍一些常用的基本交 互绘图技术,这些技术可作为设计应用系统用户接口的基本要素包括:定位 技术、橡皮条技术、拖拽技术、菜单技术、定值技术、拾取技术、网格与吸 附技术定位技术 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 10 定位操作是图形输入和图形操作中常用的输入操作之一。定位有直接定 位和间接定位两种方式。直接定位是指使用定位设备直接在屏幕上指定一个 点的位置;间接定位是指通过定位设备的运动控制屏幕上的映射光标来进行 定位。 ⒉ 约束 约束即在图形绘制过程中对图形的方向、对齐方式等进行规定和校准。 ⒊拖曳技术 拖曳技术是将形体在空间移动的过程动态地、连续地表示出来,直到用 户满意的结果为止。这种技术常用于部件的装配、模拟现实生活中的实际过 程。 4. 橡皮筋技术 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 11 橡皮筋技术即针对输入要求,动态地、连续地将输入过程表现出来,直 到产生用户满意的输入结果为止。 5.定值技术 定值技术在交互过程中应用很多,而且是必不可少的。用户经常需要输 入一个数值,指定一个数量,完成这种任务需要确定精度(单位),需要的 设备是键盘或电位计。定值技术有两种:键入数值、改变电位计阻值产生要 求的数量。6.菜单技术 菜单是一种很重要的交互技术。它可用于指定命 令、确定操作对象或选定属性等多中选一的场合。使用菜单可较好地改善应 用系统的用户接口的友善性。包括以下几个方面:菜单的层次结构、菜单的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 12 表示、菜单的显示控制、菜单的选择。7. 拾取技术 在图形系统交互作用 的许多操作中,常常要在一个分层的对象结构或虽不分层但很复杂的对象结 构中拾取一个基本对象(如最底层的对象或一个简单的部分)或一些基本对 象的集合(如非最底层的对象), 然后对其施加某种操作。拾取一个基本的 对象可以通过以下一些方法来实现:指定名称法、特征点法、外接矩形法、 分类法、直接法。 8. 网格与吸附 网格化是帮助绘制整齐、精确图形的 一种技术。网格化一般用在用户坐标系统中,按从用户坐标系统的窗口到屏 幕视口的变换映射到屏幕上去。网格一般是规则的,且覆盖整个显示区。应 用程序将定位器坐标舍入到最近的网格交叉点上去,从而使绘制的图形规 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 13 整、精确。有时要从已有的某线段上的点或它的顶点开始绘制另一条线段或 其他图形,直接使用定位设备来定位很难保证其重合性。吸附技术则可克服 上述困难。 3.4 交互技术程序设计案例 一、程序设计功能说明 演示用 Visual C++编写图形程序时基本交互绘图技术的实现:、定位技 术,文本输入、拖曳技术等。如图 3-1 所示为程序运行时的主界面,用鼠标 选择不同的菜单及下拉菜单实现:鼠标画线(橡皮条技术)、利用拖曳技术 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 14 绘制矩形、文本输入以及鼠标在客户区移动同时在状态兰动态显示鼠标经过 各点的坐标值等功能,如图 3-2 所示。 图 3-1 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 15 图 3-2 二、程序设计步骤 1. 创建工程名称为“交互技术”单文档应用程序框架(详细创建过 程请参见第一章“基本图形的生成”应用程序) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 16 2. 编辑菜单资源 根据 3.1 表中定义编辑菜单资源,设计如图 3-1 所示的菜单项。 表 3.1 菜单资源表 3. 添加消息处理函数 利用 ClassWizard(建立类向导)根据表 3.2 为应用程序添加与菜单项 相关的消息处理函数建立如下的消息映射函数。 菜单标题 菜单项标题 标示符 ID 直线 ID_DRAW_LINE 矩形 ID_DRAW_RECT 基本图形变 换 标注文本 ID_DRAW_TEXT 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 17 表 3.2 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_DRAW_LINE CONMMAN OnDRAWLINE ID_DRAW_RECT CONMMAN OnDRAWRECT ID_DRAW_TEXT CONMMAN OnDRAW_TEXT D_MIRROR_X CONMMAN OnIDMIRRORX ID_MIRROR_Y CONMMAN OnIDMIRRORY ID_MIRROR_O CONMMAN OnIDMIRRORO ID_SCALINGXY CONMMAN OnIDSCALINGXY ID_ROTATIONXY CONMMAN OnIDROTATIONXY 4. 在几何图形变换 View.h、几何图形变换 View.cpp 添加完成各个 菜单消息及鼠标响应等处理函数,实现既定功能, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 18 // 几何图形变换 View.cpp : implementation of the CMyView class CMyView::CMyView() { 程序代码见纸书. } 说明: 1. 以上仅列出几何图形变换 View.h、几何图形变换 View.cpp 的全部代 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 19 码,其它文件代码全部为系统维自动建立,无需改正,为节省篇幅此处省 略,详见光盘。代码中黑体部分为手工输入,其它代码为系统生成。 2. 进行文本标注时,在点击功能菜单项之前应先在客户区中选中一点作为 文本标注的起始位置。 3. 捕捉所有的鼠标输入介绍 在用鼠标交互绘制一个图形元素时,在已经开始绘制的情况下(如绘制一 条直线,在暗中了直线的起点并在屏幕上拖动时),不希望系统还进行其他 操作(如打开菜单执行其它命令)避免造成系统流程和变量初始化等方面的 的错误。VC++提供两个成员函数来实现以上的功能需要。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 20 SetCapture 函数运行后,时所有的后续鼠标输入被送至当前的 CWnd 对 象 , 这 样 就 把 所有的鼠标输入采集到,以防系统进行其它程序。 ReleaseCapture 与 SetCapture 函数相反,用于释放这种捕捉。这样在开始会 图时,运行 SetCapture 函 数 ,在图形元素交互运行完成后,再运行 ReleaseCapture 函数。 4.在屏幕上拖动图形 在用鼠标交互绘制图形元素时,为了直观的看到所绘制的图形,一般采 用拖动图形的方式。此时一般图形元素只剩最后一个控制点,鼠标拖动改变 此控制点形成图形元素的具体形状。产生拖动的效果,例如在交互绘制直线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com 21 时,在确定了起点后,鼠标移动,拖动一条“橡皮”线移动。 实现拖图形的功能首先要用 CDC 类的函数 SetRop2 设置绘制。当把绘制 模式设置成 R2_NOT 时,因为两次绘制统一图形元素屏幕不便,所以在用 鼠标交互绘制图形元素时,在只剩一个控制点时,当鼠标移动时,首先把上 一个移动点所决定的图形元素绘制一次(擦除上一个图形元素),再把当前 鼠标点决定的图形元素绘制一次,并记录下鼠标点作为下一个移动点时的上 一个点,这样当鼠标移动时就实现了拖图形的效果。在编制拖动图形元素的 程序时,要注意对第一次移动操作进行处理,因为第一次移动图形元素时, 没有所谓“上一个”图形元素要擦除。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 CAD 教育网制作www.cadedu.com 22 3.5 课后练习 1. 一个交互绘图系统的交互任务是什么? 2. 设计交互式绘图系统的主要原则? 3. 编程实现橡皮条绘制直线和圆。 4. 编程实现交互拾取一条直线。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 第四章 简单 CAD 绘图系统开发实例 计算机的飞速发展,使计算机已经不再局限于解决数值计算问题,而更 多更广泛地使用在非数值计算的各领域。计算机所处理的对象也由纯粹的 数值数据发展到诸如字符、图像、声音、信号等各种各样具有一定结构的 数据。计算机是一种信息处理装置,而计算机又只能处理数据信息,不能 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 识别图形。用计算机绘图,就要将图形转化为数据,通过计算机对图形数 据进行加工处理,绘制图形。 一个图形系统是有软件和硬件组成的,它对于计算机辅助设计十分重 要,它能帮助人们提高工作效率和质量,简化复杂的工作。Visual C++自问 世以来一直是 Windows 环境下最主要的应用程序开发系统,由于 Windows 是基于 GUI 的操作系统,而 Visual C++提供了丰富的图形接口(GDI)函 数,使得用 Visual C++开发的 Windows 系统下的图形应用程序很方便、简 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 单。 本章介绍用 Visual C++开发图形应用程序的一些知识,包括:计算机图 形学绘图基础、图形的数据结构,最后介绍一个简单 CAD 绘图系统编程实 例。由于篇幅所限,本章节在对简单 CAD 绘图系统编程实例的介绍中,在 相应位置,有针对性地放置相关部分代码,完整程序代码请参见随本书提 供的光盘。 4.1 计算机图形学绘图基础 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com Windows 应用程序提供一个一般应用程序所需要的全面面向对象软件 组建的集成集合。这里应用程序框架是一类库的超级集合,它定义了程序 的结构。一个类库是可在应用程序中使用的有关 C++类的集合。例如一个 图形类可以支持一般的图形操作。使用类库可通过构建已有类库对象,或 派生自己的类来实现。MFC(Microsoft Foundation Class)库是一整套简化 Windows 编程的可重用的类库,MFC 提供如 CString、CFile 等 Windows 编 程常用类,封装了通用 Windows API 和数据结构的类。这些数据包括窗口、 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 控件和设备环境。除此之外,MFC 还提供了应用程序框架,包括组成应用 程序继承结构的类,以及对各种 Windows 特性的全面支持。 当我们开发一个大型项目时,同时开发一种结构,但每个人程序的结构 往往是不相同的,MFC 库应用程序框架包含自己的应用程序结构,使用 MFC 库编写 Windows 程序,就可以保持值这种一致性,有 利 于 代码的维护 和增强。使用 MFC 类库,程序可在任何时候调用 Win32 函数,可以最大 程度地利用 Windows。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 4.1.1 Visual C++开发系统基本绘图知识 Windows 应用程序框架的核心是文档与视的相互关系,应用程序框架中 的文档和视图结构文档即应用程序处理的数据对象,如 NotePad 中的文本。 视即指文档的应用程序中的表现方式或用户用于改变文档的交互窗口对 象。MFC 中与绘图有关系的几个关键类如下: (1) 文档类(Document) 文档是用户处理数据的对象。文档即应用程序处理的数据对象,文档一 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 般从 MFC 中类 CDocument 中派生,如 果支持 OLE 功能,可从 ColeDocument 或 ColeServerDoc 类中派生,由 CDocument 派生的类主要用于存储数据。 CDocument 类用于相应数据文件的读取以及存储 Cview 类所需要观察和处 理的信息。 (2) 视类(View) 视相当于文档在应用程序中的观察窗口,它确定了用户对文档的观察方 式和用户编辑文档的方式。如果需要,用户可在多个视中对文档进行操作, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 即多文档结构(MDI)。对于图形来说视就好比我们进行绘图工作的画布, 对图形的操作都是在视上进行的。因此掌握好视类对我们很重要。 一般情况下,应用程序的视类从 CView 中派生,对于有特殊要求的视, 根 据 情况不同,还可从类 CScrollView 、 CEditView 、 CFormCView 、 CTreeView、CListView 或 CRichView 等派生。 另外,视类中有一个重要的成员函数——OnDraw()函数,应用程序中, 几乎所有“画”的动作都出现在 OnDraw()中或有它来引发。该函数必须被 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 重载。重载的 OnDraw()函数要完成两件事,即调用相应的文档的函数获取 文档数据和调用 GDI(图形设备接口)的函数在视中画出文档数据。 (3) 主窗口类(Main Frame Window) 主窗口是 Windows 应用程序中限定其所有窗口范围的最外边框。应用程 序中的所用其它窗口都直接或间接地为主窗口的子窗口,如标准菜单、工 具条、状态条等。对于 MDI 程序,视占文档窗口的客户区,而文档窗口又 是主窗口的子窗口,一个主窗口可以有多个文档窗口(即含有多个视);对 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 于 SDI 应用程序,视是在主窗口中显示的,视占据了主窗口的客户区,主 窗口也是文档窗口。 一个 Windows 应用程序一般具有主窗口类。SDI 应用程序的主窗口类应 从 CframeWnd 中派生,MDI 程序的主窗口类应从 CMDIFrameWnd 中派生 (文档窗口类应当从 CMDIFrameWnd 中派生,一种文档类型应当有一个 CMDIChildWnd 文档窗口派生类)。 ( 4 ) 文档模板类(Document Template) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 文档类模板用于协调文档对象、视对象、和主窗口对象的创建过程。它 是从类 CDocTemplate 或其派生类中派生的。一 个 文档模板可以管理同一文 档类型的所有文档。对于不同的类型的文档,必须使用不同的文档模板类。 对于 SDI 程序,只包含一个文档模板,它是从 CsingDocTeplate 中派生 的。对于 MDI 应用程序,所有的文档应从 CmultiDocTeplate 中派生的。 (5) 应用类(Application) 一个应用程序由切只有一个应用类的对象,它控制上述所有的对象,确 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 定程序的特点,并负责应用程序的初始化和清楚,以便创建和管理程序支 持的文档模板对象,一个应用程序对象就代表一个应用程序,当用户启动 应用程序,Windows 调用应用程序框架内置的 WinMain 函数,并且 WinMain 寻找一个由 CWinApp 派生的全局构造的应用程序对象,全局对象在应用程 序之前构造。 (6) 图形设备接口 PC 相容机种上可以连接许多种不同的视讯设备,所以 ,GDI 的主要目的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 之一是支援与装置无关的图形。Windows 程式应该能够毫无困难地在 Windows 支援的任意一种图形输出设备上执行,GDI 通过将您的程式和不同 输出设备的特性隔离开来的方法来达到这一目的。图形设备接口 GDI (Graphic Device Interface)管理 Windows 应用程序在窗口中的所有绘图操 作和与此有关的诸多方面、。如图形设备的信息,坐标系和映射模式、绘图 的当前状态(画笔、画刷、颜色、字体等)、 绘 图的具体操作(如画线、画 圆等)。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 一个 Windows 图形设备接口对象类型由一个 MFC 类库表示,这些类有 一个共同的抽象基类:CGdiObject。一个 Windows 图形设备接口对象由 CGdiObject 派生类的 C++对象来表示,这些对象有: CBitmap 位图对象 CBrush 画刷。用于表示区域填充的颜色和样式。 Cpen 画笔用于指定线和边框的性质,如颜色、线宽、线性 等 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com CRgn 区域是由多个多边形和椭圆组成的组合形状,可以填 充、裁剪等操作以及判断鼠标是否位于某一点。 CFont 字体是具有定大小和风格的一套字符集。 CPalette 调色板是一字符映射表,将逻辑颜色和设备的实际颜 色相互联系。 (7) 设备环境类 CDC 是 MFC 中最重要的类之一,更是绘图应用程序中最重要的类,CDC 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 类定义的是设备上下文对象的类。CDC 对象提供处理显示器或打印机等设 备上下文的成员函数以及处理与客户区对应的显示上下文的成员,通过 CDC 类的成员函数进行所有的绘图,它封装了 GDI 的大部分内容,如 坐标 系、绘图方法、各种 GDI 对象的管理等。 设备环境类 CDC 的内容十分丰富,包含了和绘图有关的方方面面。CDC 类提供的成员函数可以用于对设备环境的操作、绘图工具的使用、图形设 备接口(GDI)对象的选择等,但在使用 CDC 类对象视时应注意一个问题: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 为使用 CDC 对象,须先构造一个 CDC 对象,然后才能调用它的成员函数。 使用完成后,必须在适当的方将其删除,在 Windows 环境中可获得的设备 环境的数量是有限的。如 果 太 多的 CDC 对象没有被删除,计算机的资源将 很快被耗尽,VC++也会在调试窗口中报错。 为了特殊应用,MFC 提供了几个 CDC 类的派生类。CpaintDC 类封装了 对 BeginPaint 和 EndPaint 的调用,CclientDC 类管理与窗口客户区对应的显 示场景。CwindowsDC 类管理与包括主框架和控件在内的设备环境与源文 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 件。对 CDC 中类的掌握程度直接影响我们绘图程序的质量和效率。 框架大部分的代码是应用程序自动生成的,程序设计的大部分工作是在 视类的两个文件(.h 头文件和.cpp 应用文件)中进行的。 4.1.2 计算机图形学会图系统设计基本原则 设计一个图形系统是一个复杂的工作,设计工作一般分为需求分析、设 计、编程、测试和运算等几个阶段,每一阶段各有明确任务。 对于一个交互式通用图形系统的设计原则大致如下: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 1. 结构层次化、模块化; 2. 要通用性强,使用方便; 3. 处理速度快; 4. 程序易读、查、改以及移植和扩充。 4.1.3 图形程序设计步骤 编写绘图程序,其基本要求是可靠、正确和简单清晰。同时再满足结构 程序设计模块化要求的前提下,尽可能做到程序结构合理,占用内存单元 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 少,程序运行速度快。另外编出的程序应该满足可读性强、修改调试方便、 通用性好,移植性强等要求。编写一个绘图程序,一般需经过以下步骤: (1) 根据实际需要,确定绘图程序的功能和用途。 设计或编写绘图程序时,首先要明确所编写的绘制程序应具有的功能或 说明用途是什么将有利于绘图程序设计具体工作的进行。绘图程序的功能 和用途将决定具体编程中下面的一些问题,设置调用函数和参数个数、绘 图方式的选择、用户与程序交互信息方式、确定数据存储结构。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com (2) 明确所绘制图形的几何形成过程。 在绘制一个图形时,有时需要分析清楚它的几何关系,即弄明白这个图 形是怎样形成的,然后才能在此基础上得到绘图的算法,研究图形的几何 关系,对于绘制复杂图形是大有帮助的,进而自己也可构造图形。 (3) 根据图形绘制要求对所绘制图形进行系统的模块化分。 算法,即运算方法,它还包括对图形数据(如点的坐标等)的加减乘除 四则运算,以及对数据进行的廉洁、变换、循环等操作。绘制一个图形, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 一般都要写出绘制算法,最常用的是关于图形上数据的计算公式和各种变 量、参数应满足的关系式。计算机通过计算式和关系式等对图形数据进行 处理,最后才可绘制出图形。图形算法中体现的严格的数学表示,正确合 理的算法式绘图程序能够得到正确结果的前提。 (4) 针对各个模块的功能确定相应绘图算法。 程序总体上为模块化结构,即程序开始为数据说明,然后为各功能函数, 最后主程序提基本上是由调用函数语句组成,而这些函数语句实际就是一 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 些功能模块,因此整个程序是模块化结构。 (5) 编写绘图程序。 写程序时,语句要对齐。语句套语句,内套语句应该往后移 3 或 4 个字 符,复合语句应与相应的列对齐。同时对变量或参数,要加注释,对函数 功能,要做功能简述,做到程序的条理清晰,可读性好。编写的程序还要 便于调试。程序每次调试一句,用分号分开的各程序语句,虽然 C++允许 写在同一行,但不利于调试,若一个程序句一行,可对错误语句准确定位。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 将程序分解成合理的模块,即分割成几个甚至很多简单函数,每一个简单 函数实现一个单独功能,把各功能模块分别调试好,再组装进程序。同时 要更多使用参数,少使用全局变量, (6) 上机调试、运行和绘图。 程序编号后上机调试。调试程序一般要注意下面几点: 对写好的程序,首先要在纸上进行认真仔细的检查,不 要 匆匆忙忙上机, 程序通过认真检查后再上机调试、编译,初学者容易忽略这一点,在计算 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 机上占用大量时间。 编译时,可根据提示的信息,找出程序中错误的程序段的位置及错误类 型并加以改更。注意有时提示的错误信息位置有误,提示的出错类型也并 非绝对准确,也有可能因为错误较多而相互关联,所以要善于分析,真正 找到错误所在。当遇到提示的错误信息很多(一大片),往往使人感到问题很 严重,事实上也许只是因为所使用的变量未定义,编译时会对所有使用这 一变量的语句发出出错信息,这要添加相应变量的定义,所有错误可能都 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 会消除,另一方面也不要轻易认为程序运行输出一个正确结果就没有问题 了。例如,if 语句有多个分支,可能在流程经过一个分支时是正确的,而 经过另一个分支时可能会出错,因此要考虑全面。 4.1.4 在 Visual C++集成开发环境下程序的调试 (1) 运行要调试的程序; (2) 利用功能键 F9 在需要行设置断点(同样在已设置断点的行上按住 F9 可取消断点); 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com (3) 可用功能键 F11 一次执行一条语句,一步步跟踪;可以跟踪进某 行中调用的函数,如果不想跟踪进函数,则用功能键 F10。 打开 Watch 窗口(按 Alt+3 组合键)或 QuickWatch 窗口(按 Shift+F9 组合键),也可打开运算窗口或通过主菜单中的 Debug 菜单的选项来打开, 观察已经执行过的一段程序中的变量值。在 Watch 窗口中有几个 Watch 子 窗口,在每个子窗口的 Name 列任意一行键入变量名后回车后在相应的 Value 列中就得到程序中此变量的值。这样可观察程序运行中变量值的计算 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 与传递是否正确,常常能找到不容易发现的问题,还可利用窗口值来修改 变量的值测试程序对各种情况的 4.1.5 计算机程序结构设计基础 应用程序结构设计,一般包括以下步骤: 1.编译预处理指令 Visual C++绘图源程序开始部分是编译预处理指令,这是 C 语言的一个 独特点。编译预处理指令告诉编译系统对源程序进行编译之前应做些什么, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 编译预处理指令以#号开头,并与程序语句分开,占用一单独书写行,#号 前不能留有空格,指令结尾不用分号。编译预处理指令有三种,即包含文 件预处理指令、宏定义预处理指令和条件编译预处理指令。编译预处理指 令为程序员提供有效工具,方便编制程序,扩展编程环境,使开发的程序 易于阅读、修改和移植到不同的计算机系统上去,编译预处理指令。 (1) 包含文件的预处理指令 包含文件预处理指令的一般格式: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com #include <文件名> 指示编译系统按系统设定的目录搜索包含文件; 或 #include “文件名” 表示按指定的路径搜索,默认值为当前目录。 文件名为磁盘中文本文件的名字。包含文件预处理指令的功能是,在编 译源程序之前,取代该预处理指令,也就是从磁盘中读取包含文件,然后 把它写入源程序中预处理指令的位置上,使之成为源程序的一部分。从而 避免程序员的重复性劳动,提高工作效率。例如: (2) 宏定义预处理指令 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 宏定义预处理指令的一般格式: #define 替换名 字符串 应用程序为便于常量或变量容易记易或修 改,常用替代名称代替实际常量或变量。 (3) 条件编译预处理指令:说明语句、主函数、子函数、一般语句、图 形初始化语句、绘图语句、程序注释 4.1.6 绘图程序设计基本方法 任何一个图形都是由若干个简单的几何图形构成,而简单图形又是由 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 点、线、弧等基本的几何元素构成的。用计算机绘图就是要对根据最基本 图形信息(点、线、弧、坐标值等)在图形中的几何位置以及相互之间关 系进行数学描述,即构造出图形的数学关系式,设计出绘图程序,绘制出 图形。图形的数学关系要准确、合理、简洁,绘图程序要求通用、方便、 可移植。一般采用模块化设计方法。 4.1.6.1 图形层次结构和程序模块结构 (1) 图形层次结构 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 一般物体均可分解成许多不同形体元素的集合,即物体可分层来表示。 例如,一张床分成床头和床屉不同形体组成,这就是一个一层的结构,在 工程设计中,高层与低层之间的关系实际上是物体—子物体、部件-子部件、 图形—子图形的关系,这种关系也反映了它们之间的装配、调用关系,那 些最底层的形体一般用基本形体来表示。而表示形体的图形是由简单的图 素组成较复杂的图形,再由较复杂图形构成更复杂的图形,一层一层地构 造下去,得到整个图形。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 几何图形或其它形式数据构成的图形一般都有层次结构,利用图形层次 结构可以方便地实现模块化的绘图程序设计。 (2) 程序模块结构 程序模块指一个单独的函数,或是逻辑组合在一起的有关函数的集合, 或是有关语句的集合。模块化程序设计是指在编写程序中把一个程序分成 几个部分,分别编写成函数形式。由于函数的编写、测试可独立进行,从 而是的程序的编写和维护更方便,同时又便于编写出优良的程序。这些部 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 分也就是程序中的模块。 Visual C++绘图程序中主要模块可分为两种:主函数模块和函数模块。 一个简单的程序中没有函数,就只有模块,这一模块就是主函数模块。程 序中的函数就叫函数模块,它们都是独立的代码,可通过参数接收数据。 程序中的每条语句都属于一个特定的模块,C++语言能很好地支持模块化 程序。 模块化编程设计有助于计算机绘图程序生成各种各样的图形。图形中一 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 层子图形可用程序中一个模块生成,整个图形由程序全部模块生成。例如, 现有一画花瓣的模块,将方向、位置各不相同的花瓣组合起来画出一朵花, 它是通过调用花瓣模型同时加上方向,位置参数的变化来生成,这朵花又 称为另一模块,将方向、位置各不相同的花组合成为花花丛,进一步组成 花园。这里按层次构成图形(图像)即花园,其程序模块结构描述为:一 个花园图的程序可分为多次调用画花丛的模块;画花丛又可多次调用画花 朵的模块;画花朵的程序由可多次调用画花瓣的模块,一幅画花园的图形 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 就这样通过调用模块化出来了。 4.1.6.2 面向对象程序设计 面向对象程序设计与传统的结构程序设计方法不同,代表了新的程序设 计方式,使计算机问题更符合人类自身的思维方式和方法,提高了软件的 重用性和扩充性,并能有效控制软件的复杂性和软件维护的开销。 图形软件的设计中,将一些基本的图素,如点、线、面、弧等定义成基 本的图素类,图素的操作则可分别通过定义这些相应的数据成员和成员函 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 数 来提供。 MFC类库中也提供了许多基本图素类,面向对象程序设计更好地支持图形 的层次结构,即问题在不同层次上的抽象。在面向对象的程序设计中,是 通过类的继承机制来实现。例如将图素类的直线定义为一个基类,即可从 这一基类导出折线类、多边形类等第一级导出类,由第一级导出类又可产 生圆类、椭圆类、圆弧类等第二级导出类。再往下 还可导出 B 样条曲线类、 NURBS 曲线类等等。这样就可产生一个非常清楚的类的体系结构,有 利 于 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 用户的掌握和使用,同时也可很方便地从其中的某一个类中导出特殊需要 的类。所以在进行程序设计,搞清楚所涉及的问题以及体系结构的逻辑关 系和层次关系,便于将程序中多次出现的、具有共性的部分提出来成为类, 通过提取类的方法来解决复杂问题。 4.1.6.3 绘图子程序和主程序 1. 绘图子程序 编写绘图程序时,首先需要编制一定数量的绘图子程序,根据其功能不 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 同,绘图子程序由以下几类: (1) 基本子程序 在编写绘图程序时,把绘制点、直线、圆弧及各种线型、字符等绘图程 序成为子程序,称为基本子程序。必要时可利用 MFC 类库提供的基本子程 序。 (2) 功能子程序 把绘图过程中经常要用到的绘制三角形、四边形、圆、椭圆等预先编写 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 成子程序,在编制绘图程序时调用这些子程序进行绘制,这些子程序又是 通过调用基本子程序编写的,称为功能子程序,又称二级子程序。必要时 也可利用 MFC 类库提供的功能子程序。 (3) 应用子程序 利用上面两种子程序开发编写一些比较复杂的程序,能满足绘图需要、 通用性相对较小的程序,称为应用子程序,又称三级子程序,可为某一类 程序设计所引用。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 因此,在 编 写 大 型 绘 图 程序中,一 般需按照模块化程序设计方法的要求, 把复杂程序分成几个较易调试的子程序即模块来编写。对于更大更复杂的 程序,可画出绘图程序的模块结构图,明确程序由那些模块组成然后编写 每个模块的程序,一个模块就是一个子程序,程序设计中尽可能采用模块 子程序,以至最后的程序由调用各个模块子程序构成。 2. 绘图主程序 绘图主程序即程序执行体。在模块子程序(函数)编写好的基础上,编 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 写主程序(主函数)较容易,有时只需调用各个模块子程序即可构成主程 序,这是典型的模块结构程序。主程序中还可采用人机对话形式,即根据 运行时提示图形的几何参数或结构参数由用户一次输入,这是编写较为通 用的绘图程序常用的方法编写绘图程序要采用模块子程序和主程序。如果 一个几百条语句以上的程序,逻辑关系复杂,整个程序又没有用模块子程 序(即函数), 这 样的程序可能会运行很长时间也不出结果,千万不要以为 系统出现问题。若将同样程序划分为一定功能模块的几个子模块然后通过 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 主程序调用来运行,这样将很快得到结果,这是采用主程序和子程序带来 的效率。 4.1.6.4 绘图方法 在编程绘图时,根据所绘图形的复杂程度不同可采用边计算边画图的方 法或采用先计算后画图的方法,一般绘制平面图采用前者,绘制复杂曲面 图形采用后者。计算机绘制图形又可分为以下几种:解析法、样条法、变 形法、拼合法、和创造法。 1. 解析法 根据图形的解析表达式或参数表达式,编写绘图程序时,先计算出图形 中各点的坐标值等,然后用绘制函数绘出其图形。这种方法的关键是要将 图形用解析式表示,同时如何用解析式取图形上的点、区多少个点都很重 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 要。这将影响绘图质量,主要是图形的光滑程度。 解析式是常用方法,特别是绘制一般几何图形时。 2. 样条法 当一个物体或图形不是用解析式表示,或者不能用解析精确表示时,往 往是用物体或图形的一些实际数据值亦称型值点,构 造 曲 面或曲面拟合它, 或者用样条曲线来逼近它,同时通过不断调整、修正样条曲线或曲面,绘 制出这些图形。用样条法绘制图形,是工程中绘制自由曲线和曲面的实用 方法。 3. 变形法 变形法是对基本图形或称单元图形施行各种几何变换(比如平移、对 称 、 旋 转 等)从而形成新的或更复杂的图形,如对基本图形矩形进行多次比例、 平移变换即可绘制一座小屋。变形法是计算机绘制图形的重要方法之一, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 它可使绘制者不必逐笔、逐线、逐个形体进行绘制,而只需找出图形之间 的内在关系,对基本图形施行各种几何变换,重新组合排列便可获得所需 图形。 4. 拼合法 即将图形分解成若干个基本图形元素(简称图素), 把 相 同 部分的图素 编写称通用的子程序,绘制图形是可根据实际需要有所不同,但一般要考 虑独立性、常用性和可组合性。 5. 创造法 一般绘制图形,是按照一个物体(或景物)绘制出它的图形或是根据原 图形绘制出图形。创造法绘图与此不同,实现没有图形或物体,而是设计 出绘图算法创造性地绘制图形。例如分型图,预先不能想象出算法所绘制 出的图形样子,只有程序运行完后才能知道图形 的全貌。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 创造法绘制图形为图形领域开辟了另一个美妙的新世界。 一般说图形处理程序要比一般非图形程序复杂,但只要在开始时在头脑 中就建立起完好的构思结构及清晰的有关概念,便可克服绘图程序设计中 可能出现的混乱现象。 (1) 坚持到底 4.2 图形的数据结构 图形是由点、线、面、体各种几何元素组成的,如何用数据描述图形, 图形数据又如何存入计算机,使计算机处理时更准确、方便、完整、迅速 地描述图形,这就需要研究图形数据结构。有以上讨论已知一般图形都有 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 层次结构,任何复杂的图形均可用简单图素来组织描述。而 C++语言具有 指针、结构等丰富的数据类型,同时它的面向对象的程序设计方法使图素 模块(或绘图模块)之间的关系变得更清晰便于对图形进行修改、删除、 插入等操作。 用计算机绘图,就要将图形转化为数据,通过计算机对图形数据进行加 工处理,绘制图形。这样用计算机绘图首先要考虑如何在计算机中建立恰 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 当的模型表示不同图形对象?如何组织图形对象的描述数据以使存储这些 数据所要的空间最省,检索、处理这些数据的速度更快。 4.2.1 图形信息的分类 在组织绘制图形过程中会遇到大量信息,这些信息通常被分为:图形信 息和非图形信息。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 图形信息是图形对象及构成它的点、线、面的位置、相互间关系和几何 尺寸等;非图形信息是表示图形对象的线型、颜色、亮度以及供模拟、分 析用的质量、比重、体积等数据。 对大量信息的管理,常用概念还有:基本图形元素与段 基本图形元素:图素或图元、体素。用数据来描述,其中图素指可以用 一定的几何参数和属性参数描述的最基本的图形输出元素。体素是三维空 间中可以用有限个尺寸参数定位和定形的体,常有三种定义形式: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com (1)从实际形体中选择出来,可用一些确定的尺寸参数控制其最终位置和形 状的一组单元实体 (2)由参数定义的一条(或一组)轮廓线沿一条(或一组)空间参数曲线作扫 描运动而产生的形体。 (3)用代数半空间定义的形体。段(也称图段):图形学软件在输出基元和 画面之间设置一个中间数据结构,称为图段。图段用规则来描述。图段是 由一组输出基元和一组性质构成的集合,图 段 可 以 嵌 套 ,图 段 的 常见性质 : 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 可见性、优先度、突出性等。信息中的各个数据元素之间有着一定的结构 关系,数据结构就是研究数据的特征以及数据之间存在的关系。 4.2.2 图形数据结构 1.常用图形数据结构有:线性表、数据和树等逻辑结构以及顺序存储 和链表存储等存储结构。 线性表是一种最简单、最基本的线性数据结构,线性表具有相同类型的 n 个(n≥0)数据元素的有限序列,即在线性表中,数据元素之间的相对 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 位置是线性的,除最后一个数据外,表中其余元素都有且只用一个后继; 除第一个外,都有且只有一个前趋。 线性表存储方式有:顺序存储和链表存储。顺序存储是使用一组连续的 存储单元一次存储线性表中的各元素。链表是也是一种常见的。链表一般 有一个头指针,存放一个地址,该地址指向一个元素,称为节点。一个链 表节点包括:数据域和链域,分别用来存放数据和下一个节点的地址指针。 链表的最后一个节点不再指向其它元素,称为“表尾”。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 数组是线性表的推广,如 线 性 表 中 的 元 素 是一个单个数据时的数据结构 为数组,称为一维数组。当线性表中包含有多个相同描述的数据记录的线 性表为多维数组,线性表的长度是可变的,但大小固定。此外还有字符数 组等,详细的内容请参考数据结构相关书籍。 2.数据结构研究主要内容: (1) 研究数据元素之间的关系,即逻辑结构。 (2) 研究数据在计算机内部的存储方式。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com (3) 研究如何在数据的各种结构上进行处理,即算法。 3.设计图形程序时,同一图形可以设计不同的数据结构,但不论采取 什么数据结构,图形数据结构应满足以下要求: (1) 能够记录图形的几何和拓扑信息; (2) 该数据结构能完全、唯一地描述某一图形; (3) 适应对图形进行运算和处理,边与管理、查找、检索和修改。 (4) 节省内存。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 4.2.3 计算机对数据的管理—数据文件 文件为程序设计中的重要内容,计算机中的数据是以文件形式存在的, 文件一般是指存储在外部介质(如磁盘)上数据的集合。一批数据以文件 的形式存放在外部介质上,操作系统以文件为单位对数据进行管理,若想 找到存储在外部磁盘介质上的数据,必须先按文件名指定文件,然后再从 文件中读取数据。要想向外部磁盘介质上存储数据,也必须先建立一个文 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 件,才能向外部介质输出数据。 在程序运行时,常常需要将一些数据输出到磁盘上存放起来,需要时再 从磁盘输入到计算机内存,即对数据文件进行操作。 Visual C++中把文件看作是一个字符的序列,由一个一个字符的数据按 顺序组织起来。根据数据形式,文件可分为 ASCII 代码和二进制文件,ASCII 文件又称为文本(text)文件,其中每一个字节放一个 ASCII 代码,代表一 个字符。二进制文件是把内存中的数据阿呢日至数据的各是存储的文件。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 用 ASCII 输出的数据与字符一一对应,一个字节代表一个字符,便于对字 符进行处理,但占用内存较多,速度慢。用二进制形式输出数值,可节省 外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符 形式。 Visual C++对文件的存取是一字符为单位,输入或输出的数据流的开始 和结束仅受程序控制而不受物理符号(如回车换行符)控制。在处理文件 过程中,系统自动在内存区为一个正使用的文件开辟一个缓冲区,从内存 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 向磁盘输出数据必须先送到内存中的缓冲区,装 满 缓冲区后才可送到磁盘, 从磁盘向内存读入数据为一次性将一批数据输入到内存缓冲区,在从缓冲 区逐个将数据送到程序数据区。 4.2.4 图形数据的存储状态 在编制一个图形系统时,其中最基本也是最重要的是如何组织数据结构 和存储方式。数据的存储方式有两类:静态和动态。 静态:即数据不被系统处理时的状态,此时全部数据资料都以外部文件 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 的形式存储。任何一个成熟的系统都有其自身的文件结构。不同应用程序 中的静态文件结构有所不同,一般来说,静态的文件结构有以下两部分: (1) 头文件:包含文件中数据的数量、存放格式等所有主控信息; (2) 数据部分:数据主体。 一般来说,静态时的数据存储组织相对比较简单,按照确定的组织顺序 把各种数据信息放到一个二进制文件中即可。 动态:即数据资料被系统处理时的状态。系统可对数据资料进行增加、 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 删除、修改、查询等操作。一般静态的文件结构不能满足动态的操作需要。 此时系统要求对数据可进行任意使用和重新组织,同时在速度上,要求快 速的对数据进行操作。 4.2.5 动态文件数据结构的组织原则 动态文件数据结构的组织原则为足够和可扩容的容量、良好的适应性、 较快的速度等,根据系统要求,这些因素共同协调,形成一个有机整体, 实现既定目标,而不能厚此薄彼。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 下面我们将利用 AppWizard 生成的 Draw 画图应用程序的程序编写过 程,讲述在图形系统的设计中,如何组织一般图形元素的数据结构和存储 方式。 4.2.6 简单 CAD 绘图系统编程实例中的数据结构 利用 Visual C++中面向对象的程序设计和 C++的组织方法,组织建立一 个基本图形系统的图形元素类。 4.2.6.1 图形元素基类的组织 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 复杂的图形系统,都是由一些最基本的图形元素组成的。对各种图形元 素进行分析,把各类图形元素具有一些相同的属性和操作功能组织存放在 一个图形元素基类中,程序中其它一些图形元素再由此基类派生。简单CAD 绘图系统编程实例中,在头文件 Draw.Doc.h 中,定义一个图形元素基类 CDraw。代码如下: class CDraw:public CObject //基本图形类,用 来 存储图形的颜色、线型、 层等信息 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com { protected: CDraw(){} //构造函数 short m_ColorPen; //笔色 short m_ColorBrush; //填充刷颜色 short m_LineWide; //线宽(像素) short m_LineType; //线型(像素) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com short m_Layer; //所处层 int m_id_only; //图形元素唯一的识别号 BOOL b_Delete; //是否处于删除状态 public: CDraw(short ColorPen,short ColorBrush,short LineWide, short LineType,short Layer,int id_only,BOOL Delete) //构造函数 { 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com m_ColorPen=ColorPen; m_ColorBrush=ColorBrush; m_LineWide=LineWide; m_LineType=LineType; m_Layer=Layer; b_Delete=Delete; m_id_only=id_only; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com } } ; 说明:在此图形基类中,有两个构造函数,第一个不带参数,第二个构 造函数由七个参数,用来初始化类中的成员变量。 1.直线类 Cline 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 有了图形元素的基类 CDraw,在此基类的基础上派生一直线类 Cline, 直线类的基本参数(线型、线宽、颜色、删出标志等)由基类 CDraw 类中 继承,除此之外直线类中的特殊属性(如直线的起点和终点坐标等)则在 直线类中定义。在头文件 Draw.Doc.h 中定义直线类 CLine: class CLine:public CDraw //直线类 { 代码见纸书 } 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com }; 自此直线类中也重载了两个构造函数,第一没有参数,用来 定义一 个不 带参数的 CLine 直线类对象,另一个带有十一个参数的构造函数中利用前 面 CDraw 基类中的七个参数的调用对基类中的成员变量进行初始化,并对 自己 CLine 类中的四个参数(直线的起点和中的坐标)进行初始化。 2.连续直线或封闭多边形类组织 连续直线除了具有基类 CDraw 图形元素所有属性外,从图形的几何特 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 征上连续直线由许多顶点组成,顶点的数目是不确定的,对一条连续直线 来说可能只有两个,也可能有几千个顶点,在头文件 Draw.Doc.h 中定义连 续直线类 CPline 派生数据类结构来存储连续直线的一个顶点坐标: typedef struct { float x; float y; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com float z; }PointStruct; //存储每个顶点坐标的结构 根据连续直线的顶点数目,对于连续直线的顶点坐标,采用动态存储空 间的方法,即在 CPline 对象中分配连续直线的存储空间。在头文件 Draw.Doc.h 中定义连续直线类或多边形区域类 CPline 如下: class CPline:public CDraw //连续直线或多边形区域类 { 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com protected: int m_Numble; //连续直线或多边形区域的顶点数 BOOL b_Fill; //是否为连续直线 public: PointStruct* m_PointList; //存储顶点的数组指针 CPline() //不带任何参数的构造函数 { m_Numble=0;} 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com CPline(short ColorPen,short ColorBrush, short LineWide,short LineType,short Layer,int id_only, BOOL Delete,int Numble,PointStruct* PointList,BOOL Fill) : CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete) { m_Numble=Numble; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com b_Fill=Fill; m_PointList=new PointStruct[Numble+1]; //分配空间 if(Numble>0) { for(int i=0;i0) delete m_PointList; } }; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 从 CPline 类的定义中可看出,连续直线或多边形区域的顶点坐标存储在 一个结构数组 m_PointList 中,连续直线类中也重载了两个构造函数,第一 没有参数,用来定义一个不带参数的 CPline 连续直线类对象,另一个带有 多个参数的构造函数中利用前面 CDraw 基类中的七个参数的调用对基类中 的成员变量进行初始化,在第二个结构函数中,对顶点数大于 0 的连续直 线或多边形动态分配了存储顶点坐标的结构数组。b_Fill 成员变量用来表示 图形元素为区分连续直线还是多边形,b_Fill 为真时,表示图形元素为多边 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 形区域,相反为假时,这个图形为连续直线。 3. 圆类 圆类的定义方法除了具有基类 CDraw 图形元素所有属性外,从图形的 几何特征上看,还可以用圆心和半径作为特征参数表示圆的几何特征,在 头文件 Draw.Doc.h 中定义圆类 CCircle 派生数据类结构如下: class CCircle:public CDraw //圆及圆形区域类 { 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 代码见纸书 } }; 在圆类中定义了三个成员变量 m_CircleX、m_CircleY、m_CircleR 来记 录圆心和半径,同样,利用 b_Fill 成员变量用来表示图形元素为区分圆还 是圆形区域,b_Fill 为真时,表示图形元素为圆形区域,相反为假时,表示 图形元素为圆。 此类中也定义了两个构造函数,第一没有参数,另一个带有多个参数的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 构造函数中利用前面 CDraw 基类中的七个参数的调用对基类中的成员变量 进行初始化。上面定义的圆类中用圆心和半径的方法表示圆的几何特征, 实际中的图形设计中常采用边界矩形方法表示一个椭圆,而圆只是被看作 椭圆的一个特例。 4.圆弧类组织 圆是圆弧的弧度为 360 度时的特例。圆弧可从圆类派生,在头文件 Draw.Doc.h 中定义圆弧类 CArc 派生数据类结构如下: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com class CArc:public CCircle //圆弧类 { protected: float m_Angle1,m_Angle2; //圆弧的起点和终点角度 代码见纸书 } }; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 说明:在圆弧类中定义了两个成员变量 m_Angle1、m_Angle1 来分别表 示一个圆弧的起始和结束弧度。同样,类中也定义了两个构造函数,第一 没有参数,另一个带有多个参数的构造函数中利用前面 CCircle 基类中的构 造函数的调用对基类圆类和基本图形元素基类中的成员变量进行初始化。 5.标注文本类 文本标注在图形系统中也为一常用工具,标注文本类除了具有基类 CDraw 图形元素所有属性外,还具有位置、字体及标注内容等信息,在头 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 文件 Draw.Doc.h 中定义标注文本类 CText 派生数据类结构如下: class CText:public CDraw //标注文本类 { 代码见纸书 } }; 说明:CText 类中也定义了两个构造函数,第二个带有多个参数的构造 函数中利用前面 CDraw 基类中的构造函数的调用对基本图形元素 CDraw 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 类中的成员变量进行初始化。 4.2.6.2 组织图形类系统文档 下面讲述利用 MFC 应用程序的文档类管理体系组织文档,实现基本图 形系统的文档管理功能。 1. 组织面向对象的文档存储管理机制 面向对象的系统中,数据的管理,即通过文档组织机制,可利用图形元 素类创建很多图形元素对象,其中每一图形元素对象作为一个整体来组织 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 存储空间的分配、保存和读取等功能。通过建立一种存储机制来管理指向 所有元素对象的指针,来管理所有图形元素对象。这种文档管理机制具有 组织简单、结构化和移植性好等特点,缺点为将占用很大空间。 2. 利用 MFC 模板管理图形元素对象指针的对象 管理一个图形系统文档的思路为:每一个图形元素是图形元素类创建的 一个对象,在创建这个对象时得到指向这个对象的指针,通过建立一个对 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 象指针数组来管理这些指针,达到管理所有图形元素对象的目的。 在 MFC 类中利用类模板 CTypePtrArray 来定义一个管理类指针的对 象,, 例 如,定义一个管理 CLine 类指针的对象: 其中对象 m_LineArray 由第一个参数指向的类(CObArray)创建并管理第 二个参数指定的类指针,以上代码含义为:对象 m_LineArray 是由 CObArray 类创建的用来存放 CLine 类指针。 针对我们所创建的图形程序在文档类 CDrawDoc 中创建的管理各类图 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 形元素对象指针的 CObArray 对象为: private: CTypedPtrArraym_LineArray; //管理直线对象指针的 对象 CTypedPtrArraym_PLineArray; //管理连续直线对 象指针的对象 CTypedPtrArraym_CircleArray;//管理圆对象指针的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 对象 CTypedPtrArraym_ArcArray; //管理圆弧对象指 针的对象 CTypedPtrArraym_TextArray; //管理标注文字对象指 针的对象 实现文档的管理功能 4.2.6.3 增加图形元素 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 在上述应用程序中增加一个图形元素(如一条直线), 需 要进行以下步 骤: (1) 创建一个图形对象,并用图像元素的实际数据初始化这个图形元 素对象, (2) 把指向新创建的图形元素对象的指针,增加到文档类管理图形元 素对象指针的对象中 (3) 为实现上述功能,在 文档类 CDrawDoc 中定义几个函数,分别来 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 完成增加各类图形圆的操作功能: (4) 最后函数返回指向新增图形元素对象的指针。 CLine* AddLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float X1,float Y1, float X2,float Y2); //增加一条直线 CPline* AddPLine(short ColorPen,short ColorBrush, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com short LineWide,short LineType,short Layer,int id_only,int Numble, PointStruct* PointList,BOOL b_Fill); CCircle* AddCircle(short ColorPen,short ColorBrush, short LineWide,short LineType,short Layer,int id_only, float CircleX,float CircleY,float CircleR,BOOL Fill); CArc* AddArc(short ColorPen,short ColorBrush,short 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com LineWide,short LineType,short Layer,int id_only,float CircleX, float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2); CText* AddText(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float StartX, float StartY,float Angle1,float Angle2,float TextHeight,float TextWide, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com float OffWide,unsigned char TextFont,int TextLong,CString); 在实现文件 DrawDoc.cpp 中加入函数的实现代码: //添加一个直线对象 代码见纸书} 4.2.6.4 实现各类图形的绘制 利用虚函数来实现各种图形元素的绘制功能,在图形元素的基类 CDraw 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 中,抽象定义一个进行绘制操作的虚函数。因为在应用程序中,不用 CDraw 类直接定义对象,所以可以将虚函数定义成纯虚函数: virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor)=0; 各参数的含义: pDC:指向当前绘图对象的指针; m_DrawMode:绘制模式。1—R2_COPYPEN,2—R2_NOT。根据需要可 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 加入其它的模式。 m_DrawMode1:直线绘制模式。1—正常显示,2—特殊显示(如鼠标 选中时的现实)。 根 据 需 要 可 加 入 其 它 的 模 式 。 BackColor:当参数 m_DrawMode1 取 2 时,此参数指定颜色号; 在各种图形元素类中重载虚函数 Draw(对于用来创建对象的类,必须 有基类纯函数的重载) Public: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) 以下将根据图形元素的绘制方法,在各个图形元素类中加入 Draw 函数 的实现代码: //完成直线的绘制功能 void CLine::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com BackColor) { 代码见纸书 } 说明: 1.对于连续直线和封闭区域的绘制,主要用到绘图 CDC 类中的 Polygon 成员函数: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com Polygon 函数绘制一个多边形,必要时系统会自动把第一个和最后一个 顶点连成封闭多边形,用 SetPolyFillMode 设置的填充模式填充。 2.在绘制函数中,根据 CPline 类中的 b_Fill 成员变量的不同,选择不同 的操作。 b_Fill 为 TRUE 当 前 图形元素为一多边形区域,若正常显示 (m_DrawMode==0 || int m_DrawMode1==2)调用 Polygon 函数绘制一个多 边形区域,若为特殊显示(m_DrawMode1= =1),用 连 续 直 线 的 顶 点坐标初 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 始化一个区域 rgn,用 CDC 类的成员函数 InvertRgn 反色显示这个区域。 b_Fill 为 FALSE,调用 LineTo 函数分段绘制连续的各个直线段。 //圆和填充圆的绘制 void CCircle::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) { if(b_Delete) //如果已经处于删除状态 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 代码见纸书 pDC->SelectObject(cjcbakf);//恢复字模 } 4.2.6.5 保存图形数据到文档 用鼠标在屏幕上交互绘制的图形元素,要创建一个图形元素对象并将指 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 向这个图形元素对象的指针保存起来。即在用鼠标在视图中交互绘制图形 元素时,在屏幕上完成图形元素绘制的同时,还需把这一图形元素保存到 文档中,否则,重画视图时交互绘制的图形元素就消失了。 用鼠标交互绘制一个图形元素后,要在屏幕上马上显示着以图形元素的 实际形态,必须将图形元素以实际的形态重画,因为 VC++的 R2_NOT 绘 图模式下,线条是彩色的,拓东的图形都不是图形元素的实际颜色,必须 对图形元素以实际形态进行重画。重画这个新绘制的图形元素,可通过发 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 送一个窗口消息使屏幕全部或部分区域重新来实现,但这以方法效果不好, 因为要达到使新绘制的图形元素重画的目的,重画的最小区域也包括这一 个图形元素的边界矩形(或许为一任意多边形区域),在有大量图形元素的 情况下,重画的速度是很慢的,所以一般不采用这种方式。 4.3 简单 CAD 绘图系统功能简介 4.3.1 简单 CAD 绘图系统运行界面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 运行简单 CAD 绘图系统得到如图 1-1 的运行主界面。 4.3.2 简单 CAD 绘图系统功能 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 1.直线绘制 选择绘制直线操作后,首先用鼠标左键点中直线的起点,此时鼠标移动 时就会拖动一条橡皮筋线,再按下鼠标左键就会选中直线的终点而完成直 线的交互绘制;按中鼠标右键就会擦除橡皮线放弃直线的绘制。 Visual C++ 中采用 R2_NOT 绘制模式(SetROP2(R2_NOT);)作用首先将原 来的橡皮线擦除,然后绘制直线起点到鼠标点的连线,并将当前鼠标点记 为上一个移动点 mPointEnd。当鼠标移动时,这一过程一直进行下去,从 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 而实现拖动橡皮线的功能。 2.连续直线绘制 选择绘制连续直线操作后,首先用鼠标左键点中连续直线的起点,此时 鼠标移动时就会拖动一条橡皮筋,以后继续按下鼠标左键就会增加连续直 线的顶点,按下鼠标右键就会完成连续直线的绘制(当顶点数小于 2 时, 不能绘制成功)。 利 用结构数组 PointXyz 来存储已经按下的连续直线顶点的实际坐标。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 3.多边形区域绘制 多边形区域的绘制方法与连续直线相同,不 同 的是当顶点数目小于 3 时, 不能绘制。 4.圆和圆形区域绘制 圆的绘制用的是圆心半径法。即开始绘制圆的操作后,第一次按下鼠标 左键选中圆的圆心,此时鼠标移动时会拖动一个圆,再按下鼠标左键会选 中圆上的一点而形成一个圆,按下鼠标右键时会擦除橡皮圆放弃圆的绘制。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 5.圆弧绘制 圆弧绘制用的是三点法。即用起点、经过点、终点三点形成一个圆弧。 首先按下鼠标左键选中圆弧的起点,第二次按下鼠标左键选中圆弧的经过 点,此时鼠标移动时就会拖动一个圆弧,第三次按下鼠标左键选中圆弧的 终点而完成一个圆弧的交互绘制。在绘制过程中,按下鼠标右键会放弃圆 弧的绘制操作。 6.文本标注 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 当选择进行文本标注操作后,首先用鼠标左键在屏幕上点中要标注文本 的左下角起点,点中后会出现如图 2-1 所示的对话框,将要标注的文本输 入到对话框中的编辑框中,按“确定”退出后,就完成了文本的标注。按 “放弃”就会放弃本次标注。 进行标注时,字体的参数靠按下“字体参数”按钮得到。当按下“参数” 按钮时,会得到如图 2-2 所示的对话框。在对话框中填入字体的信息,“字 体高度”和“字体宽度”指的是标注字体的高度和宽度,“字体间距”是指 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 字体间的距离,它们都是以图形中的实际单位为单位。“标注角度”指的是 标注行与 X 轴正方向的夹角,以角度表示,逆时针方向为正。“字体旋转角 度”指的是标注字体的旋转角度,以角度表示,正常时为 0,以逆时针方 向为正方向。用户填入相应的参数值,按“确定”将字体参数设置为现在 的参数退出,按“放弃”按钮放弃所做的修改退出。 IsOpen 函数用来检查对话框窗口是否建立,IsVisual 函数用来检查当 前对话框窗口在屏幕上是否可见,Init 函数用来初始化对话框类的成员变 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 量 m_Text。 消息处理函数 DrawText 由消息 ID_TEXT_MESSAGE 激发运行,用来完成 在视图中绘制正在标注的文本,当在文本标柱对话框的编辑框中修改标柱 文本内容时,这一消息处理函数被调用,将标柱文本的内容会知道屏幕上。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 图 2-1 标注信息窗口 图 2-2 标注字体参数设置窗口 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 7.图形放大 从“图形操作”菜单中选择执行“图形放大”菜单项,或在工具条中点 中“放”按钮,就进入图形放大操作状态,此时需要用鼠标在屏幕上画出 一个窗口,窗口中的内容就会放大到整个屏幕上。第一次按下鼠标左键, 选择放大窗口的一个顶点,鼠标移动时就会拖动一个矩形移动;第二次按 下鼠标左键点中窗口的另一个顶点,系统就会进行图形放大操作,把窗口 内的图形放大到整个屏幕中。在放大操作过程中,按下鼠标右键,会放弃 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 放大操作。 对于图形元素,本系统提供了点选、窗口选择、圆选择、多边形区域选 择等多种选择方式。 8.选中图形元素的特殊显示; 当用鼠标在屏幕上点选图形元素时,通过计算可以判断是否选中了图形 元素,同时告诉用户已选中图形元素,这需要把选中的图形用特殊的方式 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 显示,就用不同的形式重新绘制这一图形元素,在我们的系统中,用虚线 显示选中的图形元素。 9.保留选中的图形元素 在图形元素操作过程中,要进行图形放大、重画等操作,需要保留选中 的图形元素,即保留图形元素的数据和视图屏幕。GraphSelectStruct 为 保留图形元素建立的数据结构。 DrawGraph 函数为屏幕视图重画时,视图重画选中的图形元素。图形元素 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 的选中操作方法有多种,可以点选,也可以用区域选中。点选图形元素的 是当鼠标在视图屏幕上按下鼠标就可得到按下点的屏幕像素坐标,并通过 与其它图形元素比较判断这点所在的图形元素,即为选中的图形元素。区 域选中使通过判断各种图形元素是否与一个区域相交或包含在一个区域内 来实现。区域选中最常用的时窗口选中(矩形区域选中)。 本绘制图形系统 采用点选的方式选中图形元素 运行菜单“图形选中”下的“点中图形元素”菜单项,或直接点中工具 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 条的“选”按钮,系统就进入到了点选图形元素状态,此时,用鼠标左键 点中图形元素时,就能够选中图形元素。选中的图形元素会用虚线或反色 显示。 判断一个点是否在直线上关键是判断一个点与此直线之间的距离是否 在有效距离范围之内。 Cline 类的 IsPoint 函数的主要操作步骤: 首先判断按中点(x,y)是 否 在 直 线 的 边 界矩形内,如 果 在 函 数 返 回 TURE; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 如果按中点在直线的边界矩形内,调用 PointLine 函数计算按中点到直 线的距离 xx,如果距离 xx 小于有效距离,即选中了直线,函数返回 TURE, 否则返回 FALSE。 10.放弃选中 运行菜单“鼠标选中”菜单下的“放弃选中”菜单项,或直接点中工具 条上的“清”按钮,系统会放弃对图形元素所做的选中(选中的图形元素 恢复正常演示),使选中的图形元素数为 0。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 放弃选中与选中图形圆素相似,方法包括:一是修改数据,使选中的图 形元素为 0。二要在视图中把选中的图形元素恢复到正常显示状态。 11.从屏幕上删除图形元素 首先用鼠标选中要删除的图形元素,然后选择运行“编辑”菜 单下的“删 除图形”菜单项,或直接点中工具条上的“删”按钮,系统会把选中的图 形元素从图形中删除。 当把选中的图形元素进行删除时,要求在屏幕上实时地把药删除的图形 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 元素去掉。最简单的办法就是把图形再进行重新绘制,此时作了删除标记 的图形元素不再绘制,即从屏幕上消失。利用。UpdateAllView 函数进行 全屏幕重画;局部重画是只重新绘制要删除的图形元素的边界矩形内的区 域,从而达到从视图屏幕上删除图形元素的目的。利用 InvalidaeRect(rr,TURE)函数。 12.图形移动 首先用鼠标选中要移动位置的图形元素,然后选择运行“编辑”菜单下 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网 制作 www.cadedu.com 的“图形移动”菜单项,或直接点中工具条上的“移”按钮,系统就进入 到移动图形元素操作状态,第一次按下鼠标左键选择一个基点,此时移动 鼠标时,会拖动选中的图形元素移动,第二次按下鼠标左键选中目标点, 选中的图形元素就会按着这两个点的相对位置进行移动。 以上简单介绍计算机图形学绘图基础、图形的数据结构,和简单 CAD 绘图系统的功能和设计过程,详细介绍请参见有关书籍和随本书提供的光 盘中“简单 CAD 绘图系统”应用程序。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 第五章 三维图形变换 三维图形的几何变换是指对三维图形的几何信息经过平移、比例、 旋转等变换后产生新的图形。三维基本几何变换都是相对于坐标原点和 坐标轴进行的几何变换。正如在二维几何变换中提到的那样,用齐次坐 标表示点的变换将非常方便,因此在本节中所有的几何变换都将采用齐 次坐标进行运算。 5.1 三维图形几何变换矩阵 由于用齐次坐标表示,三维几何变换的矩阵是一个 4 阶方阵,其形式如下: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 2 ú ú ú ú û ù ê ê ê ê ë é ×=×=¢¢¢ snml rihj qfed pcba zyxTzyxzyx D ]1[]1[]1[ 3 DT3 分为四个矩阵, ú ú ú û ù ê ê ê ë é = ihg fed cba T1 对图形进行比例、旋转、对称等变换; [ ]nmlT =2 对图形进行平移变换; ú ú ú û ù ê ê ê ë é = r q p T3 对图形做透视投影变换。 图 5-1 三维图形平移示意图 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 3 [ ]sT =4 产生整体比例变换。 5.2 三维图形基本变换矩阵 5.2.1 平移变换 三维坐标系中图形的平移如图 5-1 所示。 坐标平移变换: nzz'myy'xx' +=+=+= l 参照二维的平移变换,我们很容易得到三维平移变换矩阵: [][][]1 1 0100 0010 0001 11 zyx nml zyxTzyx ú ú ú ú û ù ê ê ê ê ë é =·=¢¢¢ CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 4 其中 ú ú ú ú û ù ê ê ê ê ë é = 1nm 0100 0010 0001 T l 为三维平移变换矩阵。 5.2.2 比例变换 坐标比例变换: zSz' ySy' xSx' z y x = = = 三维比例变换: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 5 相对原点三维图形比例变换矩阵 ú ú ú ú ú û ù ê ê ê ê ê ë é = 1000 000 000 000 z y x S S S T 5.2.3 绕坐标轴的旋转变换 考虑右手坐标系下相对坐标原点绕坐标轴旋转θ角的变换矩阵。三维基 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 6 本旋转变换:绕坐标系 X、Y、Z 轴旋转。 A. 绕 x 轴旋转, 三维变换 其中变换矩阵: ú ú ú ú û ù ê ê ê ê ë é -= 1000 0cosθsinθ0 0sinθcosθ0 0001 Tx □□> 0 右手法则 B. 绕 y 轴旋转 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 7 三维变换 其中变换矩阵: ú ú ú ú û ù ê ê ê ê ë é - = 1000 0cosθ0sinθ 0010 0sinθ0cosθ Ty □□> 0 右手法则 C. 绕 z 轴旋转 三维变换 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 8 其中变换矩阵: ú ú ú ú û ù ê ê ê ê ë é -= 1000 0100 00cosθsinθ 00sinθcosθ )(TZ θ 是指符合右手法则 相当于二维逆时针,0>θ D. 绕任意轴的旋转变换 设旋转轴 AB 由任意一点 A(xa,ya,za)及其方向数(a,b,c)定义, 空间一点 P(xp,yp,zp)绕 AB 轴旋转 角到 P/(xp /,yp /,zp /),如图 5-2 所示,则: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 9 [ ] [ ] )(11 θabpppppp Rzyxzyx =¢¢¢ 可以通过下列步骤来实现 P 点的旋转: 1. 将 A 点移到坐标原点。 2. 使 AB 分别绕 X 轴、Y 轴 旋转适当角度与 Z 轴重 合。 3. 将 AB 绕 Z 轴旋转 角。 4. 作上述变换的逆操作,使 AB 回到原来位置。 所以实现 P 点的旋转可写为: 其中各 图 5-2 三维图形旋转示意图 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 10 个矩阵的形式参照上面所讲的平移、选择矩阵,而 、 分别是 AB 在 YOZ 平面与 XOZ 平面的投影与 Z 轴的夹角。 5.2.4 对称变换 (1) 相对于 X 轴对称,坐标变换有 , 即 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 11 (2) 相对于 Y 轴对称, 坐标变换有 即 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 12 (3) 相对于 Z 轴对称, 坐标变换有 即 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 13 (4) 相对于坐标原点对称, 坐标变换有 即 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 14 (5)关于三个坐标平面 XY、YZ 及 XZ 的对称变换分别为: ú ú ú ú û ù ê ê ê ê ë é -= 1000 0100 0010 0001 Txy , ú ú ú ú û ù ê ê ê ê ë é- = 1000 0100 0010 0001 Tyz , ú ú ú ú û ù ê ê ê ê ë é -= 1000 0100 0010 0001 Txz 5.2.5 错切变换 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 15 图形沿 X 轴、Y 轴、Z 轴方向错切时,其变换矩阵的一般表达式: ú ú ú ú û ù ê ê ê ê ë é = 1000 01 01 01 hg fd cb T 对应坐标变换表示为: zfycxz' hzybxy' gzdyxx' ++= ++= ++= 根据不同的错切方向,三维错切变换矩阵有以下几种。 1.沿 X 轴方向错切,错切变换矩阵: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 16 ú ú ú ú û ù ê ê ê ê ë é = 1000 010 001 0001 g dT 当 d=0 时,错切平面离开 Z 轴,沿 X 方向沿移动; 当 g=0 时,错切平面离开 Y 轴,沿 X 方向沿移动; 2.沿 Y 轴方向错切,错切变换矩阵: ú ú ú ú û ù ê ê ê ê ë é = 1000 010 0010 001 h b T 当 b=0 时,错切平面离开 Z 轴,沿 Y 方向沿移动; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 17 当 h=0 时,错切平面离开 X 轴,沿 Y 方向沿移动; 3.沿 Z 轴方向错切,错切变换矩阵: ú ú ú ú û ù ê ê ê ê ë é = 1000 0100 010 001 f c T 当 c=0 时,错切平面离开 Y 轴,沿 Z 方向沿移动; 当 f =0 时,错切平面离开 X 轴,沿 Z 方向沿移动; 5.3 图形的投影变换 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 18 前面我们讨论了二维、三维图形的几何变换,由于显示屏幕是二维的, 所以要输出三维形体,需要将三维坐标表示的几何形体变换成二维坐标表示 的图形,这就是图形的投影变换。 在三维空间中,选择一个点,记该点为投影中心,不经过这个点再定义 一个平面,称该平面为投影面,从投影中心向投影面引出任意条射线,称这 些射线为投影线;穿过物体的投影线将与投影面相交,在投影面上形成物体 的像,称这个像为三维物体在二维投影面上的投影。这样将三维空间的物体 变换到二维平面上的过程称为投影变换。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 19 5.3.1 投影变换分类 投影变换又分为透视投影和平行投影,其主要区别在于透视投影的投影 中心到投影面之间的距离是有限的,而平行投影的投影中心到投影面之间的 距离是无限的。当投影中心在无穷远时,投影线互相平行,所以,平行投影 表示时只给出投影线方向即可,而透视投影要明确指定投影中心的位置。投 影变换的分类情况如下表所示: CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 20 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 21 5.3.2 平行投影 平行投影根据投影方向与投影面的夹角分为两类,即正投影与斜投影, 当投影方向垂直于投影面时称为正投影,否则为斜投影。 5.3.2.1 正平行投影(三视图) 正平行投影的投影中心到投影面之 间的距离是无限的正投影。正平行投影 又包括:三视图和正轴测。 Y Z X H 面 W面 V面 图 5-3 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 22 1.三视图 工程中通常将三维坐标系 OXYZ 三个坐标平面分为:H 面(XOY 面)、 V 面 ( XOZ 面)和 W 面(YOZ 面),如图 5-3 所示。三维图形在 V 面上的投影称为 主视图、在 H 面上的投影称为俯视图、在 W 面上的投影称为侧视图。 (1) 视图 将三维形体向 xoz 面(又称 V 面)作垂直投影(即正平行投 影), 得 到 主 视 图。主视图变换矩阵: ú ú ú ú û ù ê ê ê ê ë é = 1000 0100 0000 0001 TV 2)俯视图 三维形体向 xoy 面(又称 H 面)作垂直投影得到俯视图, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 23 俯视图变换矩阵: ú ú ú ú û ù ê ê ê ê ë é = 1000 0000 0010 0001 HT 3)侧视图 获得侧视图是将三维形体往 yoz 面(侧面 W)作垂直投影, 步骤: 侧视图变换矩阵: ú ú ú ú û ù ê ê ê ê ë é = 1000 0100 0010 0000 WT CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 24 H 面、V 面、W 面的三个正投影以一定方式摆在某一个平面上——三视 图 2.正轴侧投影变换 若将空间立体绕某个投影面所包含的两个轴向旋转,在向该投影面作正 投影,即可得到立体正轴测图。通常选 V 面为轴侧投影面,所以将立体图 绕 Z 轴正向(逆时针方向)旋转θ角,再绕 X 轴反向(顺时针方向)旋转 φ角,最后向 V 面正投影。因此将绕 Z 轴旋转变换矩阵 Tz,绕 X 轴旋转变 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 25 换矩阵 Tx 和向 V 面正投影变换矩阵 Tv 连乘,即可得到正轴侧变换矩阵: ú ú ú ú û ù ê ê ê ê ë é -- - =××= 1000 0cos00 0sincos0cos 0cossin0cos φ φθφ θφφ vxzE TTTT (1)正等侧投影为正轴侧投影中 x、y、z 三个方向上缩放率相等时的变 换,即 6135,45 00 ¢== ϕθ ,变换矩阵为: ú ú ú ú û ù ê ê ê ê ë é -- - = 1000 0816.000 0408.00707.0 0408.00707.0 正等T CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 26 (2)正二侧投影为正轴侧投影中 x、z 三个方向上缩放率相等时的变 换,即为: 8219,2420 00 ¢=¢= ϕθ 时,变换矩阵: ú ú ú ú û ù ê ê ê ê ë é -- - = 1000 0943.000 0312.00354.0 0118.00935.0 正二T 5.3.2.2 斜平行投影 投影方向不垂直于投影平面的平行投影被称为斜平行投影,如图 5-4 所 示,假设 Z=0 的坐标平面为观察平面(H 面),点(x,y)为点(x,y, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 27 z)在观察平面上的正平行投影坐标,点(x/,y/)为斜投影坐标。(x,y) 与(x/,y/)的距离为 L。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 28 显然, 而 L 的长度依赖于 ,即 , 图 5-4 斜平行投影示意图 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 29 所以 令 ,则 , 由此可得斜平行投影的变换矩阵: [][] ú ú ú ú û ù ê ê ê ê ë é =¢¢¢ 0010 00sincos 0010 0001 11 11 αα llzyxzyx CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 30 (1)斜等测平行投影, 0 1 45,11 === β βtg l (2)斜二测平行投影, αβ β 1 1 , 2 11 -=== tg tg l 其中 β 为投影线与投影平面的夹角,α 为投影与 X 轴的夹角。 5.3.2.3 透视投影 透视投影的视线(投影线)是从视点(观察点)出发,视线是不平行 的。不平行于投影平面的视线汇聚的一点称为灭点,在坐标轴上的灭点叫做 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 31 主灭点。主灭点数和投影平面切割坐标轴的数量相对应。按照主灭点的个 数,透视投影可分为一点透视、二点透视和三点透视,如图 5-5 所示。 图 5-5 透视投影示意图 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 32 1. 一点透视 Z 轴上有一个观察点 V(0,0,h),由 V 点出发将物体的点 P(x,y, z)投影到 XOY 平面上得到(X,Y,Z)。 变换矩阵:灭点在 Z 轴上(0,0,-h), 灭点在 X 轴上(-h,0,0), 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 33 灭点在 Y 轴上(0,-h,0), 均称为一点变换,可得到一点透视(以灭点在 Z 轴上为例)有 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 34 ,其中 2. 二点透视 在变换矩阵中的四行的三个参数起透视变换作用。 , 若 p,q 二个参数不为零,则即可得到二点透视, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 35 若固定 Y,Z 令 ,则得灭点为 ; 若固定 X,Z 令 ,则得另一灭点为 , 即坐标轴上有两个灭点,因而称为二点透视。 3. 三点透视 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 36 同理,可以讨论由三个主灭点的透视变换,其变换矩阵为 , 三个灭点分别为 。 透视投影技巧:实际进行透视投影时,为了获得理想的透视投影图,往 往先对物体进行旋转和平易,然后再进行透视投影变换。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 37 5.4 三维变换程序设计案例 一、程序设计功能说明 本程序为三维几何变换的实用程序,可实现以上介绍的种三维几何图形 变换的绘制。如图 5-7 所示为程序运行时的主界面,通过单击菜单及下拉菜 单的各功能项完成分别各种几何变换。 说明:为了使变换结果得更清楚、直观,程序中的几何变换和透视图是 对正方体进行的;而投影变换中的平行变换是对类似“椅子”图形进行的变 换。 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 38 图 5-7 二、程序设计步骤 1. 创建工程名称为“三维变换”单文档应用程序框架 2. 编辑菜单资源 根据 5.1 表中的定义编辑菜单资源,设计如图 5-7 所示的菜单项。 表 5.1 菜单资源表 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 39 平移 ID_TRANSLATION 绕 X 轴 ID_ROTATION_X 绕 Y 轴 ID_ROTATION_Y 旋转 绕 Z 轴 ID_ROTATION_Z 沿 XYZ 变比 ID_SCALING_XYZ 变比 整体变比 ID_SCALING_S 基本图形 变换 对称 关于 X 轴对称 关于 Y 轴对称 关于 Z 轴对称 关于 OXY 平面对 称 关于 OYZ 平面对 称 关于 OZX 平面对 称 关于原点对称 ID_MIRROR_X ID_MIRROR_Y ID_MIRROR_Z ID_MIRROR_OXY ID_MIRROR_OYZ ID_MIRROR_OZX ID_MIRROR_O 主视图 ID_V 俯视图 ID_H 三视图 侧视图 ID_W 正等测 图 ID_VE 正轴测 图 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 40 3. 添加消息处理函数 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息 处理函数,ClassName 栏中选择 CMyView,根据表 5.2 建立如下的消息映射 函数。 表 5.2 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_TRANSLATION CONMMAN OnIDTRANSLATION ID_ROTATION CONMMAN OnIDROTATION ID_SCALING CONMMAN OnIDROTATION D_MIRROR_X CONMMAN OnIDMIRRORX ID_MIRROR_Y CONMMAN OnIDMIRRORY ID_MIRROR_O CONMMAN OnIDMIRRORO ID_SCALINGXY CONMMAN OnIDSCALINGXY ID_ROTATIONXY CONMMAN OnIDROTATIONXY 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 41 4. 添加三维变换绘图基类 基类 BaseClass 类。在工程中单击【文件】|【新建】,在弹出的新建对 话框中,选择 C/C++ Header File ,在【文件】名称输入栏中输入 “BaseClass”;同样,在工程中单击【文件】|【新建】,在弹出的新建对话 框 中,选择 C++ Source File ,在【文件】名称输入栏中输入 “BaseClass”。在工作区中系统自动创建的相应的空文件中,分别添加以下 此基类的头文件(.h 文件)和应用文件(.cpp 文件)。 // BaseClass.h: interface for the CMyClass class. // /////////////////////////////////////////////////////////////// /////// #if !defined(AFX_BaseCLASS_H__6250EB80_113B_11D4_81FF_D19FE195501C __INCLUDED_) CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 42 #define AFX_BaseCLASS_H__6250EB80_113B_11D4_81FF_D19FE195501C__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define Scale 1.35 typedef double array2d[5][5]; typedef double array[24]; /*********************************************************** * 变量说明:Aux1, Aux2, Aux3, Aux4, Aux5, Aux6, Aux7, * Aux8 是全局变量,用于存取计算用户坐标系点到观察坐标系点的 * * 坐标值公式中的正余弦值。X, Y, Z, C, XP, YP, ZP, CP 为一维 * 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 43 * 数组,存放立体顶点齐次坐标,XT, YT, ZT 亦为一维数组,存放 * * 立体顶点经变换后的坐标值。A, Ah, Aw 二维数组用来接收轴测 * * 图的变换矩阵与三视图的变换矩阵参数值。 * ***********************************************************/ class CBaseClass // 定义一个基类 { 程序代码见纸书 #endif // !defined(AFX_MYCLASS_H__6250EB80_113B_11D4_81FF_D19FE195501C__I NCLUDED_) 说明: * 变量说明:Aux1, Aux2, Aux3, Aux4, Aux5, Aux6, Aux7, * * Aux8 是全局变量,用于存取计算用户坐标系点到观察坐标系点的 * CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 44 * 坐标值公式中的正余弦值。X, Y, Z, C, XP, YP, ZP, CP 为一维 * * 数组,存放立体顶点齐次坐标,XT, YT, ZT 亦为一维数组,存放 * * 立体顶点经变换后的坐标值。A, Ah, Aw 二维数组用来接收轴测 * * 图的变换矩阵与三视图的变换矩阵参数值。 * // BaseClass.cpp: implementation of the CMyClass class. // /////////////////////////////////////////////////////////////// /////// #include "stdafx.h" #include "三维变换.h" #include "BaseClass.h" #include "三维变换 View.h" #include "math.h" 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 45 #define PI 3.141592654 #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif /////////////////////////////////////////////////////////////// /////// // Construction/Destruction /////////////////////////////////////////////////////////////// /////// CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 46 CBaseClass::CBaseClass() { ed=2000,eh=100,od=400,hl=1,ps=0; } CBaseClass::~CBaseClass() { } // 此函数赋轴测图中立体上顶点的齐次坐标值 void CBaseClass::ReadWorkpiece() { 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 47 /*************************************************** * 此函数分别用于三个视图的投影变换,统一用变换后顶 * * 点的三个坐标计算公式求其坐标值。这三个公式是由点 * * 的齐次坐标乘以变换矩阵得来的。实际上每个视图投影 * * 只有二个非零坐标需要计算求得,而另一个坐标是零勿 * * 需计算。因此也可以根据三个不同视图的投影,分别采 * * 用其投影后的二个坐标计算式来求坐标值。函数中可用 * * 条件语句选择不同视图投影采用不同坐标计算式求值。 * ***************************************************/ void CBaseClass::Calculate(array2d B) { 程序代码见纸书 } 代码说明: 以上 CMyClass 基类中 DrawView()函数考虑用户坐标到屏幕坐标的变 CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 48 换,其中水平像素与垂直像素比例为 1。ReadWorkpiece()函数给图形的顶 点赋予齐次坐标值。Calculate()函数计算原图形中顶点的齐次矩阵与变换 矩阵的相乘,并存储相乘的结果。DrawView ()绘制原图形与变换后的图 形。Display ()在屏幕上显示图形 5. 在几何图形变换 View.h、几何图形变换 View.cpp 添加完成各个 菜单消息处理函数,实现既定功能, // 三维变换 View.h : interface of the CMyView class // 三维变换 View.h : interface of the CMyView class // ////////////////////////////////////////////////////////// /////////////////// 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 49 #if !defined(AFX_VIEW_H__BFB29846_C242_48D0_8CA7_60B59B46A 728__INCLUDED_) #define AFX_VIEW_H__BFB29846_C242_48D0_8CA7_60B59B46A728__INCLUDED_ 程序代码见纸书// RedrawWindow(); } 5.5 课后练习 1. 请写出三维几何变换矩阵,并说明各功能子矩阵作用。 2. 给定一个单位立方体,一个顶点在(0,0,0),相对另一顶点在 (1,1,1),将单位立方体绕过此两点所连直线旋转θ角,求变换 矩阵; CAD 教育网制作www.cadedu.com 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 50 3. 编程实现将上述单位矩阵作平移、缩放、和旋转变换。 4. 设三棱锥各点坐标为(0,0,20),( 20,0,20),( 20,0,0), ( 10,20,10), 编 程 实现三面正投影图; 5. 编程实现一三棱锥的正等轴测和正二测图形。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 第六章 曲线和曲面 6.1 曲线曲面参数表示的基础知识 工程设计中经常绘制各种曲线和曲面,曲线分为规则曲线与不规则曲 线,曲面也相应分为规则曲面与不规则曲面。规则曲线有圆锥曲线、圆柱 曲线、渐开线等,这些曲线都可用函数或参数方程表示;不规则曲线则是 根据给定的离散数据点用曲线拟合逼近得到,常见的有参数样条曲线、 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com Bezier 曲线、B 样条曲线等,这些曲线采取分段的参数方程来表示。规则 曲面常见的有柱面、锥面、球面、环面、双曲面、抛物面等,这些曲面都 可用函数或参数方程表示;常见的不规则曲面有 Bezier 曲面、B 样条曲面 等,这些曲面采取分片的参数方程来表示。数学上曲线和曲面的表示有多 种形式。曲线和曲面的表示方程有参数表示和非参数表示之分。由于参数 表示的曲线、曲面具有几何不变性等优点,计算机图形学中通常用参数形 式描述曲线、曲面。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.1.1 非参数表示和参数表示 非参数表示又分为显式和隐式两种表示方式。对于一个平面曲线,显式 表示一般形式是:y=f(x)。在此方程中,一个 x 值与一个 y 值对应,所 以显式方程不能表示封闭或多值曲线,例如,不能用显式方程表示一个圆。 如果一个平面曲线方程,表示成 f(x,y)=0 的形式,我们称之为隐式 表示。隐式表示的优点是易于判断函数 f(x,y)是否大于、小于或等于 零,也就易于判断点是落在所表示曲线上或在曲线的哪一侧。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 对于非参数表示形式方程(无论是显式还是隐式)存在下述问题: 1. 与坐标轴相关; 2. 会出现斜率为无穷大的情形(如垂线); 3. 对于非平面曲线、曲面,难以用常系数的非参数化函数表示; 4. 不便于计算机编程。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 在几何造型系统中,曲线曲面方程通常表示成参数的形式,即曲线上任 一点的坐标均表示成给定参数的函数。假定用 t 表示参数,平面曲线上任 一点 P 可表示为:P(t)=[x(t),y(t)]; 空间曲线上任一三维点 P 可表示为:P(t)=[x(t), y(t), z(t)];最简 单的参数曲线是直线段,端点为 P1、P2 的直线段参数方程可表示为: P(t)=P1+(P2-P1)t t∈[0, 1]; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 圆在计算机图形学中应用十分广泛,其在第一象限内的单位圆弧的非参 数显式表示为: 其参数形式可表示为: 在曲线、曲面的表示上,参数方程比非参数方程有更多的优越性,主要 表现在: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (1)可以满足几何不变性的要求。 (2)有更大的自由度来控制曲线、曲面的形状。如一条二维三次曲线的显 式表示为: 只有四个系数控制曲线的形状。而二维三次曲线的参数表达式为: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 有 8 个系数可用来控制此曲线的形状。 (3)对非参数方程表示的曲线、曲面进行变换,必须对曲线、曲面上的每 个型值点进行几何变换;而对参数表示的曲线、曲面可对其参数方程直接 进行几何变换。 (4)便于处理斜率为无穷大的情形,不会因此而中断计算。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (5)参数方程中,代数、几何相关和无关的变量是完全分离的,而且对变 量个数不限,从而便于用户把低维空间中曲线、曲面扩展到高维空间去。 这种变量分离的特点使我们可以用数学公式处理几何分量。 (6)规格化的参数变量 t∈[0, 1],使其相应的几何分量是有界的,而不 必用另外的参数去定义边界。 (7)易于用矢量和矩阵表示几何分量 ,简化了计算。 6.1.2 参数表示的基本特征 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 参数表示的基本形式有:代数形势和几何形式 1.代数形式 一条曲线段 10,)]()()([)( ££= ttztytxtQ T 其中 ,若表示成 t 的三次多项式, 曲线的代数形式是: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 方程组中 12 个系数唯一地确定了一条 3 次参数曲线的位置与形状。上 述 代 数式写成矢量式是: (6.1) 其中 是代数系数矢量,P(t)是三次参数曲线上任一点的位置矢 量。 2.几何形式 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 描述参数曲线的条件有:端点位矢、端点切矢、曲率等。对三次参数曲 线,若用其端点位矢 P(0)、P(1)和切矢 )1()0( PP ¢¢ 、 描述,并将 P(0)、P(1)、 )1()0( PP ¢¢ 、 简记为 P0、P1、 10 PP ¢¢ 、 ,代入(6.1)式得(如图 6-1 所示): (6.2) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 将(6.2)代入(6.1)整理后得: (6.3) 令: , , , 将 F0,F1,G0,G1 代入(3.1.3)式,可将其简化为: (6.4) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (6.4)式是三次 Hermite(Ferguson)曲线的几何 图 6-2 三次调和函数 图 6-1 Ferguson 曲线端点位矢和切矢 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 形式,几何系数是 )1()0( PP 、 、 )1()0( PP ¢¢ 、 F0,F1,G0,G1 称为调和函数(或混合函数),即 该 形式下的三次 Hermite 基。 它们具有如下的性质: (6.5) 图 7-1-1 Ferguson 曲线端点位矢和切矢 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com F0 和 F1 控制端点的函数值对曲线的影响,而同端点的导数值无关;G0 和 G1 则控制端点的一阶导数值对曲线形状的影响,同端点的函数值无关。或 者说,F0 和 G0 控制左端点的影响,F1 和 G1 控制右端点的影响。图 6-2 给出 了这四个调和函数的图形。 调和函数不是唯一的,任何满足(3.1.5)式 C1 类多项式函数都可以作为 调和函数使用,其中 F0 和 F1 必须是单调连续函数。F0(t)=1-t,F1(t)=t 是一 次多项式调和函数。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.1.3 曲线段之间的连续性 设计一条复杂曲线时,常常通过多段曲线组合而成,这需要解决曲线段 之间光滑连接的问题。 曲线间连接的光滑度的度量有两种:一 种是函数的可微性,把组合参数 曲线构造成在连接处具有直到 n 阶连续导矢,即 n 阶连续可微,这类光滑 度称之为 Cn 或 n 阶参数连续性。另一种称为几何连续性,组合曲线在连接 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 处满足不同于 Cn 的某一组约束条件,称为具有 n 阶几何连续性,简记为 Gn。 曲线光滑度的两种度量方法并不矛盾,Cn 连续包含在 Gn 连续之中。下面我 们来讨论两条曲线的连续问题。如图 6-3 所示,二条曲线 P(t)和 Q(t),参 数 的连续性 C0 连续(0 阶参数连续)——前一段曲线的终点与后一段曲线的起点 相同。 若要求在结合处达到 G0 连续或 C0 连续,即两曲线在结合处位置连续: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com P(1)=Q(0) C1 连续(一阶参数连续)—— 两相邻曲线 段的连接点处有相同的一阶导数。若要求在结合处达到 G1 连续,就是说两 条曲线在结合处在满足 G0 连续的条件下,并有公共的切矢: (6.6) 当 时,G1 连续就成为 C1 连续。 C2连续(二阶参数连续)—— 两 相邻曲线段的连接点处有相同的一阶导数和二阶导数。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 若要求在结合处达到 G2 连续,就是说两条曲线在结合处在满足 G1 连续 的条件下,并有公共的曲率矢: (6.7) 代入(6.6)得: 这个关系为: (6.8) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 为任意常数。当 , 时,G2 连续就成为 C2 连续。 我们看到,C1 连续保证 G2 连 续,C1 连续能保证 G2 连续,但反过来不行。 也就是说Cn连续的条件比 Gn 连续的条件要苛刻。 图 6-3 两条曲线的连续性 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.1.4 曲线曲面设计中的几个概念:型值点:是指通过测量或计算得到的 曲线或曲面上少量描述其几何形状的数据点。 控制点:是指用来控制或调整曲线曲面形状的特殊点,曲线曲面本身不 一定通过控制点。 插值和逼近:这是曲线曲面设计中的两种不同方法。插值设计方法要求 建立的曲线曲面数学模型,严格通过已知的每一个型值点。而逼近设计方 法建立的曲线曲面数学模型只是近似地接近已知的型值点。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 拟合:是指在曲线曲面的设计过程中,用插值或逼近的方法使生成的曲 线曲面达到某些设计要求。 6.2 常用参数曲线 6.2.1 一般规则空间曲线 若一条规则空间曲线的函数式以给出,则曲线上一系列点的位置可求 出。 1. 球面三叶玫瑰线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 极坐标方程为 )3sin( θρ a= ,将此已知的平面曲线映射到半球面上,且半 球面的半径为 a,即可得到空间三叶玫瑰线。 参数方程为: )3cos( sin)3sin( cos)3sin( θ θθ θθ aZ aY aX = = = 令参数θ在给定范围内连续取值,即可求 得空间曲线上的一系列点。 2. 圆柱螺线参数方程为: θ θ θ kZ aY aX = = = sin cos 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3. 圆锥螺线参数方程为: θ θθ θθ kZ Y X = = = sin cos 6.2.2 Bezier 曲线 一.Bezier 曲线定义 贝塞尔曲线是不规则曲线,需要在起点和终点之间构建插值多项式的混 合函数,通常由 n+1 个顶点定义一个 n 次多项式。在给定空间 n+1 个点的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 位置矢量 Pi(i=0,1,2,…,n),则 Bezier 参数曲线上各点坐标的插 值公式是: 图 6-4 三次Bezier 曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中,Pi 构成该 Bezier 曲线的特征多边形, )(, tB ni 是 n 次 Bernstein 基 函数: Bezier 曲线实例如图 6-4 所示。 二.Bezier 曲线的性质 (1)端点性质 a. 曲线端点位置矢量 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 当 t=0 时,P(0)=P0 ;当 t=1 时,P(1)=Pn。由此可见,Bezier 曲线 的起点、终点与相应的特征多边形的起点、终点重合。 b. 端点处的 r 阶导数 起点处: nitPBrn nP i i r r i rr L,1,010)1()!( ! 0 1 )0( =££--= å = - 终点处: nitPBrn nP in i r r i ir L,1,010)1()!( ! 0 )1( =££--= - = å 一阶导数: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com t=0 时, )P-n(PP 01(0) =¢ 当 t=1 时, )P-n(PP 1-nn(1) =¢ , 说明:Bezier 曲线的起点和终点处的切线方向和特征多边形的第一条 边及最后一条边的走向一致。 二阶导矢: 当 t=0 时, 当 t=1 时, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 上式表明:2 阶导矢只与相邻的 3 个顶点有关,事实上,r 阶导矢只与 (r+1)个相邻点有关,与更远点无关。 (2)对称性。由控制顶点 构造出的新 Bezier 曲线, 与原 Bezier 曲线形状相同,走向相反。因为: 这个性质说明 Bezier 曲线在起点处有什么几何性质,在终点处也有相同的 性质。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (3)凸包性 由于 , ,所以 当 t 在[0,1]区间变化时,对某一个 t 值, P(t)是特征多边形各顶点 的加权 平均, 图 6-5 Bezier 曲线的凸包性 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 权因子依次是 。在几何图形上,意味着 Bezier 曲线 P(t)在 中 各点是控制点 Pi 的凸线性组合,即曲线落在 Pi 构成的凸包之中,如图 6-5 所示。 三.常用 Bezier 曲线的矩阵表示由 Bezier 曲线 C(u)的定义,可推出常用的 一次、二次、三次 Bezier 曲线矩阵表示 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 6-7 二次 Bezier 曲线 1) 一次 Bezier 曲线 10)1()( uPPuuC +-= 矩阵表示为 úû ù êë é úû ù êë é-= 1 0 01 11]1,[)( P PuuC 图 6-6 一次Bezier 曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 这是一条从 0P 到 1P 的直线段,如图 6-6 所示。 2)二次 Bezier 曲线 ,如图 6-7 所示。 2 2 10 2 )1(2)1()( PuPuuPuuC +-+-= 矩阵表示为 ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é - - = 2 1 0 2 001 022 121 ]1[)( P P P uuuC 将P0、P1、P2分解为二维平面上的 X、Y 分量,则: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 2 210100 2 1 0 2 2 210100 2 1 0 2 )2()(2 001 022 121 ]1[)( )2()(2 001 022 121 ]1[)( tYYYtYYY X X X tttY tXXXtXXX X X X tttX +-+--= ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é - - = +-+--= ú ú ú û ù ê ê ê ë é ú ú ú û ù ê ê ê ë é - - = 展开为: 2 210 2 210 2)( 2)( tBBBtY tAAAtX +-= +-= 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 式中 2103 101 00 2103 101 00 2 )(2 2 )(2 YYYB YYB YB XXXA XXA XA +-= -= = +-= -= = 3)三次Bezier 曲线 3 3 2 2 1 2 0 3 )1(3)1(3)1()( PuPuuPuuPuuC +-+-+-= 矩阵表示为: ú ú ú ú û ù ê ê ê ê ë é ú ú ú ú û ù ê ê ê ê ë é - - -- = 3 2 1 0 23 0001 0033 0363 1331 ]1[)( P P P P uuuuC 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 将 P0、P1、P2、P3 分解为二维平面上的 X、Y 分量,则: 2 210100 3 2 1 0 23 2 210100 3 2 1 0 23 )2()(2 0001 0033 0363 1331 ]1[6/1)( )2()(2 0001 0033 0363 1331 ]1[)( tYYYtYYY Y Y Y Y ttttY tXXXtXXX X X X X ttttX +-+--= ú ú ú ú û ù ê ê ê ê ë é ú ú ú ú û ù ê ê ê ê ë é - - -- = +-+--= ú ú ú ú û ù ê ê ê ê ë é ú ú ú ú û ù ê ê ê ê ë é - - -- = 展开为: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3 3 2 210 3 3 2 210 )( )( tBtBtBBtY tAtAtAAtX +++= +++= 式中 32103 2102 101 00 32103 2102 101 00 33 36 )(3 33 36 )(3 YYYYB YYYB YYB YB XXXXA XXXA XXA XA +-+-= +--= --= = +-+-= +--= --= = 四. Bezier 曲线的递推性(de Casteljau 算法) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 如图 6-8 所示,设 、 、 是一条抛物线上顺序三个不同的点。过 和 点的两切线交于 点,在 点的切线交 和 于 和 ,则如下 比例成立: 这是所谓抛物线的三切线定理。 当 P0,P2 固定,引入参数 t, 令上 述比值为 t:(1-t),即有: 图 6-8 抛物线三切线图示 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com t 从 0 变到 1,第一、二式就分别表示控制二边形的第一、二条边,它 们是两条一次 Bezier 曲线。将一、二式代入第三式得: 当 t 从 0 变到 1 时,它表示了由三顶点 P0、P1、P2 三点定义的一条二次 Bezier 曲线。并且表明:这二次 Bezier 曲线 P2 0 可以定义为分别由前两个 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 顶点(P 0 ,P 1 )和后两个顶点(P 1 ,P 2 )决定的一次 Bezier 曲线的线性组合。 依次类推,由四个控制点定义的三次 Bezier 曲线 P3 0 可被定义为分别由(P0, P1,P2)和(P1,P2,P3)确定的二条二次 Bezier 曲线的线性组合,由(n+1)个 控制点 Pi(i=0, 1, ..., n)定义的 n 次 Bezier 曲线 Pn 0 可被定义为分别由 前、后 n 个控制点定义的两条(n-1)次 Bezier 曲线 P0 n-1 与 P1 n-1 的线性组合: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 由此得到 Bezier 曲线的递推计 算 公式: 图 6-9 几何作图求 Bizier 曲线上 一点(n=3,t=1/4) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 即 de Casteljau 算法。 利用以上递推公式,在给定参数下,可求得 Bezier 曲线上一点 P(t)。上 式中: 是定义 Bezier 曲线的控制点, 即为曲线 上具有参数 t 的点。de Casteljau 算法稳定可靠,直观简便,是计算 Bezier 曲线的基 本算法和标准算法。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 这一算法可用简单的几何作图来实现。给定参数 ,就把定义域分 成长度为 的两段。依次对原始控制多边形每一边执行同样的定比分 割,所得分点就是第一级递推生成的中间顶点 ,对这些中 间顶点构成的控制多边形再执行同样的定比分割,得第二级中间顶点 。重复进行下去,直到 n 级递推得到一个中间顶点 即为 所求曲线上的点 ,如图 6-9 所示。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 五. Bezier 曲线的升阶 所谓升阶是指保持 Bezier 曲线的形状与定向不变,增加定义它的控制 顶点数,也即是提高该 Bezier 曲线的次数。增加了控制顶点数,不仅能增 加了对曲线进行形状控制的灵活性,还在构造曲面方面有着重要的应用。 对于一些由曲线生成曲面的算法,要求那些曲线必须是同次的。应用升阶 的方法,我们可以把低于最高次数的的曲线提升到最高次数,而获得同一 的次数。曲线升阶后,原控制顶点会发生变化。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 设给定原始控制顶点 ,定义了一条 n 次 Bezier 曲线,曲线提 升一阶后的新的控制顶点。 增加一个顶点后,仍定义同一条曲线的新控制顶点为 ,则有: 对上式左边乘以 ,得到: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 比较等式两边 项的 系数,得到: 化简即得: 图 6-10 Bezier 曲线升阶 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中 。 此式说明: · 新的控制顶点 是以参数值 按分段线性插值从原始特征多边形 得出的。 · 升阶后的新的特征多边形在原始特征多边形的凸包内。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com · 特征多边形更靠 近曲线。 三次 Bezier 曲线的升 阶实 例,如图 6-10 所示。 6.2.3 B 样条曲线 以 Bernstein 基函数构 图6-11 B样条曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 造的 Bezier 曲线或曲面有许多优越性,但有也有许多 Bezier 曲线或曲面 不能作局部修改等不足。1972 年,Gordon、Riesenfeld 等人提出了 B 样条 方法,在保留 Bezier 方法全部优点的同时,克服了 Bezier 方法的弱点。 一.B 样条曲线定义 设 nPPP ,...,, 10 为给定空间的 1+n 个控制顶点, { }uuuU m,...,, 10= 是 1+m 个节点矢量:称下列参数曲线 buauNPuC n i pii ££= å =0 , )()( 为 p 次的B样 条曲线,折线 nPPP ,...,, 10 为B样条曲线的控制多边形。次数 p , 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 顶点个数 1+n ,节点 个数 1+m 具有如下关 系: 1++= pnm 。二.B 样条曲线的性质:1. 严格的凸包性:曲线严 格位于控制多边的凸 图6-12 B样条曲线凸包性 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 包内;如果 ),[ 1+Î ii uuu 1--<£ pmip )(uC 位于控制顶点 ipi PP ,...,- 所建立的凸包内,如图 6-12 所示。 2.分段参数多项式: )(uC 在每一区间 ),[ 1+Î ii uuu 上都是次数不高于 p 的多项 式; 3.可微性或连续性: )(uC 在每一曲线段内部是无限次可微的,在定义域内 重复度为 k 的节点处则使 kp - 次可微或具有 kp - 阶参数连续性; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 4.几何不变性: B样条曲线的形状和位置与坐标系的选取无关。 5.局部可调性: 因为 )(, uN pi 只在区间 ),[ 1++ pii uu ,中为正,在其它地方均取零值 所以 p B次的样条曲线在修改时只被相邻的 1+p 个顶点控制, 而与其它顶点无关。当移动其中的一个顶点 ip 时,只影响到 定义在区间 ),[ 1++ pii uu 上那部分曲线,并不对整条曲线产生影响。 6.近似性: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 控制多边形是 B 样条曲线的线性近似,若进行节点插入或升阶会更加近 似;次数越低,B 样条曲线越逼近控制顶点; 7.变差缩减性: 如图 6-13 所示,设 nPPP ,...,, 10 为B样条曲线的控制多边形,某平面与B 样 条曲线 的交点 个数不 图 6-13 B样条曲线的变差缩减性 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 多于该平面与其控制多边形的交点个数。 例子:给定控制顶点 )8,...,0( =iPi ,定义一条三次B样条曲线。这说明 8=n , 3=p ,各种关系如下确定: 1。节点矢量 ],...,,[],...,,[ 1210110 uuuuuuU pn == ++ 2.曲线定义域 ),[),[ 931 uuuuu np =Î + 3. 当定义域 ),[ 93 uu 内不含重节点时,曲线段数=n – p +1 =6;4.当由 ),...,[),...,[ 63 PPPP ipi =- 四个控制顶点定义,与其他顶点无关 5.移动 3p 时将至多影响到定义在 ),[),[ 731 uuuu pii =++ 区间上那些曲线段的形状 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.在 ),[ 76 uu 上的三次 B 样条基及计算定义在上那段三次 B 样条曲线将涉及 941 ,..., uuuu pipi == ++- 共 6 个节点。三.重节点对 B 样条曲线的影响节点的非 均匀或非等距分布包含两层含义: (1)节点区间长度不等; (2)重节点,即节点区间长度为零。 1)重节点的重复度每增加 1,曲线段数 就减 1,同时样条曲线 在 该 重 节 点 处 的可微性或参数连续阶降 1; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 2)当定义域端点节点重复度为 p 时, p 次B样条曲线的端点将与相应的控 制多边形的端顶点重合,并在端点处与控制多边形相切; 3)当在曲线定义域内有重复度为 p 的节点时, p 次 B 样条曲线插值于相应 的 控制多边顶点; 4)当端节点重复度为 1+p 时, p 次B样条曲线就具有和次Bezier曲线相同 的端点几何性质;5) p 次B样条曲线若在定义域内相邻两节点都具有重复 度 p ,可以生成定义在该节点区间上那段B样条曲线的Bezier点; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6)当端节点重复度为 1+p 时, p 次B 样条曲线的定义域仅有 一个非零节点区间,则所定义的该 p 次B样条曲线就是 p 次Bezier曲线; 四.B 样条曲线类型的划分 曲线按其首末端点是否重合,区分为闭曲线和开曲线。闭曲线又区分 为周期和非周期两种情形,周期闭曲线与非周期闭曲线的区别是:前者在 首末端点是 连续的,而后者一般是 连续的。非周期闭曲线可以认为 是开曲线的特例,按开曲线处理。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com B 样条曲线按其节点 矢量中 节点的分布情况,可划分为四种 类型。假定控制多边形的 顶点为 ,阶数为 k(次数 为 k-1),则节点矢量是 。 (1)均匀 B 样条曲线 图 6-14 三次均匀 B 样条曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 节点矢量中节点为沿参数轴均匀或等距分布,所有节点区间长度 =常数 ,这样的节点矢量定义了均匀的 B 样条基。图 6-14 为均匀 B 样条曲线实例。 (2)准均匀的 B 样条曲线 与均匀 B 样条曲线的差别 在 于两端节点具有重复度 k,这样的 图6-15 准均匀 B 样条曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 节点矢量定义了准均匀的 B 样条基。 均匀 B 样条曲线在曲线定义域内各节点区间上具有用局部参数表示的 统一的表达式,使得计算与处理简单方便。但用它定义的均匀 B 样条曲线 没有保留 Bezier 曲线端点的几何性质,即样条曲线的首末端点不再是控制 多边形的首末端点。采用准均匀的 B 样条曲线就是为了解决这个问题,使 曲线在端点的行为有较好的控制,如图 6-15 所示。 (3)分段 Bezier 曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 节点矢量中两端节点具有重复度 k,所有内节点重复度为 k-1,这样的 节点矢量定义了分段的 Bernstein 基。 B 样条曲线用分段 Bezier 曲线表示后,各曲线段就具有了相对的独立 性,移动曲线段内的一个控制顶点只影响该曲线段的形状,对其它曲线段 的形状没有影响。并且 Bezier 曲线一整套简单有效的算法都可以原封不动 地采用。其它三种类型的 B 样条曲线可通过插入节点的方法转换成分段 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com Bezier 曲线类型,缺点是增加了定义曲线的数据,控制顶点数及节点数都 将增加,至多增加将近 k-1 倍。分段 Bezier 曲线实例如图 6-16 所示。 (4)非均匀 B 样条曲 线 在这种类型里,任 意分 布的节点矢量 图 6-16 三次分段 Bizier 曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com ,只要在数学上成立(节点序列非递减,两端节点重复 度≤k,内节点重复度≤k-1)都可选取。这样的节点矢量定义了非均匀 B 样条基。 五.均匀 B 样条曲线这里我们重点讲解均匀 B 样条曲线。在节点矢量中节 点为沿参数轴均匀等距分布,所有节点区间长度 iii uu -=D +1 为大于零的常 数;可将定义在每个节点区间 ),[ 1+ii uu 上用整体参数u 表示的 B 样条基变 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 换成用局部参数 )1,0[Ît 表示,只需做参数变换: nppittuuttuu ii ,...,1,],1,0[,)1()( 1 +=Î+-== + 则 B 样条曲线可改写为矩阵形 式: nppittuNPtuCtC i kij pjji ,...,1,],1,0[,))(())(()( , +=Î== å -= 将上式改写为矩阵形式: nppit P P P MttttC i pi pi p p i ,...,1,],1,0[,]...1[)( 12 +=Î ú ú ú ú û ù ê ê ê ê ë é = +- - M 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中 1-3 次系数矩阵 )3,2,1( =pM p 分别为: ú ú ú ú û ù ê ê ê ê ë é -- - -= ú ú ú û ù ê ê ê ë é - -=úû ù êë é -= 1331 0363 0303 0141 , 121 022 011 ,11 01 321 MMM 则可以很容易写出 三次均匀 B 样条曲线的方程: [] ú ú ú ú û ù ê ê ê ê ë é ú ú ú ú û ù ê ê ê ê ë é -- - -= - - - i i i i P P P P ttttC 1 2 3 32 3 1331 0363 0303 0141 16 1)( 六.de Boor 算法 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 给定控制顶点 及节点矢量 后,就定 义了 k 阶(k-1 次)B 样条曲线。计算 B 样条曲线上对应一点 ,可利用 B 样条曲线方程。采用 de Boor 算法,计算更加快捷。 1.de Boor 算法的导出 先将 t 固定在区间 ,由 de Boor-Cox 公式有: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 令 (6.9) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 的值可以通过递推关系式(6.10)求得。这就是 著名的 de Boor 算 法,则(6.9)式可表示为 (6.10) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 上式是同一条曲线 从 k 阶 B 样条表示到 可 k-1 阶 B 样条表示的 递推公式,反复应用此公式,得到: de Boor 算法的递推关系如图 6-17 所示。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 6-17 de Boor 算法的递推关系 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 2.De Boor 算法的几何意义 de Boor 算法有着直观的几何意义 ¾ 割角,即以线段 割去角 。从多边形 开始,经 过 k-1 层割角,最后得到 上的点 ,如图 6-18 所示。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 6-18 B 样条曲线 de Boor 算法 的几何意义 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3.由 de Boor 算法导出三次 B 样条的 Bezier 表示 在使用时,为了减少计算量,希望曲线次数越低越好,但二次曲线是一 条抛物线,不能反应曲线的拐点;所以一般使用三次 ( 四阶) 样条曲线。 下面来讨论三次(四阶)样条曲线与 Bezier 曲线的关系。由 de Boor 算法, 知下列公式成立: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 由于 在区间 上是三次多项式,故以上两个性质表明: 这段曲线表示成三次 Bezier 曲线,则其控制顶点为: ,如图 6-16 所示,即 可表示为: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (6.11) 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中, 。( 6 .11)式表明:对四阶 B 样条曲 线 而言,de Boor 算法不仅是求 的方法,也是把 转化为一段 段 Bezier 曲线的工具。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.3 参数曲面 图 6-19 四阶 B 样条曲线转化成 Bezier 曲线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 空间曲面常采用双参数表示, ),()],(),,(),,([),( dvcbuavuzvuyvuxvuSS ££££== 其中a、b、c、d定义参数 vu, 的变化域,即曲面的定义域。当 vu, 在定义域 中变化时, ),( vuS 在空间坐标系中变化,即 O-UW 坐标系中的任一点均与 O-XYZ 坐标系中的点成一一映射关系。曲面定义域中的一对参数 vu, 确定 曲面上的一个点,如果令 v 参数不变而变动u 则可得到u 线,反之,固定u 而 变化v 求得一条v 线,所有的u 线和v 线形成一个网,称为参数曲线网。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 当平面域为正方形时,即 )10,10( ££££ vu ,则 vu, 平面上的四条线: 1,1,0,0 ==== vuvu 对应空间的四条边界线,此时 P(0,0)、P(1,0)、P(1,1)、P(0,1) 是曲面的四个角点,P(u,0)、P(1,v)、P(u,1)、P(0,v)称为曲线的四条边界线。 6.3.1 函数式曲面 对于非参数式曲面方程一般先转化成参数式曲面方程再进行绘制。这 里 给出几个常见曲面的参数方程 1.球面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 球坐标系下,球心在(x0,y0,z0)的球面参数方程为: uRzZ vuRyY vuRxX sin sincos coscos 0 0 0 += += += ],[],2/,2/[ ππππ -Î-Î vu 计算机编程绘制原理,现任取一个 ]2/,2/[0 ππ-Îu 在平面上绘制一个圆, 再使 ]2/,2/[ ππ-Îu 以一定步长变化,参数 v 对每一个u 都从 π- 变到π 得到一 系列的圆,这里由 u 的变化得到的一系列平行的圆和由v 的变化得到的一组 圆相交,将球面分成一片片小曲面片,所有小曲面片组成球面。若希望曲 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 面相对光滑,则可以将小曲面片分的更细,即所取步长值更小,当然曲面 的光滑程度还与所使用计算机的分辨率有关,屏幕绘制时在不考虑消隐的 情况下,一般立体效果不明显。 2.椭球面 广义坐标系下椭球心位于(x0,y0,z0)的椭球面参数方程为: uczZ vubyY vuaxX sin sincos coscos 0 0 0 += += += ],[],2/,2/[ ππππ -Î-Î vu 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中 a,b,c 分别为椭球面的长、中和短半轴。 6.3.2 旋转曲面 若空间曲面为一旋转曲面,则可通过先将旋转母线表示成参数形式,再 将该参数母线绕一轴旋转的悼词旋转参数时表示的旋转参数曲面。平面曲 线绕所在平面内的直线旋转生成的曲面称为旋转曲面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 1.圆锥面。圆锥面可看成 ZOX 平面上一条过原点的直线绕 Z 轴旋转一 圈得到,设此直线与 Z 轴夹角为α,该直线的参数方程为: ε α cos sin tZ tX = = )0( t< 将此参数圆绕 Z 轴旋转,得到一个旋转参数曲面,即圆锥面,圆锥曲面方 程为 α θα θα cos sin)sin cossin tZ tY tX = = = )20( πθ ££ 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3.环面。圆环面可看成 ZOX 平面上圆心在(z0,x0)半径为 R 的圆绕 Z 轴 旋转一圈得到,设在 ZOX 平面上,该圆的参数式为: uRxZ uRzX sin cos 0 0 += += )20( π££ u 将此参数圆绕 Z 轴旋转,得到一个旋转参数曲面,即圆环,曲面方程为 uRzZ vuRxY vuRxX sin sin)sin( cos)sin( 0 0 0 += += += 2.回转曲面。在 XOY 平面上有抛物线 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com PTY PTX 2 2 = = )2/0( max PYT << Y 的最大值为 maxY 绕 X 轴旋转生成的回转曲面方程为: }sin2,cos2,{),( 2 θθθ ´´= PTPTPTTr 6.4 常用曲面 6.4.1 双曲线曲面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 双曲线曲面也是简单曲面之一。设曲面的四个角点在 UV 面中由单位正 方形的角点 P(0,0)、P(1,0)、P(1,1)、P(0,1)给定,要构成一个双曲面 ),( vuP 其 中 )10,10( ££££ vu 并允许对曲面上任意点作线性插值, ),( vuP 可表示为: ))1,1()1()0,1()1)(1,0()1)(1)(0,0(),( vuPvuPvuPvuPvuP +-+-+--= 或者: v v PP PPuuvuP )1( )1,1()0,1( )1,0()0,0(])1[(),( --= 6.4.2 Bezier 曲面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 基于上面 Bezier 曲线的讨论,我们可以方便地可以给出 Bezier 曲面的 定义和性质,Bezier 曲线的一些算法也可以很容易扩展到 Bezier 曲面的 情况。 一.定义 设 为 个空间点列,则 次 张 量 积 形 式的 Bezier 曲面定义为: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中 , 是 Bernstein 基函数。依次用 线段连接点列 中相邻两点所形成的空间网格,称之为 特征网格。Bezier 曲面的矩阵表示式是: 在一般实际应用中, 不大于 4。二.Bezier 曲面的几种表达形式 1)双一次 Bezier 曲面: 当 n=m=1 时称为双一次 Bezier 曲面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com PuvPvuPvuPvuvuP 11100100 )1()1()1)(1(),( +-+-+--= 这是一双曲抛物面(马鞍 面); 2)双二次 Bezier 曲面:当 n=m=2 时称为双二次 Bezier 曲面 åå == = 2 0 2 0 2,2, )()(),( ij jiij vBuBPvuP 该曲面的四条边界是抛物线 3)双三次 Bezier 曲面:当 n=m=3 时称为双三次 Bezier 曲面,如图 6-20 所 示。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com åå == = 3 0 3 0 3,3, )()(),( ij jiij vBuBPvuP 该曲面的四条边界都是三次 Bezier 曲线;可 通 过 控 制 内 部 的 四 个 控 制 顶 点 PPPP 22211211 ,,, 来控制曲面内部的形 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 6-20 双三次 Bezier 曲面及边界信息 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 根据图中特征网格的 16 个顶点,可导出特征矩阵: )3,3()2,3()1,3()0,3( )3,2()2,2()1,2()0,2( )3,1()2,1()1,1()0,1( )3,0()2,0()1,0()0,0( ][ PPPP PPPP PPPP PPPP P = 双三次贝塞尔曲面的数学表达式为: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 10001 0033 0363 1331 )3,3()2,3()1,3()0,3( )3,2()2,2()1,2()0,2( )3,1()2,1()1,1()0,1( )3,0()2,0()1,0()0,0( 0001 0033 0363 1331 ]1[ )1(3 )1(3 )1( ][])1(3)1(3)1[(),( 2 3 23 3 2 2 3223 v v v PPPP PPPP PPPP PPPP uuu v vv vv v PuuuuuuvuP - - -- - - -- = - - - ´´---= 其中, 令 0001 0033 0363 1331 ][ - - -- =N , ]1[][ 23 vvvV = , ]1[][ 23 uuuU = 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 则 tt VNPNUvuP ][]][][][[),( = ,其中[P]为双三次贝赛尔特征网格矩阵,矩 阵周围 12 个控制点定义了 4 条三次贝塞尔曲线,中 间 4 个 控 制点控制曲面 形状,4 个角点位于曲面上。 三.性质 除变差减小性质外,Bezier 曲线的其它性质可推广到 Bezier 曲面: (1)Bezier 曲面特征网格的四个角点正好是 Bezier 曲面的四个角点,即 , , , 。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (2)Bezier 曲面特征网格最外一圈顶点定义 Bezier 曲面的四条边界; Bezier 曲面边界的跨界切矢只与定义该边界的顶点及相邻一排顶点有关, 且 、 、 和 (图 6-20 打上斜线的三角形); 其 跨 界二阶导矢只与定义该边界的及相邻两排顶点有关。 (3)几何不变性。 (4)对称性。 (5)凸包性。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.4.3 B 样条曲面 给定参数轴 u 和 v 的节点矢量 和 ,p×q 阶 B 样条曲面定义如下: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 是给定的空间 个点列,构成 一张控制网格,称为 B 样条曲面的特征网格。 和 是 B 样条 基,分别由节点矢量 U 和 V 按 deBoor-Cox 递推公式决定。 7.B 样条曲面的几种表达形式 1)双一次 B 样条曲面: 当 n=m=1 时为双一次 B 样条曲面 v v PP PPuuvuP )1( )1,1()0,1( )1,0()0,0(])1[(),( --= 这是一双曲抛物面(马鞍面); 2)双二次 B 样条曲面:当 n=m=2 时为双二次 B 样条曲面 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 1001 122 121 )2,2()1,2()0,2( )2,1()1,1()0,1( )2,0()1,0()0,0( ]1[4/1),( 2 2 v v PPP PPP PPP uuvuP - - = 该曲面的四条边界是抛物线 3)双三次 B 样条曲面:当 n=m=3 时为双三次 B 样条曲面 10001 1303 4063 1331 )3,3()2,3()1,3()0,3( )3,2()2,2()1,2()0,2( )3,1()2,1()1,1()0,1( )3,0()2,0()1,0()0,0( 0141 0303 0063 1331 ]1[36/1 ),( 2 3 23 v v v PPPP PPPP PPPP PPPP uuu vuP - - -- - - -- = 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 其中,令 0141 0033 0363 1331 ][ - - -- =F , ]1[][ 23 vvvV = , ]1[][ 23 uuuU = 则 ][]][][][[36/1),( VFPFUvuP t= ,其中[P]为 B 特征矩阵且为 16 个网格点 的角点信息。 B 样条曲线的一些几何性质可以推广到 B 样条曲面,图 6-21 是一张双 三次 B 样条曲面片实例。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 6-21 双三次 B 样条曲面片 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 6.5 曲面与曲线编程案例 一、程序设计功能说明 程序为演示本章讲解的各种曲线曲面算法生成的实用程序。如图 6-22 所示为本例程序运行时的主界面,通过单击菜单中及下拉菜单的各功能项 分别完成各种曲线曲面生成。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 6-22 二、程序设计步骤 1. 创建工程名称为“曲线和曲面”单文档应用程序框架 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 2. 编辑菜单资源 设计根据 6.1 表中的定义编辑菜单资源如图 6-11 所示的菜单项。 表 6.1 菜单资源表 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 菜单标 题 菜单项标题 标示符 ID 曲线 三叶梅花线 圆柱螺线 圆锥螺线 三次贝塞尔曲线 三次 B 样条曲线 ID_DRAW_ROSE ID_DRAW_CYLINDER ID_DRAW_CYLINDER_CONE ID_DRAW_3BEZIER ID_DRAW_3BSPLINE 曲面 环形面比 锥面 双线性曲面 旋转曲面 贝塞尔曲面 B 样条曲面 ID_AREA_RING ID_AREA_CONE ID_AREA_LINE ID_AREA_ROTATION ID_AREA_BEZIER ID_AREA_BSPLINE 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3. 添加函数 在工程中添加应用函数的方法,这里我们先在“View.h”中声明需 要使用的函数名称,然后再在“View.cpp”中定义此函数。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com // 曲线和曲面程序代码见纸书 4. 添加消息处理函数 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息 处理函数,ClassName 栏中选择 CMyView,根据表 7.2 建立如下的消息映 射函数,ClassWizard 会自动完成有关的函数声明。 表 7.2 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com ID_DRAW_ROSE ID_DRAW_CYLINDER ID_DRAW_CYLINDER_CONE ID_DRAW_3BEZIER ID_DRAW_3BSPLINE CONMMAN OnDrawRose() OnDrawCylinder() OnDrawCylinder() OnDraw3bezier() OnDraw3bspline() ID_AREA_RING ID_AREA_CONE CONMMAN OnAreaRing() OnAreaCone() 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com ID_AREA_LINE ID_AREA_ROTATION ID_AREA_BEZIER ID_AREA_BSPLINE OnAreaLine() OnAreaRotation() OnAreaBezier() OnAreaBspline() 5. View.cpp 添加完成各个菜单消息处理函数,实现既定功能, // CMyView message handlers 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com void CMyView::OnAreaBezier() {//Bezier 曲面 member=3; beier_draw(); } 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com void CMyView::OnAreaBspline() {//B 样条曲面 程序代码见纸书 } 说明: 1. 为了能够让读者清楚曲面的生成过程,我们在程序中用键盘上 “上”、“下”、“左”、“右”箭头改变参数变量的大小,动态观看 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 参数大小对生成曲面的影响。 2. 以上仅列出 View.h、View.cpp 中的部分代码,其它文件代码全部 为系统维自动建立,无需改正,为 节 省篇幅此处省略,详见光盘。 代码中黑体部分为手工输入。 6.6 课后练习 1. 已知 4 个点型直点:(1.0,2.0)、( 2.5,2.5)、( 4.0,4.5)、( 5.0,4.0), 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 求三次样条曲线。 2. 编程绘制一条二次 Bezier 曲线; 3. 编程绘制一条二次 B 样条曲线; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 第七章 几何造型技术 一般说,几何造型技术研究在计算机中如何表达物体模型形状的技术。在几何造型系统中, 描述物体的三维模型有三种,即线框模型、表面模型和实体模型。线框模型用顶点和棱边来表示 物体,由于没有面的信息,所以不能表示表面含有曲面的物体;另外,它不能明确地定义给定点 与物体之间的关系(点在物体内部、外部或表面上),所以线框模型不能处理许多问题,如不能 生成剖切图、消隐图、明暗色彩图,不能用于数控加工等,应用范围受到了很大的限制。 表面模型用面的集合来表示物体,而用环来定义面的边界。表面模型扩大了线框模型的应用 范围,能够满足面面求交、线面消隐、明暗色彩图、数控加工等需要。但在该模型中,只有一张 张面的信息,物体究竟存在于表面的哪一侧,并没有给出明确的定义,无法计算和分析物体的整 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 体性质,如物体的表面积、体积、重心等,也不能将这个物体作为一个整体去考察它与其它物体 相互关联的性质,如是否相交等。 实体模型是最高级的模型,它能完整表示物体的所有形状信息,可以无歧义地确定一个点是 在物体外部、内部或表面上,这种模型能够进一步满足物体计算、有限元分析等应用的要求。本 章我们主要介绍实体造型技术的有关问题,并简单介绍最近发展起来的分形造型技术。 7.1 实体的表示模型 早期实体造型系统一个共同的特点是用多面体表示形体,不支持精确的曲面表示,优点是数 据结构相对简单,集合运算、明暗图的生成和显示速度快;缺点是同一系统表示不唯一,违背了 几何定义唯一性原则,而且只是近似表示,存在误差,若要提高表示精度就要增加离散平面片的 数量,庞大数据量影响计算速度和计算机的存储管理。早期的几何造型系统还有一个特点,就是 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 只支持正则的形体造型。正则形体集(R-Set)的概念为几何造型奠定了初步的理论基础。对于 任一形体,具有 3 维欧氏空间 中非空、有界的封闭子集,且其边界是二维流形(即该形体是连 通的),我们称该形体为正则形体,否则称为非正则形体。图 7-1 给出了一些非正则形体的实例。 所谓二维流形(2-manifold)是指这样一些面,其上任一点都存在一个充分小的邻域,该邻域与 平面上的圆盘是同构的,即在该邻域与圆盘之间存在连续的一一映射。 对实体模型的表 示基本上可以分为 分解表示、构造表示 和边界表示三大类。 图 7-1 非正则形体 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 7.1.1 分解表示 分解表示是将形体按某种规则分解为小的更易于描述的部分。分解表示的一种特殊形式是每 一小的部分都是一种固定形状(正方形、立方体等)的单元,形体被分解成这些分布在空间网格位 置上的具有邻接关系的固定形状单元的集合,单元的大小决定了单元分解形式的精度。根据基本 单元的不同形状,常用四叉树、八叉树和多叉树等表示方法。 分解表示中常见的表示方法是将形体空间细分为小的立方体单元,在计算机内存中对应开辟 一个三维数组。形体占有的空间,存储单元中为 1;否则空间为 0。这种表示方法简单,容易实 现形体的交、并、差计算,但是占用的存储量太大,物体的边界面没有显式的解析表达式,不便 于运算,实际应用中一般不采用。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 7-2 是八叉树表示形体的一个实例。八叉树法表示形体的过程是这样的,首先对形体定义 一个外接立方体,再把它分解成八个子立方体,并对立方体依次编号为 0,1,2,…,7。如果子 立方体单元已经一致,即为满(该立方体充满形体)或为空(没有形体在其中), 则该子立方体可停止分解;否则,需要对该立方体作进一步分解,再一分为八个子立方体。 在八叉树中,非叶结点的每个结点都有八个分支。八叉树表示法有一些优点,近年来受到人们的 注意。这些优点主要是: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (1)形体表示的数据结构简 单。 (2)简化了形体的集合运算。 对 形体执行交、并、差运算时,只 需 同时遍历参加集合运算的两形体 相应的八叉树,无需进行复杂的求 交 运算。 (3)简化了隐藏线(或面) 的 消除,因为在八叉树表示中,形 体上各元素已按空间位置排成了一 图 7-2 八叉树表示的形体 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 定的顺序。 (4)分析算法适合于并行处理。 八叉树表示的缺点也是明显的,主要是占用的存储多,只能近似表示形体,以及不易获取形 体的边界信息等。 7.1.2 构造表示 构造表示是按照生成过程来定义形体的方法,构造表示通常有扫描表示、构造实体几何表示 和特征表示三种。 · 扫描表示 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 扫描表示是基于一个基体(一般是一 个封闭的平面轮廓)沿某一 路径运动而产生形体。可见,扫描表示 需要两个分量,一 个是被运 动的基体,另一个是基体运动的路径;如果是变截面的扫描,还要 给出截面的变化规律。图 7-3 给出了变截面扫描表示的例子,扫描 体的扫描路径是曲线。 扫描是生成三维形体的有效方法,但是,用扫描变换产生的形体可能出现维数不一致的问题。 另外,扫描方法不能直接获取形体的边界信息,表示形体的覆盖域非常有限。 · 结构体元表示 结构体元 CSG)表示是通过对体元定义、运算得到新形体的表示方法,体元可以是立方体、圆 柱、圆锥等,也可以是半空间,其运算为变换或正则集合运算并、交、差。 图 7-3 变截面扫描 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com CSG 表示可以看成是一棵有序的二叉树,终节点为体元或是形体变换参数。非终结点或为正则 的集合运算或是变换(平移和/或旋转)操作,这种运算或变换只对其直接的子结点(子形体) 起作用。每棵子树(非变换叶子结点)表示其下两个节点组合及变换的结果,几何变换并不限定 为刚体变换,也可以是任意范围的比例变换和对称变换。 CSG 树无二义性,但不是唯一的,它的定义域取决于其所用体元以及所允许的几何变换和正则 集合运算算子。若体元是正则集,只要体元叶子是合法的,就保证了任何 CSG 树都是合法的正则 集。 CSG 表示的优点: 1)数据结构比较简单,数据量比较小,内部数据的管理比较容易; 2)CSG 表示可方便地转换成边界(Brep)表示; 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3)CSG 方法表示的形体的形状,比较容易修改。 CSG 表示的缺点: 1)对形体的表示受体素的种类和对体素操作的种类的限制,也就是说,CSG 方法表示形体的覆 盖域有较大的局限性。 2)对形体的局部操作不易实现,例如,不能对基本体元的交线倒圆角; 3)由于形体的边界几何元素(点、边、面)是隐含地表示在 CSG 中,故显示与绘制 CSG 表示 的形体需要较长的时间。 · 特征表示 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 以 Pro/Engineering 为代表的参数化、变量化的特征造型技术,在几何造型领域产生了深远 的影响。特征技术产生是在以 CSG 和 Brep 为代表的几何造型技术已较为成熟,实际应用中,几 何建模的效率不仅较低,而且需要用户懂得几何造型的一些基本理论的事实上,同时,实体造型 系统需要与应用系统集成在一起,用户对实体模型又提出了更高的要求,推动特征建模的出现。 以机械设计 为例,机 械零件在实体系统 中设计完成以 后,需要进行结构、应力分 析,工艺设计、 加工和检验等。而用户进行 工艺设计时,并 不需要构成形体的点、线、 面这些几何和拓扑信息,而是需要高层的机 械加工特征信息,诸如光孔、螺孔、环形 图 7-4 基于特征的造型系统 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 槽、键槽、滚花等,并根据零件的材料特性,加工特征的形状、精度要求、表面粗糙度要求等, 以确定所需要的机床、刀具、加工方法、加工用量等,传统的几何造型系统远不能提供这些信息, 以至 CAD 与 CAPP(计算机辅助工艺过程设计)成为世界性的难题。 由此可以看出,特征是面向应用、面向用户的。基于特征的造型系统,如图 7-4 所示。特征 模型的表示仍然要通过传统的几何造型系统来实现。不同的应用领域,具有不同的应用特征。一 些著名的特征造型系统(如 Pro/Engineering)除提供了一个很大的面向应用的设计特征库外, 还允许用户自己定义自己的特征,加入到特征库中,为用户进行产品设计和使 CAD 与其它应用系 统的集成提供了极大的方便。 所以,在几何造型系统中,不同应用领域的特征都有其特定的含义,例如机械加工中,提到 孔,我们就会想到,是光孔,还是螺孔,孔径有多大,孔有多深,孔的精度是多少等。特征的形 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 状常用若干个参数来定义,根据特征的参数我们并不能直接得到特征的几何元素信息,而在对特 征及在特征之间进行操作时需要这些信息。特征方法表示形体的覆盖域受限于特征的种类。 7.1.3.边界表示 以上介绍的构造表示通常具有不便于直接获取形体几何元素的信息、覆盖域有限等缺点。边 界表示(Boundary Representation)也称为 BR 表示或 BRep 表示,它是几何造型中最成熟、无 二义的表示法。实体的边界通常是由面的并集来表示,而每个面又由它所在的曲面的定义加上其 边界来表示,面的边界是边的并集,而边又是由点来表示的。边界表示的一个重要特点是在该表 示法中,描述形体的信息包括几何信息(Geometry)和拓扑信息(Topology)两个方面,拓扑信 息描述形体上的顶点、边、面的连接关系,拓扑信息形成物体边界表示的“骨架”,形体的几何 信息犹如附着在“骨架”上的肌肉。例如形体的某个表面位于某一个曲面上,定义这一曲面方程 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 的数据就是几何信息。此外,边的形状、顶点在三维空间中的位置(点的坐标)等都是几何信息, 一般说来,几何信息描述形体的大小、尺寸、位置、形状等。 在边界表示法中,边界表示就按照体-面-环-边-点的层次,详细记录了构成形体的所有 几何元素的几何信息及其相互连接的拓扑关系。在进行各种运算和操作中,就可以直接取得这些 信息。 Brep 表示的优点是: (1)表示形体的点、边、面等几何元素是显式表示的,使得绘制 Brep 表示的形体的速度较 快,而且比较容易确定几何元素间的连接关系; (2)容易支持对物体的各种局部操作; (3)便于在数据结构上附加各种非几何信息,如精度、表面粗糙度等。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com Brep 表示的缺点是: (1)数据结构复杂,需要大量的存储空间,维护内部数据结构的程序比较复杂; (2)Brep 表示不一定对应一个有效形体,通常运用欧拉操作来保证 Brep 表示形体的有效性、 正则性等。 由于 Brep 表示覆盖域大,原则上能表示所有的形体,而且易于支持形体的特征表示等,Brep 表示已成为当前 CAD/CAM 系统的主要表示方法。 7.1.2 形体的边界表示模型 用边界表示法建立三维形体时,经常用到欧拉操作与集合运算,本小节我们对边界表示的数 据结构、欧拉操作及集合运算作一个简单的介绍。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 我们已经知道,边界模型由几何信息和拓扑信息两部分组成,表达形体的基本拓扑实体 (Entity)包括: 1. 顶点 顶点(Vertex)的位置用(几何)点(Point)来表示。点是几何造型中的最基本的元素,自 由曲线、曲面或其它形体均可用有序的点集表示。用计算机存储、管理、输出形体的实质就是对 点集及其连接关系的处理。 2. 边 边(Edge)是两个邻面(对正则形体而言)、或多个邻面(对非正则形体而言)的交集,边有方 向,它由起始顶点和终止顶点来界定。边的形状(Curve)由边的几何信息来表示,可以是直线 或曲线,曲线边可用一系列控制点或型值点来描述,也可用显式、隐式或参数方程来描述。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3. 环 环(Loop)是有序、有向边(Edge)组成的封闭边界。环中的边不能相交,相邻两条边共享 一个端点。环有方向、内外之分,外 环 边 通 常 按 逆 时 针 方 向 排序,内 环 边 通 常 按 顺时针方向排序。 4. 面 面(Face)由一个外环和若干个内环(可以没有内环)来表示,内环完全在外环之内。根据 环的定义,在面上沿环的方向前进,左侧总在面内,右侧总在面外。面有方向性,一般用其外法 矢方向作为该面的正向。若一个面的外法矢向外,称为正向面;反之,称为反向面。面的形状 (Surface)由面的几何信息来表示,可以是平面或曲面,平面可用平面方程来描述,曲面可用 控制多边形或型值点来描述,也可用曲面方程(隐式、显式或参数形式)来描述。对于参数曲面, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 通常在其二维参数域上定义环,这样就可由一些二维的有向边来表示环,集合运算中对面的分割 也可在二维参数域上进行。 5. 体 体(Body)是面的并集。在正则几何造型系统中,要求体是正则的,非正则形体的造型技术 将线框、表面和实体模型统一起来,可以存取维数不一致的几何元素,并可对维数不一致的几何 元素进行求交分类,从而扩大了几何造型的形体覆盖域。 7.1.3.1 欧拉操作 欧拉公式表达为对于任意的简单多面体,其面(f)、边 (e)、顶点(v)的数目满足公式 2=++ fev 。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 对于任意的正则形体,引入形体的其它几个参数:形体所有面上的内孔总数(r)、穿透形体的 孔洞数(h)和形体非连通部分总数(s),则形体满足公式: rhsfev +-=++ )(2 。 欧拉公式给出了形体的点、边、面、体、孔、洞数目之间的关系,在对形体的结构进行修改时, 必须要保证这个公式成立,才能够保证形体的有效性。由此而构造出一套操作,称为欧拉操作, 完成对形体部分几何元素的修改,修改过程中保证各几何元素的数目保持这个关系式不变。 7.1.3.2 集合运算 集合运算是实体造型系统中是一种非常有效的构造形体的方法。从一维几何元素到三维几何 元素,正则形体和非正则形体,针对不同的情况和应用要求,有许多集合运算算法。 1.集合运算算法 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 正则集合运算与非正则形体运算的区别在于增加了正则化处理步骤。集合运算算法包括以下 几部分: (1)求交:参 与 运 算的一个形体的各拓扑元素求交,求交的顺序采用低维元素向高维元素进行。 用求交结果产生的新元素(维数低于参与求交的元素)对求交元素进行划分,形成一些子元素。 这种经过求交步骤之后,每一形体产生的子拓扑元素的整体相对于另一形体有外部、内部、边界 上的分类关系。 (2)成环:由求交得到的交线将原形体的面进行分割,形成一些新的面环。再加上原形体的悬 边、悬点经求交后得到的各子拓扑元素,形成一拓扑元素生成集。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com (3)分类:对形成的拓扑元素生成集中的每一拓扑元素,取其上的一个代表点,根据点/体分 类的原则,决定该点相对于另一形体的位置关系,同时考虑该点代表的拓扑元素的类型(即其维 数),来决定该拓扑元素相对于另一形体的分类关系。 (4)取舍:根据拓扑元素的类型及其相对另一形体的分类关系,按照集合运算的运算符要求, 要决定拓扑元素是保留还是舍去;保留的拓扑元素形成一个保留集。 (5)合并:对保留集中同类型可合并的拓扑元素进行合并,包括面环的合并和边的合并。 (6)拼接:以拓扑元素的共享边界作为其连接标志,按照从高维到低维的顺序,收集分类后保 留的拓扑元素,形成结果形体的边界表示数据结构。 7.2 求交分类 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 在几何造型中,通常利用集合运算(并、交、差运算)实现复杂形体的构造,而集合运算需 要大量的求交运算。如何提高求交的实用性、稳定性、速度、精度等,对几何造型系统至关重要。 当前几何造型系统,大多采用精确的边界表示模型。在这种表示法中,形体的边界元素和某 类几何元素相对应,它们可以是直线、圆(圆弧)、二次曲线、Bezier 曲线、B 样条曲线等,也 可以是平面、球面、二次曲面、Bezier 曲面、B 样条曲面等,求交情况十分复杂。,二次曲面与 各种自由曲面并存的混合表示模型,逐渐为人们所接受。 7.2.1 求交分类 在几何造型系统中,用到的几何元素主要有以下 25 种,这些几何元素可以按照其维数分为三 大类:点、线、面。 点:三维点。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 线:三维直线段、二次曲线(包括圆弧和整圆、椭圆弧和椭圆、抛物线段、双曲线段)、 Bezier 曲线 (有理和非有理)、B 样条曲线、NURBS 曲线。 面:平面、二次曲面(包括球面、圆柱面、圆锥/台面、双曲面、抛物面、椭球面和椭圆柱面)、 Bezier 曲面 (有理和非有理)、B 样条曲面、NURBS 曲面。 求交方法分为点点、点线、点面、线线、线面六种。点只有三维点一种,比较简单。线和面 又可分别归为二次曲线、自由曲线和二次曲面、自由曲面两类。 7.2.2 基本的求交算法 计算机内浮点数的误差,求交计算引进容差。假定容差为 e,则点被看成是半径为 e 的球,线 被看成是半径为 e 的圆管,面被看成是厚度为 2e 的薄板。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 点与其它几何元素的求交比较简单,计算两个点是否相交,实际上是判断两个点是否重合, 判断点和线(或面)是否相交,实际上是判断点是否在线(或面)上。 我们重点讨论线与线的求交及线与面的求交。根据前面的分类方法,线与线的求交有二次曲 线与二次曲线、二次曲线与自由曲线及自由曲线与自由曲线求交三种。线与面的求交有二次曲线 与二次曲面、二次曲线与自由曲面、自由曲线与二次曲面及自由曲线与自由曲面求交四种。 7.2.2.1 线与线的求交计算 1.二次曲线与二次曲线的求交 二次曲线在非退化的情况下,也称为圆锥曲线(椭圆、双曲线和抛物线)。由于圆锥曲线在 其标准(局部)坐标系下具有标准的隐式方程和参数方程的形式,因而,这种求交策略是将坐标 系变换到该圆锥曲线的局部坐标系下,一个圆锥曲线用隐式方程的形式表示,而另一圆锥曲线采 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 用参数方程的形式,代入即可获得有关参数的四次方程,四次代数方程具有精确的求根公式,因 而可计算出二者的交点。 2.二次曲线与 NURBS 曲线求交 自由曲线( Bezier 曲线、B 样条曲线和 NURBS 曲线)可 用 NURBS 方法统一表示。二次 曲线与 NURBS 曲线求交,可 将 NURBS 曲线的参数方程代入 圆锥曲线的隐式方程,得到 参数的一元高次方程,然后, 使用一元高次方程的求根方 法解出交点参数,或把圆锥曲线也表示为参数形式,转化 为两个 NURBS 曲线的求交问题。 3.NURBS 曲线与 NURBS 曲线求交 图 7-5 NURBS 曲线与 NURBS 曲线迭 代求交 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 解决这类求交问题,通常采用离散法求初始交点,迭代求精确解的办法,具体求解步骤如下: (1)初始化。依据离散精度,将 NURBS 曲线形成对应的二叉树表示,叶子结点是对应于该曲 线的某一离散子线段及其包围盒,非叶子结点是对应于该段 NURBS 曲线的包围盒。 (2)求初始交点。遍历两曲线的二叉树,若其叶子结点的包围盒相交,则将两者的数据(曲 线段中点的参数值,二者坐标的平均值)存入初始交点队列。 (3)将初始交点迭代求精确交点。迭代方程可形象地用图 7-5 表示。 计算过程为:设初始交点为 ,其中 Q0 是初始点的空间坐标,s0.t0 则分别为两 NURBS 曲线的初始交点参数值,将 Q0 投影至两曲线上,得两点(P0,s1),(P1,t1),,可得另一更精确初 始点 ,依次可得 和 ,直至 P2n 与 P2n+1 两点间的距离小于 e 为止。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 7.2.2.2 线与面的求交计算 与自由曲线的表示类似,自由曲面(Bezier 曲面、B 样条曲面和 NURBS 曲面)可用 NURBS 方 法统一表示。二次曲线与 NURBS 曲面的求交计算通常转化为 NURBS 曲线与 NURBS 曲面的求交计算 的问题。 二次曲线与二次曲面的求交的求交计算,可以把二次曲线的参数形式代入二次曲面的隐式方 程,得到关于参数的四次方程,然后用四次方程的求根公式,计算出交点的参数。 NURBS 曲线与二次曲面的求交计算,可以把 NURBS 曲线的参数形式代入二次曲面的隐式方程, 得到关于参数的高次方程,然后,用高次方程的求根方法求解。 下面重点介绍 NURBS 曲线与 NURBS 曲面的求交计算,计算过程叙述如下: 1.初始化。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 依据离散精度,将 NURBS 曲线离散成二叉树的形式,将 NURBS 曲面离散成四叉树的形式。四 叉树的叶子结点是 NURBS 曲面的子曲面片,并存储其包围盒的坐标,非叶子结点记录对应子面片 的包围盒。 2.求初始交点。 遍历该二叉树和四叉树,如果曲线二叉树叶子结点的包围盒与曲面四叉树的叶子结点的包围 盒有交点,则将子曲线段中点的参数值、子曲面片的中心点的坐标值与参数值作为初始交点,记 录入初始交点点列中去。 3.对初始交点进行迭代,形成精确交点。 可用牛顿迭代法求解精确交点。设 NURBS 曲线为 C(t),NURBS 曲面为 S(u,v),则在交点处应 满足: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com C(t)-S(u,v)=0 设 f(u,v,t)=C(t)-S(u,v),则问题转化为求函数 f(u,v,t)的根。 两边同时叉积 ,并考虑到 ,得到: 两边再点积 ,并考虑到 ,得到: 类似可得到: 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 令 ,则可建立迭代方程: 设初值为 ,一般迭代 3 至 5 次,便可达到要求的精度。 7.2.2.3 曲面与曲面的求交 在几何元素之间的求交算法中,曲面与曲面之间的求交是最为复杂的一种。曲面与曲面求交 的基本方法主要有代数方法、几何方法、离散方法和跟踪方法四种,下面分别作一个简单的介绍。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 1.代数方法 代数方法是利用求解代数方程的方法求出曲面的交线。对于一些简单的曲面求交,如平面和 平面,平面和二次曲面,可以直接通过曲面方程求解计算交线,对于某些复杂的情况,则需要进 行分析和化简的运算后求解。 根据表示曲面的方程的形式可以将曲面分为隐式表示和参数表示两种类型。隐式表示的曲面 为 f(x,y,z)=0,参数表示的曲面为 r = r(u,v)。所以,根据参与求交的两曲面的表示形式的不 同,可以把求交分为三种情况。 (1)隐式表示和参数表示的情形,把参数方程代入隐式方程的方法,将交线表示为 g(u,v)=0 的形式,得到的交线方程是平面代数曲线方程,根据平面代数曲线理论的方法求解交线。求解的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 过程是先构造特征初始点(边界点、转折点和奇异点),这可用数值方法求解方程组得到,特征 电把交线分成若干单调段,从特征初始点出发可求出每一单调段。 (2)两个曲面都是参数表示的情形,只需要将其中之一隐式化,然后用前面的方法求解。而 参数多项式或有理多项式曲面的隐式化通过消元来实现。 (3)两个曲面都是隐式曲面的情形,一种方法是将其中一个曲面参数化,也可用第一种情况 来求解。但是,一般情况下这种参数化很困难,对于某些情况可以采用另外的方法计算参数化的 曲面。 代数法还有一个严重的弱点是对误差很敏感,这是因为代数法经常需要判别某些量是否大于 零、等于零或小于零,而在计算机中的浮点数近似表示的误差常常会使这种判别出现错误,而且 这种误差会随着运算步骤的增多而不断扩大。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 2.几何方法 几何方法求交是利用几何的方法,对参与求交曲面的形状大小、相互位置以及方向等进行计 算和判断,识别出交线的形状和类型,从而可精确求出交线。对于一些交线退化或相切的情形, 交线往往是点、直线或圆锥曲线,用几何方法求交可以更加迅速和可靠。几何求交适应性不是很 广,一般仅用于平面以及二次曲面等简单曲面的求交。 3.离散方法 离散方法求交是利用分割的方法,将曲面不断离散成较小的曲面片,直到每一子曲面片均可 用比较简单的面片,如 四 边形或三角形平面片来逼近,然后用这些简单面片求交得一系列交线段, 连接这些交线段即得到精确交线的近似结果。离散求交一般包括下面的过程:用包围盒作分离性 检查排除无交区域;根据平坦性检查判断是否终止离散过程;连接求出的交线段作为求交结果。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 由于 Bezier 曲面,B 样条曲面具有离散性质,使得它们最适合于离散法求交。离散法求出的 交线逼近精度不高。如果要求的精度较高,需要增加离散层数。 4.跟踪方法 跟踪方法求交是通过先求出初始交点,然后从已知的初始交点出发,相继跟踪计算出下一交 点,从而求出整条交线的方法。 跟踪法的本质是构造交线满足的微分方程组,先求出满足方程组的某个初值解,通过数值求 解微分方程组的方法来计算整个交线。 跟踪方法在计算相继交点的时候,利用了曲面的局部微分性质,一般采用数值迭代的方法求 解,使得计算效率较高。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 跟踪法求交中要考虑的主要问题包括:如何求出初始交点并保证每一交线分支都有初始交点 被求出;如何计算奇异情况下的跟踪方向以及合理选取跟踪的前进步长;如何处理相切的情况。 以上几种方法是曲面求交中常采用的几种基本方法。在实际应用中,往往根据具体应用的需 要,采用这些方法的结合来实现求交,如在跟踪法中的初始交点常采用离散法求得。 7.3 图形相交-相切程序设计案例 一、程序功能说明 求交在实体造型中有着重要的地位,实际设计图形软件系统相切也很重要,这里我们设计几 种典型二维、三维图形相交或相切的程序实例。如图 7-6 所示为本例程序运行时的主界面,通过 单击菜单中及下拉菜单的各功能项。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 7-6 二、程序设计步骤 1. 创建工程名称为“图形相交-相切”单文档应用程序框架 2. 编辑菜单资源 设计根据 7.1 表中的定义编辑菜单资源如图 7-3-1 所示的菜单项。 表 7.1 菜单资源表 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3. 添加函数 和变量 在工程中 添加应用函数的 方法,这里我们先在“View.h” 中 声 明 需要 使用的函数名 称,然后再在 “View.cpp”中定 义此函数。 菜单标题 菜单项标题 标示符 ID 线段相交 直线与圆相 交 直线与圆相 切 圆与圆相交 ID_LINE_LINE ID_LINE_CIERCLE1 ID_LINE_CIRCLE ID_CIRCLE_CIRCLE 组合体交线 平面截圆柱体 平面截圆锥体 ID_PLANE_CYLINDER ID_PLANE_CONE 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com // 曲线和曲面 View.h : interface of the CMyView class //////////////////////////////////////// 程序代码见纸书 } . . . 4. 添加消息映射 利用 ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName 栏中选择 CMyView,根据表 7.2 建立如下的消息映射函数,ClassWizard 会自动完成有关的函数 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 声明。 表 7.2 菜单项的消息处理函数 菜单项 ID 消息 消息处理函数 ID_LINE_LINE ID_LINE_CIERCLE1 ID_LINE_CIRCLE ID_CIRCLE_CIRCLE CONMMAN OnLineLine() OnLineCiercle1() OnLineCircle() OnCircleCircle() ID_PLANE_CYLINDER ID_PLANE_CONE CONMMAN OnPlaneCylinder() OnPlaneCone() 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 5. View.cpp 添加完成各个菜单消息处理函数,实现既定功能 void CMyView::OnLineLine() { RedrawWindow(); PushNum=1; CDC*pDC=GetDC(); //获得绘图类指针 pDC->TextOut(0,5,"用鼠标右键在窗口取选取四个点,当鼠标右键按下第 5 次求交点"); ReleaseDC(pDC); } 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com void CMyView::OnLineCiercle1() { 程序代码见纸书 } 7.4 非传统造型技术上面介绍的基于欧氏几何的传统实体 造型技术的主要描述工具是直线、平滑的曲线、平面及边界整齐的平滑曲面,这些工具在描述一 些抽象图形或人造物体的形态时是非常有力的,但对于一些复杂的自然景象形态就显得无能为力 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 了,诸如山、树、草、火、云、波浪等。这是由于从欧氏几何来看,它们是极端无规则的。为了 解决复杂图形生成问题,分形(Fractal)造型应运而生。 7.4.1 基本概念 1904 年,由 Helge Von Koch 研究了一种称为雪花的图案,他将一个等变三角形的三条边三等 分,中间的一段隆起另一个小三角形,这小三角形依照上面的操作,如此一直下去,理论上可 证明能够构成一个面积有限,而边长为无穷长的雪花,这与传统数学上的观点不相符,成为一 种新的造型技术。 假设用一只 1 000m 的尺子测量不列颠的海岸线,可得到一个长度值 L1,若要考虑更多细节, 可用更短的尺子,例如 1m 的尺子测量,同时得到另一个长度 L2,显然 L2〉L1,一般,尺子长 度为 r,测量结果为 L(r),若 r→0,则有 L(r) →∞,也就是说,不列颠的海岸线长度与测量的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 尺子有关,为不确定数。Mandelbort 正是通过上述实例向人们展示细节的无穷回归和测量尺度 的减小都会得到更多的细节,既复杂现象的自相似性,并提出分形(Fractal)概念。 设每一步细分的数目为 N,细分放大(缩小)倍数为 S,则分数维 D 定义为: )/1(/)(log SLogND = 对于上述 Koch 雪花,N=4,S=1/3,雪花边数的分数维 D=1.2619。 一般二维空间中的一个分数维曲线的维数介于 1 和 2 之间;三维空间的一个分数维曲线维数 在 2、3 之间,分数维概念的提出维研究复杂性体提供了新的视角,使人们从无序中发现了有序, 为许多科学领域提供新的应用工具。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 7.4.2 分形造型对模型的基本要求 分数维图形是由一片陌生而美妙的画面组成的,不 是 由 画家精 心创造的,而是由数学家探索绘制出来的,可用计算机停在屏幕上用明暗点绘图来遨游这一世界。 生成图形的关键是要有合适的模型来描述图案。分形造型对模型的基本要求: 1.分形造型技术能逼真地“再现”自然景象。所谓逼真是指从视觉效果上逼真,“再现”即不要 求完全一致。 ⒉ 模型不依赖于观察距离。即距离远时可给出大致轮廓和一般细节,距离近时能给出更丰富 细节。 ⒊ 模型说明应尽量简单,模型应具有数据放大能力。 ⒋ 模型应便于交互地修改。 ⒌ 图形生成的效率要高。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com ⒍ 模型适用范围应尽可能地宽。 7.4.3 分形造型的常用模型 为有效模拟海岸线和山等自然景象,引进随机插值模型。 传统的绘制图形模型都与观察距离有关,随机插值模型部实现规定各种图素和尺度大小、数 图 7-7 用随机模型构造海岸线的例子 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 量,用一个随机过程的采样路径作为模型的方法,避免了观察距离的局限性。例如,构建二维海 岸线的模型,如图首先选择控制大致形状的若干初始点,然后取相邻两点连线的中垂线上随机偏 移一段距离,再将偏移后的点与两端点分别连成两条线段,这样一直画下去,可得到一条曲折的 有无穷细节回归的海岸线,其曲折程度由随机偏移量控制,同时决定了分数维的大小。在三维坐 标系中,同样道理可构造山的模型,如图 7-8 所示。 2.粒子系统模型 粒子系统模型是 1983 年为模拟火焰由 W.T.Reeves 提出的。粒子系统模型用大量粒子图元来 描述景物,粒子的位置和形状随时间变化,并由随机数决定。火焰可被看成是喷出的许多粒子, 众多粒子运动轨迹构造了火焰的模型,用随机数决定每个粒子的属性(如初始位置、初始速度、 颜色、大小等)。 现 在 该 模型由用来描述草丛、森林等景象。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 7.5 分形造型应用 在日常生活中,花瓶、茶具等器皿以及商品的包装等表面大多都有魅力的花纹图案。分形图 的特点就是“奇”、“美”,用分形图作为器皿的花纹图案,即把分形图映射到器皿表面称为一种 图案设计,会产生很好的设计效果,称为分形图映射。 纹理图案及映射是计算机绘图的热点,纹理图案是指物体的表面细节。通常考虑两种类型的 纹理图案。第一种是在光滑表面上描绘纹理图案,第二种是使表面呈现出凹凸不平的形状。映射 中的关键技术是映射后图形不能失真。映射出现的失真简单说包括两个方面:表面展开程度和映 射函数,前者属于图形的内在特性,不可改变。这样要减小失真只有选择合适的映射函数。映射 函数即被映射的纹理图案和映射物体表面纹理图案间的一一对应关系。一般映射前的纹理图案在 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 一个二维坐标系中,映射后的图案绘制在三维坐标系中,因此映射前后对应关系应为二维点与三 维点之间的对应关系。 例如,对于圆柱面和圆锥面两种映射物体表面,虽然二者使可展开面,但是对于圆柱体表面, 在直角坐标系中,通过线性映射或三角函数映射可将一个二维图不失真产生的映射到表面上,但 用同样方法映射到圆锥体表面要产生很大失真,我们可把圆锥体切分成许许多多个近似圆柱体来 进行映射,这样产生的失真将大大减小。对于一个不可展开面,一般很难找到不失真的映射函数。 根据上述理论,将一些分型图映射到正方体、圆柱体和球的表面上可产生漂亮的美术图案。 分型图映射的过程实质上就是图形(或图案)得分块、旋转、平移等变换形成的。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 7.6 分形造型编程设计 一、程序功能说明 分数分图形的许多领域还未开发,而且富于幻想色彩,引人入胜,可以模拟天际的积云,空 中的闪电、地上的森林、海里的浪花、燃烧的火焰等,特别是近年来在分形图中的应用,可以设 计地板、壁纸等。我们这里根据上述分形造型及分形图映射理论设计如下“分形图”应用程序, 如图 7-9 所示,点击【分形图】菜单绘制龙状曲线,又称龙图,它由一条直线段开始,然后隆起 变成等腰直角三角形的两腰,其斜边为该直线长,在对两腰分别做和直线段同样的变化,如此动 态进行数此,得到一条龙状曲线。在【球体映射】中把上述龙形图案映射到球表面,形成纹理贴 图。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 7-9 二、程序设计步骤 1. 建工程名称为“分形图”单文档应用程序框架。 2. 根据 7.3 表中的定义编辑菜单资源,添加消息映射,建立消息映射函数完成有关的函数声 明。 表 7.3 菜单资源表 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 3. 4. 5. 3 工添加绘图基类 添加基类方法请参见第一章手工添加绘图基类。这里添加两个基类:BaseDraw 和 Dragon。并 在工作区中系统自动创建的相应的空文件中,分别添加以下基类的头文件(.h 文件)和应用文件 (.cpp 文件) // BaseDraw.h: interface for the CBaseDraw class.// BaseDraw 头文件 #if !defined(AFX_BASEDRAW_H__CB43CA20_175A_11D4_81FF_94DCC6655E1C__INCLUD 菜单标题 子菜单项标题 标示符 ID 相应处理函数 分形图 绘制龙图 ID_DRAW_DRAGON OnDrawDragon() 分形图应用 球体映射 ID_SPHERE_ DRAGON OnSphereDragon() 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com ED_) #define AFX_BASEDRAW_H__CB43CA20_175A_11D4_81FF_94DCC6655E1C__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define pi 3.141592654 class CBaseDraw { 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 程序代码见纸书 } 7.6 课 后 练 习 1. 什么叫几何造型?有那三种模式?各有什么特点? 2. 比较 CSG 域 B-rep 方法的优缺点? 3. 分形造型对模型的基本要求?分形造型的常用模型? 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 4. 根据分形造型原理,自己设置或上网查找一些分形图案设计,加深对分形造型的理 解。 5. 利用 BaseDraw 基类设计圆柱体上的龙的贴图。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 第八章 消隐 因为计算机图形处理的过程中,不会自动消去隐藏部分,相反会将所有 的线和面都显示出来,所以如果想真实显示三维物体,必须在视点确定之 后,将对象表面上不可见的点、线、面消去。执行这种功能的算法,称为消 隐算法。根据消隐对象的不同可分为:线消隐 (Hidden-line)和面消隐。 8.1 线消隐 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 2 线消隐处理对象为线框模型,是以场景中的物体为处理单元,将一个物 体与其余的 k-1 个物体逐一比较,仅显示它可见的表面以达到消隐的目 的。此类算法通常用于消除隐藏线。1. 凸多面体的隐藏线消隐 凸多面体是由若干个平面围成的物体。假设这些平面方程为 aix+biy+ciz+di=0, i=1, 2, …, n (8.1) 物体内一点 P0(x0, y0, z0 )满足 aix0+biy0+ciz0+di<0,平面法向量(ai, bi, ci)指向 物体外部的。此凸多面体在以视点为顶点的视图四棱锥内,视点与第 i 个面 上一点连线的方向为(li, mi, ni)。那么第 i 个面为自隐藏面的判断方法是: (ai, bi, ci)×(li, mi, ni)>0 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 3 对于任意凸多面体,可先求出所有隐藏面,然后检查每条边,若相交于 某条边的两个面均为自隐藏面,根据任意两个自隐藏面的交线,为自隐藏 线,可知该边为自隐藏边(自隐藏线应该用虚线输出)。 2. 凹多面体的隐藏线消隐 凹多面体的隐藏线消除比较复杂。•假设凹多面体用它的表面多边形的 集合表示 ,消除隐藏线的问题可归结为:一条空间线段 P1P2 和一个多边 形 a,判断线段是否被多边形遮挡。如果被遮挡,求出隐藏部分。以视点为 投影中心,把线段与多边形顶点投影到屏幕上,将各对应投影点连线的方程 联立求解,即可求得线段与多边形投影的交点。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 4 如果线段与多边形的任何边都不相交,则有两种可能,线段投影与多边 形投影分离或线段投影在多边形投影之中,前一种情况,线段完全可见。后 一种情况,线段完全隐藏或完全可见。然后通过线段中点向视点引,若此射 线与多边形相交,相应线段被多边形隐藏;否则,线段完全可见。 若线段与多边形有交点,那么多边形的边把线段投影的参数区间[0, 1]分 割成若干子区间,每个子区间对应一条子线段(如图 8-1 所示),每条子线段 上的所有点具有相同的隐藏性,如图所示。为进一步判断各子线段的隐藏 性,首先要判断该子线段是否落在该多边形投影内。对于子线段与多边形的 隐藏关系的判定方法与上述整条线段与多边形无交点时的判定方法相同。图 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 5 8-1 线段投影被分为若干子线段 把上述线段与所有需要比较的多边形依次 进行隐藏性判断,记下各条边隐藏子线段的位置,最后对所有这些区域进行 求并集运算,即可确定总的隐藏子线段的位置,余下的则是可见子线段。 8.2 面消隐 面消隐(Hidden-surface)处理对象为填色图模型,是以窗口内的每个像素 为处理单元,确定在每一个像素处,场景中的物体哪一个距离观察点最近 (可见的), 从而用它的颜色来显示该像素。此类算法通常用于消除隐藏 面。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 6 8.2.1 区域排序算法基本思想:在图像空间中,将待显示的所有多边形按深 度值从小到大排序,用前面可见多边形去切割后面的多边形,最终使得每个 多边形要么是完全可见,要么是完全不可见。用区域排序算法消隐,需要用 到一个多边形裁剪算法。当对两个形体相应表面的多边形进行裁剪时,我们 称用来裁剪的多边形为裁剪多边形,另一个多边形为被裁剪多边形。算法要 求多边形的边都是有向的,不妨设多边形的外环总是顺时针方向的,并且沿 着边的走向,左侧始终是多边形的外部,右侧是多边形的内部。若两多边形 相交,新的多边形可以用“遇到交点后向右拐”的规则来生成。于是被裁剪多 边形被分为两个乃至多个多边形;我们把其中落在裁剪多边形外的多边形叫 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 7 作外部多边形;把落在裁剪多边形之内的多边形叫作内部多边形。 算法的 步骤: (1) 进行初步深度排序,如可按各多边形 z 向坐标最小值(或最大值、 平均值)排序。 (2) 选择当前深度最小(离视点最近)的多边形为裁剪多边形。 (3) 用裁剪多边形对那些深度值更大的多边形进行裁剪。 (4) 比较裁剪多边形与各个内部多边形的深度,检查裁剪多边形是否是 离视点最近的多边形。如果裁剪多边形深度大于某个内部多边形的深度, 则恢复被裁剪的各个多边形的原形,选择新的裁剪多边形,回到步骤⑶再 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 8 做,否则做步骤⑸。 (5) 选择下一个深度最小的多边形作为裁剪多边形,从步骤⑶开始做, 直到所有多边形都处理过为止。在得到的多边形中,所有内部多边形是不 可见的,其余多边形均为可见多边形。8.2.2 深度缓存(Z-buffer)算法 深度缓存(Z-buffer)是一种在图像空间下的消隐算法,包括:帧缓冲器 – 保存各像素颜色值(CB);z 缓冲器 --保存各像素处物体深度值(ZB)。其中 z 缓冲器中的单元与帧缓冲器中的单元一一对应。 深度缓存(Z-buffer)思路:先将 z 缓冲器中个单元的初始值置为-1(规范视 见体的最小 n 值)。 当要改变某个像素的颜色值时,首先检查当前多边形的 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作www.cadedu.com 9 深度值是否大于该像素原来的深度值(保存在该像素所对应的 Z 缓冲器的 单元中),如果大于,说明当前多边形更靠近观察点,用它的颜色替换像素 原来的颜色;否则说明在当前像素处,当前多边形被前面所绘制的多边形遮 挡了,是不可见的,像素的颜色值不改变。Z-buffer 算法的步骤如下: ⑴ 初始化 ZB 和 CB,使得 ZB(i, j)=Zmax,CB(i, j)=背景色。其中,i=1, 2, …, m,j=1, 2, …, n。 ⑵ 对多边形 a,计算它在点(i, j)处的深度值 zi, j。 ⑶ 若 zij【资源…】,打开〖插入资源〗对话框, 选择【Bitmap】单击【确定】按钮,利用绘图工具,在当前应用程序中, 绘制 Bitmap1 如图 10-5-2 所示。以同样方法添加 Bitmap2、Bitmap3、 Bitmap4、Bitmap5 帧图片资源。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com Bitmap1 Bitmap2 Bitmap3 Bitmap4 Bitmap4 图10-2 5. 在“帧动画 View.cpp”、“帧动画 View.cpp”、帧动画相应函数 添加如下代码 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 说明:下面仅列出帧动画 View.h、帧动画 View.cpp 的部分代码,黑体 部分为手工输入其它文件代码全部为系统维自动建立,无需改正,为节省 篇幅此处省略,详见光盘。 // 帧动画 View.h : interface of the CMyView class . . 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com . 程序代码见纸书 } 10.4.2 实时动画 三、程序设计功能说明 根据以上实时动画原理创建的计算机实时动画程序,演示一弹性小球在 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 正方体容器中的碰撞过程,如图 10-3 所示为程序运行时的主界面的一个瞬 间。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 图 10-3 四、程序设计步骤 1. 创建名称为“实时动画”单文档应用程序框架(创建单文档 详细过程请参见第一章) 2. 利用 MFC ClassWizar 对话框,【ClassName】和【Object IDs】 中均选择 CMyClass,建立 WM_CREATE、WM_ DESTROY WM_TIMER 消息处理函数分别为 OnCreate()、OnDestroy()、 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com OnTimer() 3. 手工添加绘制球的基类 在工程中单击【文件】|【新建】,在弹出的新建对话框中,选择 C/C++ Header File,在【文件】名称输入栏中输入“Sphere”;同样,在工程中单 击【 文 件 】|【 新 建 】,在 弹 出的新建对话框中,选择 C++ Source File,在【 文 件 】名称输入栏中输入“Sphere”。在工作区中系统自动创建的相应的空文 件中,分别添加以下此基类的头文件(.h 文件)和应用文件(.cpp 文件)。 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com // Sphere.h: interface for the CVirtualSphere class. #ifndef _CVSPHERE_H #define _CVSPHERE_H class CSphere { 程序代码见纸书 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com } } 4. 在“实时动画 View.h”、“实时动画 View.cpp”相应函数添加如下代 码 说明:下面仅列出实时动画 View.h、实时动画 View.cpp 的全部代码, 其它文件代码全部为系统维自动建立,无需改正,为节省篇幅此处省略, 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 详见光盘。下面代码中黑体部分为手工输入,其它代码为系统生成。 // 实时动画 View.h : interface of the CMyView class . . . class CMyView : public CView { 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 程序代码见纸书 } 10.6 练习题 1. 传统动画和计算机动画的区别? 2. 计算机动画研究的内容?目前主要应用领域? 3. 关键帧动画与算法动画? 《计算机图形学原理及算法教程》(Visual C++版)和青芳 清华大学出版社出版 业搜---www.yeaso.com CAD 教育网制作 www.cadedu.com 4. 利用分别应用帧动画和实时动画原理,在 Visual C++中编程绘制在 高速公路上奔跑的小汽车。
还剩622页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 4 人已下载

下载pdf

pdf贡献者

1030786966

贡献于2010-09-28

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf