




已阅读5页,还剩323页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学 第一章 绪论第二章 基本图形生成原理第三章 图形几何变换第四章 多边形及多边形填充算法第五章 图案及动画程序设计第六章 裁剪算法第七章 自由曲线 第一章 绪论 1 1 概述1 2 计算机图形学的发展1 3 计算机图形学的应用1 4 计算机图形系统1 5 计算机图形标准 1 1概述 1 1 1计算机图形学的概念计算机图形学ComputerGraphics是一门新兴学科 国际标准化组织ISO定义为 计算机图形学是一门研究通过计算机将数据转换成图形 并在专门显示设备上显示的原理方法和技术的学科 它是建立在传统的图学理论 应用数学及计算机科学基础上的一门边缘学科 1 1 2计算机图形学的研究内容 1 基于图形设备的基本图形元素的生成算法 2 图形元素的几何变换 3 自由曲线和曲线的插值 拟合 拼接 分解 过渡 光顺 整体和局部修改等 4 三维几何造型技术 5 三维形体的实时显示 6 真实感图形的生成算法 7 山 水 花 草 烟云等模糊景物的模拟生成和虚拟现实环境的生成 8 科学计算可视化和三维或高维数据场的可视化 1 1 3计算机图形学与图象处理的关系 计算机图形学的基本含义是使用计算机通过算法和程序在显示设备上构造出图形来 也就是说 图形是人们通过计算机设计和构造出来的 不是通过摄象机和扫描仪等设备输入的图象 所设计和构造的图形可以是现实世界已经存在的物体的图形 也可以显示完全虚构的物体 因此 计算机图形学是真实的物体或虚构物体图形的综合技术 与此相反 图象处理是景物或图象的分析技术 它所研究的是计算机图形学的逆过程 图象增加 模式识别 景物分析 计算机视觉等 并研究如何从图象中提取二维或三维物体的模型 尽管计算机图形学和图象处理所涉及的都是用计算机来处理图形和图象 但是长期以来却属于不同的两个技术领域 近年来 由于多媒体技术 计算机动画 三维空间数据场显示及纹理映射等的迅速发展 计算机图形学和图象处理的结合日益紧密 并相互渗透 1 2计算机图形学的发展 1 2 1计算机图形学的发展简史 年代准备阶段 年代发展阶段 年代推广应用阶段 年代系统实用化阶段 年代标准化智能化阶段 1 2 2计算机图形学的发展方向造型技术的发展真实图形生成技术的发展人 机交互技术的发展模拟艺术的仿真计算机动画 1 3计算机图形学的应用 1 用户接口2 计算机辅助设计与制造 CAD CAM 3 地形地貌和自然资源图4 计算机动画和艺术5 科学计算可视化6 游戏 1 4计算机图形系统 计算机图形系统硬件计算机图形系统软件计算机图形显示原理光栅扫描式图形显示器 1 5计算机图形标准 GKSPHIGSCGMCGI 第二章 基本图形生成原理 2 1直线的生成2 2圆与椭圆的生成 2 1直线的生成 2 1 1数值微分法 DDA法 2 1 2中点画线法2 1 3Bresenham画线算法2 1 4Turboc2 0图形函数介绍 2 1 1数值微分法 直线方程y k x b 给出线段的两个端点 x1 y1 和 x2 y2 可以算出k和bk y x y2 y1 x2 x1 b y1 k x1再用setpixel x int y 0 5 color 输出该系统的颜色值便可画出直线 但是画线效率太低 这是因为每步都需浮点乘法运算和一个四舍五入 数值微分算法的描述对任何沿直线给定的x的增量 x 可以从下中计算出y的增量 y k x 同样可以得出对应于指定的 x y k 当对于斜率的绝对值 k 1的线段怎么实现呢 算法演示 2 1 2中点画线法 那么 下一个与直线最近的像素只能是正右方的p1 或右上方p2 用空心小圆表示 再以M表示P1与p2的中点 即M 又设Q是理想直线与垂线交点 显然 若M在Q的下方 则p2离直线近 应取为下一个像素 否则应取p1 这就是中点画线法的基本原理 为了讨论方便 这里假定直线斜率在0 1之间 其它两种情况可参照下述讨论进行相应处理 如图所示 若直线在x方向增加一个单位 则在y方向的增量只能在0 1之间 假设直线上当前已确定的一个像素点坐标为 xp yp 用实心小圆表示 G 算法推导 下面我们来讨论中点画线算法的实现 假设直线的起点和终点分别为 x1 y1 和 x2 y2 则直线方程为F x y a x b y c 0 其中 a y1 y2 b x2 x1 c x1 y2 x2 y1 对于直线上的点F x y 0 对于直线上方的点F x y 0 对于直线下方的点F x y 0 因此 欲判前述Q在M的上方还是下方 只要把M代入F x y 并判断它的符号 构造判别式d F M F a b c 当d0 则应取正右方的p1 当d 0是 二者一样合适 可以随便取一个 我们约定取正右方的p1 对每一个象素计算判别式d 根据它的符号确定下一象素 由于d是xp和yp的线性函数 可采用增量计算 以便提高运算效率 在d 0的情况下 取正右方的象素p1 欲判断再下一个象素应取哪个 应计算d1 F 2 0 5 a 2 b 0 5 c a 1 b 0 5 c a d a故d的增量为a 而若d 0 则取右上方象素p2 要判断再下一个象素 则要计算d2 F 2 1 5 a 2 b 1 5 c a 1 b 0 5 c a b d a b故在第二种情况 d的增量为a b 再看d的初始值 显然 第一个象素应取左端点 x1 y1 相应的判别式值为d0 F 1 0 5 a 1 b 0 5 c a x1 b y1 c a 0 5 b F x1 y1 a 0 5 b但由于 x1 y1 在直线上 故F x1 y1 0 因此d的初始值为d0 a 0 5 b 由于我们使用的只是d的符号 而且d的增量都是整数 只是其初始值包含小数 因此 我们可以用2d代替d 来摆脱小数 写出仅包含整数运算的算法 voidMidpointLine x1 y1 x2 y2 color intx1 y1 x2 y2 color inta b d1 d2 dx y a y1 y2 b x2 x1 d 2 a b d1 2 a d2 2 a b x x1 y y1 setpixel x y color while x x2 If d 0 x y d d2 else x d d1 setpixel x y color 2 1 3Bresenham画线算法 算法分析 算法推导 可视化效果图 2 1 4图形环境的设置 include graphics h 图形方式初始化函数 initgraph gdriver gmode path gdriver 是一个空型指针 用来指定要装入的图形驱动程序 该值在头文件中定义 gmode 是一个空型指针 用来指定显示模式path 图形驱动程序所在的路径 若用VGA图形驱动程序 图形显示模式为VGAHI 则调用方式如下 intgdriver gmode gdriver VGAgmode VGAHIinitgraph 关闭图形方式函数为closegraph 直线类绘图函数line x1 y1 x2 y2 lineto x y moveto x y line dx dy 几个直线段组成的图形 图一 图二 2 2圆与椭圆的生成 由于圆是图形和图像中经常使用的元素 因此在大多数图形软件中都包含有生成圆和圆弧的过程 也会提供一个既能显示圆曲线 又能显示椭圆曲线的绘图函数 2 2 1圆的特性圆被定义为所有离一中心位置 xc yc 距离为给定值r的点集 可用如下方程式表示 x xc 2 y yc 2 r2 利用这个方程 我们可以沿x轴从xc r到xc r以单位步长计算对应的y值来得到圆周上每点的位置 y yc r2 xc x 2 但这并非是生成圆的最好方法 这个方法的第一个问题是每一步包含很大的计算量 第二个问题是所画像素位置间的间距是不一样的 在靠近x轴的0o 180o处像素点之间的间距越来越大 当然可以在圆斜率的绝对值大于1后 交换x和y 即步进y值 计算x值 来调整间距 但这样增加了算法所需的计算量和处理过程 另一种消除不等间距的方法是使用极坐标r和 来计算沿圆周的点 以参数极坐标形式表示圆方程可得到方程组 使用上述方法以固定角度为步长生成显示时 圆就可沿圆周等距点绘制出来 但这个方法使用了三角函数调用和浮点运算 运算速度太慢 必须寻找只需做一些简单的整数运算和判别运算的方法即可确定圆上的象素点的算法 考虑到圆的对称性可以减少计算量 只要能生成8分圆 那么圆的其它部分可以通过一系列的简单映射变换得到 如图所示 假设已知一个圆心在原点的圆上一点 x y 根据对称性可得另外七个8分圆上的对应点 y x y x x y x y y x y x x y 因此 只需讨论8分圆的生成算法 另外 为了方便起见 我们只考虑中心在原点 半径为整数R的圆x2 y2 R2 对于中心不在原点的圆 可先通过平移变换 化为中心在原点的圆 再进行扫描转换 把所得的像素坐标加上一个位移量即得所求像素坐标 2 2 2中点画圆法 考虑中心在原点 半径为R的圆的第二8分圆 我们来讨论如何从 0 R 到 R R 顺时针的确定最佳逼近于该圆弧的像素序列 假定当前已确定了一个象素点为p xp yp 那么下一个象素只能是正右方的p1 xp 1 yp 或右下方的p2 xp 1 yp 1 如图所示 构造函数 F x y x2 y2 R2对于圆上的点 F x y 0 对于圆外的点 F x y 0 而对于圆内的点F x y 0 假设M是P1和P2的中点 即M xp 1 yp 0 5 那么当F M 0时 p2离圆弧更近 应取p2 当F M 0时 在p1与p2之中随便取一个即可 我们约定取p2 与中点画线法一样 构造判别式d F M F xp 1 yp 0 5 xp 1 2 yp 0 5 2 R2当d 0 则应取p1为下一象素 而且再下一个象素的判别式为d F xp 2 yp 0 5 xp 2 2 yp 0 5 2 R2 d 2xp 3 p1 所以 沿正右方 d的增量为2xp 3 而若d 0 则p2是下一象素 而且下一象素的判别式为 d F xp 2 yp 1 5 xp 2 2 yp 1 5 2 R2 d 2xp 3 2yp 2 d 2 xp yp 5 所以 沿右下方向判别式d的增量为2 xp yp 5 由于我们这里讨论的是用顺时针方向生成第二个8分圆 因此第一个象素点是 0 R 判别式d的初值为 d0 F 1 R 0 5 1 R 0 5 2 R2 1 25 R 由于使用了浮点数来表示判别式d 为了简化运算 摆脱浮点数 在算法中全部使用整数 我们使用e d 0 25代替d 显然 初始化运算d 1 25 r对应于e 1 r 判别式d 0对应于e 0 25 算法中其它与d有关的式子可把d直接换成e 又由于d的初值为整数 且在运算过程中的增量也是整数 故e始终是整数 所以e 0 25等价于e 0 至此 可以写出完全用整数实现的中点画圆算法 算法中e仍用d来表示 圆算法演示 椭圆算法演示 上述算法还可以进一步改进 以提高效率 注意到判别式d的增量是x y的线性函数 每当x递增1 d递增 x 2 每当y递减1 d递增 y 2 由于初始象素为 0 r 所以 x的初值为3 y的初值为 2r 2 再注意到乘2运算可以改用加法实现 因此可写出不含乘法 仅用整数实现的中点画圆算法 读者可自己修改此算法 画圆函数 circle x y r x y为圆心坐标 r为半径ellipse x y as ae rx ry 说明 x y为椭圆的中心坐标 as ae为椭圆弧的起始角和终止角度 rx ry为x方向和y方向的半轴长arc x y as ae r 说明 x y为圆心坐标 as ae为圆弧起始角和终止角 r为半径 由弧组成的图形 圆环 肾形 一 图形的基本要素及其表示方法体是由若干面构成 而面则由曲线组成 线是点的轨迹 因此构成图形的基本要素是点 第三章图形几何变换 第一节几何变换的方法 在解析几何中 点可以用向量表示 在二维空间中可以用 x y 表示平面上的一点 在三维空间中则用 x y z 表示空间一点 因此 可以用点的集合 点集 来表示一个平面图形或三维立体 写成矩阵的形式为 x1y1X2y2 xnyn x1y1z1x2y2z2 znynxn 这样便建立了平面图形和空间立体的数学模型 x1 y1 x2 y2 x3 y3 x4 y4 x1y1X2y2X3y3X4y4 平面图形 二点的变换 在计算机图形学应用中 常常要进行诸如比例 对称 旋转 平移 投影等各种变换 既然图形可以用点集来表示 也就是说点集定了 则图形也就确定了 那么 如果点的位置改变了 图形也就随之改变 因此 要对图形进行变换 只要变换点就可以了 由于点集可用矩阵的方式来表示 因此对点的变换可以通过相应的矩阵运算来实现 即 旧点集x变换矩阵新点集 变换的基础是矩阵乘法 规则Aik Bkj Cij 第二节二维基本变换 ab若 x y 为变换前的坐标 cd为变换矩阵 则有 x y ab ax cy bx dy x y cd这里 x y 为变换后的坐标 变换矩阵中a b c d可取不同值 可以实现各种不同的变换 从而达到对图形进行变换的目的 一比例变换 在变换矩阵中中 令b c 0 则比例变换矩阵 其中a d分别为x y方向上的比例因子 a d 0 讨论 若a d 1 为恒等变换 即变换后点的坐标不变 若a d 1 则为等比变换 变换结果是图形等比例放大 a d 1 后等比例缩小 a d 1 如下图 1 所示 原三角形ABC给放大2倍后为三角形A B C xy A B C ABC 10 20 30 10 20 30 40 A B C A C B 1 40 x y 10 20 30 40 10 20 30 40 若a d 则变换后图形将变形 如图 2 原三角形ABC经下式变换后成为A B C x y ABC A B C 2 二 对称变换 1 对坐标轴的对称变换点对x轴对称变换有 x x y y 变换矩阵为 即点对y轴对称应有 x x y y 则变换矩阵为 即 对坐标轴变换后的图形见下图 1 10 20 10 20 1 2 对原点对称变换 点对坐标原点对称变换应有 x x y y 则变换矩阵即变换的图形见下图 A C 3 对45 线的对称变换 点对45 线的对称变换即让x y互换坐标 x y y x 变换矩阵为 即 对 45 线的对称变换 应有x y y x 变换矩阵为 对 45 和 45 的对称变换的图形如下图 三 错切变换 令 且c b之一为0 则 1 沿x轴错切令b 0 沿x向错切的变换矩阵为 则 经此变换后 y坐标不变 x坐标有一增量cy 这就相当于原来平行于y轴的线向x方向错切成与y轴成 角的直线 且有tg y cy 1 c 当c 0时沿 x向错切 c 0时 沿 x向错切 设c 2 对三角形ABC进行错切变换得 ABC A B C xy 2 沿y轴方向错切令c 0 则 x y 设b 2 对三角形ABC进行错切变换得 ABC A B C xy x y 变换的结果是 x坐标不变 而y坐标产生一增量bx 使原来平行于x轴的线倾斜 角且tg x bx 1 b 当b 0时 沿 y方向错切 b 0时 沿 y方向错切 四 旋转变换 假定图形的旋转是绕坐标原点旋转 角 逆时针方向为正 顺时针方向为负 变换矩阵则对点进行旋转变换 对三角形ABC进行旋转变换 60 ABC xy x y A B C 五 平移变换与齐次坐标上述四种变换都可以通过变换矩阵那么它是否适合于平移变换呢 若实现平移变换 变换前后的坐标必须满足下面的关系 x x xy y y这里 x y是平移量 应为常量 但是应用上述变换对点进行变换 这里的cy bx均为非常量 因此用原来的2X2的变换矩阵是无法实现平移变换的 我们把2X2矩阵扩充成3X2矩阵 即令 K m是平移量 这样又带来新的问题 二维图形的点集矩阵是nx2的 而变换矩阵是3x2的 根据矩阵乘法的规则 他们是无法相乘的 为此 我们把点向量也做扩充 将 x y 扩充为 x y 1 即把点集矩阵扩充为nx3阶矩阵 这样 点集矩阵与变换矩阵即可进行乘法运算 令变换矩阵中b c 0 a d 1 就得到平移变换矩阵 则有这里k m分别为x y方向的平移量 为了使二维变换矩阵具有更多的功能 可将3x2变换矩阵进一步扩充为3x3阶矩阵 即 则平移变换矩阵为 如令k 10 m 10 对三角形ABC做平移变换 得 ABC x y A B C 20 10 10 20 A B C A B C 在上述讨论中 我们将 x y 扩充为 x y 1 实际上是由二维向量变为三维向量 但 x y 1 可以看作是z 1平面上的点 也就是说 经此扩充后 图形落在z 1的平面上 它对图形的形状没有影响 这种用三维向量表示二维向量的方法叫做齐次坐标法 进一步推广 用n 1维向量表示n维向量的方法称之为齐次坐标法 二维变换实例 图形顶点表 图形连边表 1 2 3 4 5 6 7 8 第三节二维组合变换 上述的五种变换可用统一的变换矩阵形式实现 我们把它们叫做基本变换 但是有些变换仅用一种基本变换是不能实现的 必须由两种或更多种基本变换组合才能实现 这种由多种基本变换组合而成的变换称之为组合变换 相应的变换矩阵叫做组合变换矩阵 一 绕任意点旋转变换 平面图形绕任意点p Xp Yp 旋转 角 需要通过以下几个步骤来实现 1 将旋转中心平移到原点 变换矩阵为 2 将图形绕坐标原点旋转 角 变换矩阵为 3 将旋转中心平移回到原来点的位置 变换矩阵为 因此 绕任意点的旋转变换矩阵为 显然 当Xp 0 Yp 0时 即为对原点的旋转变换 二 对任意直线的对称变换设任意直线的方程为Ax By C 0 直线在x轴和y轴上的截距分别为 C A和 C B 直线与x的夹角为 arctg A B 对任意直线的对称变换有以下几个步骤来完成 1 平移直线 使其通过原点 可以沿x轴平移 也可沿y轴平移 这里以沿x轴平移为例 变换矩阵为 2 绕原点旋转 使其与x轴重合 变换矩阵为 3 对x轴对称变换 其变换矩阵为 4 绕原点旋转使直线回到原来与x轴成 的位置 变换矩阵为 5 平移直线 使其回到原来的位置 变换矩阵为 通过上述5个步骤 即可实现图形对任意直线的对称变换 其组合变换矩阵为 综上所述 复杂变换是通过基本变换的组合而成的 由于矩阵的乘法不适用于交换律 即 因此组合的顺序一般是不能颠倒的 顺序不同 则变换的结果亦不同 以平移变换与旋转变换的组合为例 1 先进行平移变换 再进行组合变换 2 先进行组合变换 再进行平移变换 从变换矩阵T1和T2可以看出 前者变换最后的平移是受旋转变换的影响 后者变换后的平移量则不受旋转变换的影响 如下图所示 取平移量l 15 m 15 旋转角度 90 对ABC分别进行变换得 A C B A C B A C B A C B 变换矩阵T1 先平移再旋转 变换矩阵T2 先旋转再平移 ABC A B C A B C ABC 第四节三维基本变换 一 三维基本变换矩阵1 变换矩阵三维图形的变换是二维图形的简单扩展 变换的原理还是把齐次坐标点 x y z 1 通过变换矩阵变换成新的齐次坐标点 x y z 1 与前面讨论的类似 在三维空间里 用四维齐次坐标 x y z 1 表示三维点 三维变换矩阵则用4x4阶矩阵表示 即 x y z 1 T x y z 1 其中T为三维基本变换矩阵 可以把三维基本变换矩阵划分为四块 其中产生比例 对称 错切 旋转等基本变换 产生平移变换 产生透视投影变换产生全比例变换 2 坐标系在三维变换中 我们采用右手坐标系 习惯上人们一般采用下图的左手坐标系 且规定 物体绕各坐标旋转的正方向对右手的螺旋方向 x z y 二 比列变换比例变换矩阵为 其中a e j分别为沿x y z轴方向的比例因子 对点进行比例变换 x y z 1 Ts ax ey jz 1 x y z 1 三 对称变换三维对称变换包括对原点 对坐标轴和对坐标平面的对称 常用的是对坐标平面的变换 我们对此加以讨论 1 对xoy平面的对称变换变换矩阵 2 对xoz平面的对称变换变换矩阵 3 对yoz平面的对称变换变换矩阵 四 错切变换错切变换是指三维立体沿x y z三个方向错切 错切变换是画斜轴测图的基础 其变换矩阵为 由变换结果看出 一个坐标的变化受另外的两个坐标变化的影响 1 沿x轴含y错切变换矩阵 错切变换 2 沿x含z错切变换矩阵 错切变换 3 沿y含x错切变换矩阵 错切变换 4 沿y含z错切变换矩阵 错切变换 5 沿z含x错切变换矩阵 错切变换 6 沿z含y错切变换矩阵 错切变换 五 旋转变换 1 绕x轴旋转 角 2 绕y轴旋转 角 3 绕z轴旋转 角六 平移变换 第五节空间立体图的投影变换 一 概述 一 什么是投影变换 为什么要投影 投影是将n维的点变换成小于n维的点 这一部分只介绍三维到二维平面的几何投影 即将立体坐标变换成平面坐标 因为显示器和绘图仪是平面设备 设备坐标只有x y 要显示图形 就要将第三个坐标去掉 如何去掉一个坐标 投影 二 平面几何投影的分类投影可分为两大类 即透视投影和平行投影 他们的本质区别在于透视投影的投影中心到投影平面之间的距离是有限的 而平行投影的投影中心到投影面之间的距离是无限的 当投影中心在无限远时 投影线互相平行 所以定义平行投影时 给出投影线的方向就可以了 而在透视投影时 需要明确地给出投影中心的位置 下面给出各类投影之间的逻辑关系 投影透视投影平行投影一点透视二点透视三点透视正投影斜投影三视图正轴测 主视图 侧视图 俯视图 斜等测 斜二测 等轴测 正二测 正三测 1 平行投影平行投影不具有透视缩小性 能精确地反映物体的实际大小 平行线的平行投影仍是平行线 平行投影可根据投影方向与投影角的夹角分成两类 正投影和斜投影 当投影方向与投影面的夹角为90 时 得到的投影为正投影 否则为斜投影 投影方向 投影平面 投影平面法向 法向 投影平面 正投影根据投影面与坐标轴的夹角 可分成两类 1 三视图和 2 正轴测 当投影面与某一坐标轴垂直时 得到的投影为三视图 这时投影方向与这个坐标轴的方向一致 否则 得到的投影为正轴测 2 三视图工程制图中常用到的三视图 是由空间一个立体向三个互相垂直的投影面做正投影得到的 这个正交的投影面分别为 正投影面 v面 侧面投影面 w面 水平 投影面 h面 这三个面对应的三个坐标平面分别为 xoz平面 yoz平面和xoy平面 1 正投影视图正投影视图是将立体向正面投影面 xoz坐标平面 作正投影得到的 投影的结果是一坐标轴为0 仅保留了x轴和z轴两个方向上的坐标 变换矩阵为 即 2 侧投影视图立体侧投影图的形成过程是 先将立体向侧面投影面做正投影 x坐标取0 然后将投影面绕z轴选择90 使其与正面投影处于同一平面 最后使图像沿x轴负向平移一个距离d1 使正投影图和侧投影图之间保持一个距离 变换全过程 变换结果为 x y z 1 x y z 1 Tw y d1 0 z 1 3 水平面 h面 投影变换矩阵将立体向h面 z 0 做垂直投影 再使得到的投影绕x轴旋转90 最后沿z向平移 n n 0 以使其与正投影面处于同一平面 使水平投影图和正面投影图拉开一个距离 变换过程为 变换结果为 x y z 1 Th x 0 y d3 1 x y z 1 设立体图的点集矩阵为 Dj 各投影图之间的距离为10 求立体的三面投影 已知 解 1 正面投影 2 水平投影 3 侧面投影 用变换后的 画出的三视图如下图 x z 4 4 2正轴测投影图 轴测图是一种简单的立体图形 能给人一种直观的形象 以帮助建立空间的概念 由于它的绘制方法比较简单 所以在工程制图中经常用到 1 正轴测投影图的形成过程是这样的 先将空间一立体绕z轴正向旋转 角 然后再绕x轴反向旋转 角 最后让经过两次旋转后的立体向正立投影面做正投影 整个形成过程可以用矩阵表示为 式子中 和 均取大于0的值 上面的矩阵T是经过3个单步简单矩阵变换的级联形成的 它是一个正轴测投影交换矩阵的一般形式 因此 只要任意给定一组 和 角 代入矩阵T 就可以产生一种正轴测投影矩阵 由此 可用以生成正轴测投影图 在正轴测变换过程中 x y z 1 xyz1 T xcos ysin 0 sin xsin ycos zcos 1 从上式可以看到 交换的结果使y坐标为0 所以对于一般的二维坐标系来说 y坐标就相应于现在的z坐标 2 正等测和正二测正等轴测投影图和正二等轴测投影图是正轴测投影图中常用的两种 其中正等测用手工绘制方法简便 正二测的立体感较好 但手工绘制方法没有正等测方便 当用计算机来生成的时候 就不存在方法上的差别 区别只是变换矩阵中的元素值不同而已 1 正等测的变换矩阵任一组 和 的角 可以产生一种正轴测投影变换矩阵 当取 45o 35o16 时 代入矩阵T 就可以得到正等轴测投影的变换矩阵T 2 正二测的变换矩阵 形成正二等轴测投影的一组角度 和 的取值为 20o42 19o28 将此 和 的值代入正轴测矩阵 便可得到正二测的变换矩阵 3 轴测图的编程步骤 下面 我们通过一个简单的立体例子 来说明设计和编写绘制轴测图的绘图程序的步骤 设所需绘制的立体如下图 则工作步骤如下 在草纸上绘制出草图 并确定各顶点的序号和相应顶点的坐标值 建立顶点表和边表 如下二个表 在程序中定义两个数组 用于定义顶点表和连边表 通过数组的初始化给两个数组赋初值 实施对立体进行正轴测投影变换 即用正轴测投影变换矩阵顶点表实现 这样 可以得到一个变换后的新的顶点表 用新顶点表的顶点坐标值 注意此时只有x坐标轴和z坐标轴 y坐标轴已在投影中消掉 所以是以x坐标为绘图的x坐标 以z坐标为绘图的y坐标 按连边表中的连边规则 用line函数在顶点之间两两连线 在绘图程序中要注意两点 在建立立体坐标时 为了取顶点坐标值简便 我们把立体的一个顶点放置在坐标的原点 所以 整个轴测投影变换后的图形是以该原点为中心 但图形输出时的中心应以屏幕中心为宜 比如 对于VGA来说 这个中央点在 320 240 处 该绘图程序目前只能按连边表把立体的所有棱边都画出来 而不考虑是否可见 即没有经过消除隐藏线处理 四 透视投影图1 透视变换矩阵在前面讲的三维变换矩阵中 已经说过 所产生透视投影的效果 现在我们来具体讨论 当其中的p q r三个参数为非全0时 这样的变换矩阵会对变换产生什么样的影响 1 一点透视先设q 0 p r 0 然后对点 x y z 1 进行变换 结果如下 对其结果进行齐次化处理 得 当y取值不同时 上式会产生如下不同的结果 当y 0时 得 而原来处于y 0的平面内的点 经过变换以后没有变化 当y 时 得 这说明 当y 时 所有的点的变换结果都集中到了y轴上的1 q处 即所有平行与y轴的直线最终延伸将相交 0 1 q 0 的点 该点称为 灭点 而象这样形成的一个灭点的透视变换称为 一点透视 为了取得较好的效果 我们取q 0 让灭点位于y轴的负半轴上 一点透视的效果如下 根据同样的道理 当p 0 q r 0时 则将含在x轴上的1 q处产生一个灭点 其坐标值为 1 q 0 0 在这种情况下 所有平行于x轴的直线将延伸交于该点 当r 0 p q 0时 产生的一个灭点位于z轴上的1 r处 灭点的坐标为 0 0 1 r 所有平行与这轴的直线将延伸交于该点 2 多点透视根据一点透视的原理予以推广 如果在p q r三个元素中有两个为非零元素时 这将会产生两个灭点 因此得到两点透视 经过齐次处理结果为 从以上结果可以得到 当x 时 一个灭点在x轴上的1 p处 当z 时 另一个灭点在z轴上的1 r处 这时 立体上所有平行于x轴的棱线 延伸时将相交于x轴上点 0 0 1 r 处 同理 当p q r三个元素全为零时 结果将会产生三个灭点 从而形成三点透视 产生的三个灭点分别在x轴上的1 p处 y轴上的1 q处和z轴的1 r处 2 生成透视投影图的方法生成透视投影图的过程分为两步 先是对立体进行透视变换 然后是将其投影到正面投影面上 形成投影面上 形成正投影图 用矩阵形式表示为 1 一点透视图的生成在生成一点透视图时 为了避免把图所属立体安置在坐标系的原点而产生如下图所示的透视效果 z x o x z o 通常是在进行透视投影变换前 先将立体平移到一个合适的位置 然后再进行透视投影变换 使得产生的透视图效果较好 生成一点透视投影的变换矩阵为 当d1 d2 d3和q取确定的非零值后 该矩阵中包含的三个透视变换参数中有一个为非零 所以该变换矩阵能产生一点透视图 在q的取值时 一般取 1 q 0 以获得较好的透视图形效果 2 二点透视图的生成两点透视图的生成过程是 先将立体绕z轴旋转一个 角 以使得立体上的xoz坐标平面和yoz坐标平面与正面投影面产生一定的倾斜角 然后在对立体进行透视变换并向正面投影面进行投影 因此 二点透视也角 成角透视 二点透视投影图的形成过程用矩阵形式表示为 从该变换矩阵中可以看到 矩阵中的三个透视变换参数中有两个为非0 即qsin 和qcos 故生成的透视图为两点透视 3 三点透视投影图的生成分以下四步 a 先将立体绕z轴选择正 角 b 再将立体绕x轴取向选择 角 0 c 进行透视变换 d 往正投影面进行正投影 用矩阵的形式表示这个变换过程为 从以上的变换矩阵T可以看到 矩阵中的三个透视变换参数均非0 因此可以变换生成三点透视图 第四章 多边形及多边形填充算法 在这一节中将讨论图形系统中的新图元 多边形 研究有关多边形的概念以及如何表示多边形 学习如何判断一个点是否在多边形内的方法 以及多边形填充的各种方法 一 多边形的概念 所谓多边形 就是用一系列首尾相连的线段构成图形 这些组成多边形边界的线段称为多边形的边 多边形的边的端点称为多边形的顶点 一般来说 一个多边形应是封闭的 1 凸多边形与凹多边形 多边形又分为两大类 凸多边形与凹多边形 所谓凸多边形 是指这样一类多边形 如果在多边形内任找两个点 将这两个点用线段连接后 此线段上所有的点都在多边形内 这就是凸多边形 而凹多边形就是非凸多边形 下面给出了凸多边形与凹多边形的例子 可见 三角形总是凸多边形 凸多边形 凹多边形 2 多边形的描述 考虑到多边形的特征属性 顶点和边 在描述多边形时 既要指明组成多边形的顶点 又要指出组成多边形的边 一般来说 用顶点的序列来表示多边形 其中的边即指两顶点所构成的线段 这样来表示的多边形如下 图中多边形顶点序列为p1p2p3p4p5p6p7 可以根据这种方法写出在计算机上绘制多边形的算法 draw polygon intN intp N 2 if N 2 return elsefor i 1 i N i line p i 0 p i 1 p i 1 0 p i 1 1 line p 1 0 p 1 1 p N 0 p N 1 二多边形的填充 1 点是否在内部的检验 p5 S3 s4 2连贯性原理 梯形的两底边分别在y yk和y yk 1两条扫描线上 腰在多边形p的边上或在显示屏幕的边界上 区域的连贯性 Yk 1 yk 这些梯形分为两类 一类位于多边形内部 图中粉色部分 另一类位多边形外部 两类梯形在长方形区域上相间排列 即相邻的两个梯形必有一个在多边形内 一个在多边形外 交点数为偶数 相邻交点间的线段也分为两类 一类线段上所有点均在多边形内部 另一类线段上所有点均在多边形外部 两类线段在扫描线上相间排列 扫描线的连贯性对于多边形与扫描线y yk相交 交点序列x1 x2 x3 x4 x5 x6由连贯性可知 此交点序列具有下列性质 边的连贯性 三 多边形填充算法 1 扫描线算法 扫描线算法的步骤为 在EL中找出非空元素的最小序号 将边的活化链表置空 按从下至上的顺序分别处理每一条扫描线 直到边的分类表EL和边的活化链表均为空为止 处理扫描线步骤为 对于扫描线y yc 若EL中非空 则将其所有的边从EL中取出 并且插入到边的活化链表中 并将AEL中各边按x递增顺序 若相对于当前扫描线 边的活化链表AEL非空 则将AEL中的边两两依次配对 即第1 2边为一对 第3 4边为一对 依次类推 每一对边与当前扫描线交点所构成的线段位于多边形内 依次将这些线段上的点进行着色 将边的活化链表中满足y ymax的边删去 将边的活化链表AEL中剩下的每一条边的x域累加 x 即x x x 将当前的扫描线的纵坐标y累加1 即y y 1 重复执行 2020 3 16 165 可编辑 种子填充算法 将种子象素压入栈 当栈非空时a 从堆栈弹出一个象素 b 将该象素置成所要求的色彩值 c 检查当前每个象素邻接的四连接象素是否是边界色或已置成所要求的色彩值 若是则返回 否则将该象素压入堆栈后再回到 多边形填充函数 1 drawpoly画多边形drawpoly n pt n是多边形顶点数 pt是多边形顶点坐标数组名2 fillpoly画并填充一多边形fillpoly n pt 3 floodfill填充一个有界区域floodfill x y bcolor x y填充区域内的一点坐标 bcolor填该域边界颜色4 setfilllstyle pallern color 设置填充模式和颜色 扫描线种子填充算法步骤 1 从包含种子象素的栈中弹出种子象素2 沿着扫描线对种子象素左右象素进行填充 直到遇到边界象素为止 这样就将种子所在的扫描线中元素填充 3 区间内最左最右元素为xleft xright 则在xleft x xright中检查与当前扫描线相邻的上 下两条扫描线是否全为边界象素或正填充过的象素 若不是 则对于xleft x xright 把每一区间的最右象素作为种子压入堆栈中算法结束条件为栈空 此算法适用于边界定义的区域 区域填充算法 扫描线填充算法 种子填充算法 边缘填充算法 4 连通边界填充算法 4 连通边界填充算法 2 8 连通边界填充算法 8 连通泛填充算法 第五章图案及动画程序设计 第一节 图案程序设计第二节 动画程序设计 第一节图案程序设计1 构造功能模块的原则 1 独立性 3 开放性 2 抽象性 4 继承性 2 正多边形子程序的设计 1 顶点定位的正凸多边形a 选择绘图参数对于一个任意的正多边形来说 如下图所示 p1 p2 p3 p4 p0 x0 y0 它所需要的定形参数为 边数n n不能小于3 边长a 定位参数为 定位顶点Po的坐标 x0 y0 起使边的倾角 给定了这两组参数 就可以唯一地确定一个任意位置 形状和大小的正多边形 但在绘图程序中 必须把这两组参数转化为具体的绘图用数据 根据图形中的几何关系 可以列出计算机正多变形各顶点坐标的算式 其中 2 n b 编写汇编绘图程序根据以上的分析和数据的准备 下面便可以着手编写绘制任意正多边形的程序 图形程序见程序2 4 其中 函数polygon为绘制任意正多边形的通用绘图程序 函数中有5个形参 X0 Y0定位顶点坐标 A正多边形边长 n正多边形边数 af起始边与x轴正向的夹角 2 以外接圆圆心定位的正多边形a 选择绘图参数利用正多边形的外接圆这种方法中 定形参数为 边数n n不能小于3 外接圆半径R 定位参数为 外接圆圆心坐标 x0 y0 起始点半径的倾角 根据以上给定的参数 同样可以列出计算多边形各顶点坐标的算式 其中 2 n b 编写绘图程序 3 正凹多边形子程序所谓正凹多边形 即通常所称的多角形 如下图所示的五角形和六角形 p3 p5 p1 p7 p9 p4 p2 p6 p8 p10 五角形 六角形 也就是说 N角形有2N个顶点 顶点分别位于外接圆和内接圆圆周上 称作外顶点和内顶点 若奇数点为外顶点 则偶数点一定为内顶点 当一个N角形的外接圆半径R已知时 其内接圆半径R通过下面的推到求得 抽出三角形P oP 2 2N N N 4 N p2 p1 o 在三角形op1p2中 p1op2 op1p2 2所以 p1op2 p1op2 op1p2 N 4 N N N 2 2N 因此 根据多角形的外顶点N 外接圆半径R 第一个顶点的其实角 及中心点O的坐标 x0 y0 就可编出正凹多边形的程序 算法实例 程序1 分形图形 程序2 程序3 程序4 方块旋转 动画1 动画2 动画3 第六章 裁剪算法 第一节窗口和裁减第二节直线的裁减第三节多边形的裁减第四节窗口视区变换 第一节窗口和裁减 窗口裁减覆盖 xl yb xr yt 窗口 剪裁的应用包括 1 从定义的场景中抽取出用于观察的部分 2 在三维视图中标识出可见面 3 防止线段或对象的边界混淆 4 用实体造型来创建对象 5 显示多窗口的环境 6 允许选择图形的一部分来进行拷贝 移动和删除 第二节直线段的剪裁 被剪裁的可以有各种不同类型的图形元素 比如点 线段 圆弧 字符以及多边形 剪裁判断的依据是一对不等式 通过它们可以测定点 x y 是否落在窗口内 xl x xryb y yt 剪裁方法 只要逐点比较每个点的坐标值 xi yi 看其是否同时满足不等式组时 才能确定该点是落在窗口内的 否则是在窗口外的 对于任意一条直线 它相对于一个正定义的窗口的位置关系不外乎有四种情况 直线在窗口外a 直线包含在窗口内b 直线段和窗口的一条边框相交c 直线贯穿整个窗口fe 归纳可得出一个结论 对于任意一条直线 它要么被排除在窗口外 要么在窗口内留下一个可见段 并且只有一个可见段 因为一个直线段可以用它的两个端点唯一确定 所以 要确定一条直线段上位于窗口以内的可见段 仅需求得它的两个可见端点就行 算法演示 一 cohen sutherlanol算法 编码剪裁算法 算法包括两部分 第一部分是先判断该直线是否完全位于窗口以内 如果是 则输出线段 过程结束 如果不是 那么进而判断该直线段是否完全位于窗口之外 如果是 去除该线段无输出 过程结束 如果以上两种测试都不满足进入第二部分 第二部分 首先把直线分两段 然后对每一段进行上述第一部分的两个测试 算法所依据的是这样一个事实 即每条线段要么全部落在窗口边框之内 要么可以被分成两段 使得其中有一段因完全处于窗口之外而被排除掉 采用编码裁减的步骤如下 编码 对给定的直线两端点进行编码 a计算端点坐标和窗口边界之差b用每次差运算结果的符号位来设置区域代码的对应位置 也就是说 第一位是x w1符号位 第二位是w2 x的符号位 第二位是y w3的符号位 第四位是w4 y的符号位 A 按组这种方法a点的代码为 四位 第一位 x w1结果为负所以为1 第二位 w2 x结果为正 所以为0 第三位 y w3结果为正 所以为0 第四位 w4 y结果为正 所以为0 即a的代码为0001同样b点的代码为0000 1001100010100001窗口0010010101000110 判别 一旦所有线的端点编码都已建立 就能很快决定哪些位于窗口内 哪些位于窗口外 这有三种情况 a 线段两端点都在窗口内 两端点编码均为0000 b 线段两端点都在窗口外 两端点编码均不为0000 c 线段一端点在窗口内 只有一个编码为0000 剪裁原则 a全部位于窗口内的线段 其两个端点的编码均为0000 这条线段一定可以画出 b如果一条线的两个端点的编码在相同位置上的值都为1 该线段完全在窗口之外 应当全部删除 比如一个端点的区域码为1001 而另一个端点的区域码0101它的两个端点都在窗口左边 其编码的第一位为1 应把它删掉 这个测试可以用 与 操作实现 将两个编码进行 与 如果结果不为0000 这条直线位于窗口之外 C 如果 与 的结果为0 则还有三种情况 如右图中的p3p4 p5p6 p7p8三条线段 求交 循环测试剪裁 二 矢量裁减算法 若线段a满足下列条件之一即 max x1 x2 wxr 或max y1 y2 wyt 则a在窗口外 无输出 剪裁过程结束 x2 y2 x1 y1 wxlwxr 1 0 2 3 4 5 6 7 8 若a满足 wxl x1 wxrwyb y1 wyt 则a的讨论在0区域内 即可见线段的新起点坐标为 否则 a与窗口的关系其新起点 xs ys 的求解过程如 若x1 wxl 即起点可能在3 4 5区 此时与窗口的左边界求交 令 xs wxlys y1 wxl x1 y2 y1 x2 x1 xs x1ys y1 若x1 wxr 即a的起始点可能在6 7 8区 此时可用 类似的步骤求出a与窗口边界的交点 若 x1 x2 在一二区 则分别用式2和式3求出a与上 下窗口的交点 xs ys 如果wxl ws wxr 则求解有效 否则无效 无可见线段 裁剪连接结束 同理 将起点用终点代替 采用同样过程可以求出a在窗口内的新的终点坐标 将新的起点和终点连线 即可输出窗口内的可见段 三 中点分割裁剪算法 算法演示 p1 p2 p1 p1 p1 p2 p2 p2 p2 p2 p1 p1 a b c d e pm pm 第三节 多边形的裁剪 1 多边形的裁剪特点 一个多边形经过窗口边框裁剪后 其原始边中有的边被完整的裁掉了 而有的边被裁剪成几段 但其中只有一个可见段被保存了下来 整条原始边作为完整的可见段被完全保存下来的可能只是其中的一部分 所以 这些被保留下来的残缺的可见段已不能再组成一个封闭的图形 a b c 另一个原因是由于被裁剪的多边形是凹多边形引起的 一个凹多边形被窗口边框裁剪以后 其结果可能会产生几个独立的小多边形 从而使得问题更加复杂化 如下图所示 原来是一个凹多边形 经过窗口边框裁剪以后 可以产生几个独立的小多边形 2 逐边裁剪算法 该算法的步骤是 首先把待裁剪多边形的各个顶点按照一定的方向有次序的组成 顶点序列 如上图中的p1 p2 pn 相继连接相邻两顶点p1p2 p2p3 p8p9 p9p1即组成了多边形的九条边 这个顶点序列就是待处理的输入量 对输入的顶点序列进行处理 处理的结果将是产生一组新的顶点序列 然后输出该组新的顶点序列 例如 Q1 Q2 Qm 可以认为 这个新的顶点序列就表示了由m条边组成的新的多边形 虽然实际上可能是包括了由退化边连接成的若干个多边形 把输出的顶点序列作为新的输入量 再次输入到算法中的第 步 如此重复三次 1 输出l1和P2 2 输出P3 3 输出l2 4 无输出线段起点S和终点E与裁剪边的四种位置关系 3 边界裁剪算法 把要被裁剪的多边形顶点按逆时针方向排成一个顶点序列环 从该多边形顶点环中的任何一个顶点出发 顺着环的方向搜索多边形顶点中位于窗口内的顶点 以及多边形边与窗口有效边的交点 整个处理过程以搜索路径返回到原多边形的起点结束 演示1 演示2 演示3 输入ABCDEFA o h 左裁剪边 输出输入 aBCDEFh 右裁剪边 输出输入 BCDeoha 上裁剪边 输出输入 cCDeohab 下裁剪边 输出 CDefghabc 第四节窗口视区变换 一 坐标系1世界坐标系世界坐标系 worldcoordinatesystem 是最常用的坐标系 如下图所示 它是一个符合右手定则的直角坐标系 其中 a是定义二维图形的坐标系 b是定义二维物体的坐标系 x x y y z o 特点 世界坐标系是用来定义用户在二维或三维世界中的物体 因此也称为用户坐标系 理论上 世界坐标系是无限且连续的 即它的定义域为实数域
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 档案数字化管理师理论知识考核试卷及答案
- 城市黑臭水体治理实施方案:2025年水质改善方案详解
- 2025年智能建筑系统集成:节能降耗技术与市场分析报告
- 肿瘤精准医疗服务市场2025展望:市场规模分析与治疗技术创新研究报告
- 塑料热合工岗位操作技能考核试卷及答案
- 聚碳酸酯装置操作工技能比武考核试卷及答案
- 元宇宙广告传播策略-洞察及研究
- 杀菌效果评价方法-洞察及研究
- 矿山安全防护工内部技能考核试卷及答案
- 回转窑球团焙烧工专业技能考核试卷及答案
- 《拍摄校园微视频》教学课件-2024-2025学年冀美版(2024)初中美术七年级下册
- 抗美援朝“铭记历史迎接挑战”-第11年迎回在韩中国人民志愿军烈士遗骸主题班会课件
- 公路工程造价编制自采材料预算单价计算课件
- 保险行业组织发展
- 学生宿舍的卫生管理研究
- 管制部运行管理手册(机场)第六章 运行程序
- 药品临床综合评价解读
- 2025年中国人寿:养老险北京分公司招聘笔试参考题库含答案解析
- 2025年度建筑地基基础清包工劳务合同规范范本
- 逻辑思维在写作中的运用与提升
- GB/T 20717-2024道路车辆牵引车和挂车之间的电连接器(15芯)24 V15芯型
评论
0/150
提交评论