计算机图形学-算法总结


计算机图形学 算法总结 viopond@life-sciences 一、 二维线画图元的生成 扫描转换直线段 生成直线段的 DDA 算法 利用直线方程直接计算,结果取整。 用到浮点数的加法和取整。 生成直线段的中点算法 利用直线的正负划分性,构造隐函数 F(x,y)。每次计算 F(xi+1,yi+0.5) ,判 断函数正负,若为正则下一点在右侧,若为负则下一点在右上。 判别式 F(x,y)=△xy-△yx-△xB (原直线 y=mx+B,把 m 改写)。计算判别式递 推的方法:分 d>=0 和 d<0 两个情况,计算横坐标为 xi+2 时的判别式表达式,获 得 d 的增量。 Breseham 画线算法 d 是误差项。x 下标每次加 1,d 相应增加斜率 k。一旦 d>=1,就把它减去 1。 当 d>=0.5 时,取当前象素右上方象素。当 d<0.5 时,取右边象素。为方便计 算, 令 e=d-0.5 扫描转换圆弧 圆的八对称性 利用圆弧方程开根计算或者利用参数方程计算,开根/三角函数,计算量大 圆弧的中点算法 F(x,y)=x^2+y^2-R^2 正在圆弧外,取右下。负在圆弧内,取右。 第一象限:构造判别式 d=F(M)=F(xi+1,yi-0.5),递推方法类似直线的中点算法。 椭圆的中点画法也与此类似。判别式函数不一样而已。 生成圆弧的多边形逼近法 给定最大逼近误差 delta,确定圆心角,R-Rcosa<=delta n=2pi/a 下一个顶点,用 cosa –sina 矩阵 乘 xi sina cosa yi 一个顶点需 4 次乘法,一共 4n 次乘法,外加直线段中点算法的计算量 圆的等面积逼近法 求多边形径长,从而求所有顶点坐标。由逼近误差值确定圆心角 a。 生成圆弧的正负法 曲线把平面分成 G+和 G-两个区域,前进△x 时,到达 P1,再前进△y 到 P2,之 后若点与 P1 在同侧,则前进△y,否则前进△x。 判别式 D(Pi)=F(Pi).F(P1)=F(xi,yi).F(x0+△x,y0) 二、 二维填充图元的生成 扫描转换矩形 做 x,y 坐标的二重循环,逐点填充。 共享边界:左闭右开,下闭上开。 扫描转换多边形 逐点判断法、扫描线算法、边缘填充法 逐点判断法: 射线法:从每个象素点发射线,交点个数偶数的在外,反之在内。避免射线 通过顶点。 累积角度法:记录从该象素到多边形每个顶点的有向角(逆时针旋转为正), 若代数和为 0 则在外,若为正负 2pi 的在内。 编码方法:从 X 轴起逆时针把各象限编码,确认各顶点所在象限的编码, 然后两顶点相减计算各边的编码,用 4 处理使编码绝对值不大于 2,最后求各边 编码代数和。代数和为 0 的在外,为正负 4 的在内。特殊情况:(1)点在边上.预 处理解决 (2)代数和为正负 2(取中点再编码,递归) 扫描线算法 求扫描线与多边形各边的交点 对所得交点从小到大排序 两两配对,填充每个区段 原则:与扫描线的交点向多边形内取整。交点落在象素点上时,仅落在左边上的 属于多边形。交点为多边形顶点时,每个边被认为下闭上开(p74)。 数据结构和算法流程 P76 特点:算法效率比逐点填充法高很多 缺点:对各种表的维持和排序开销太大,适合软件实现而不是硬件实现。 边缘填充法: 基本思想:对于每条扫描线盒每条多边形边的交点,将该扫描线上交点右方的所 有像素颜色取补。对多边形的每条边做此处理。 原理:以求余运算代替扫描线算法中的排序运算。 特点:适合用于具有帧缓存的图形系统。算法简单,但对于复杂图形,每一像素 被访问多次,输入输出多。 扫描转换扇形区域 原理同多边形扫描转换,问题在于确认扫描线与直边和圆弧边的相交顺序。 分情况讨论,固定 P1 在第一象限时有 4 种情况,一共十六种。 区域填充 四向联通区域、八向联通区域 边界表示的四连通递归算法(种子填充算法): 种子像素入栈,栈非空时,重复执行以下步骤:栈顶像素出栈,将出栈像素置色, 四向检查像素,若其中某个像素不在边界且未被置色,则该像素入栈。 可用于填充带内孔的平面区域。 缺点:有些像素反复入栈降低效率,栈结构占空间。递归执行算法简单但效率不 高。可用下面的扫描线填充算法解决。 扫描线填充算法 目标:减少递归 算法: 栈顶像素出栈 沿扫描线对出栈像素的左右像素进行填充,直到遇到边界像素为止。(填充区间) 检查上下扫描线,选相应区间的最左像素作为种子入栈。 特点:由区域算法定区间,再定上下邻区间。 多边形扫描转换与区域填充方法比较: 不同点: 前者将顶点表示转换成点阵表示,后者只是改变颜色,没有改变表示方法。 前者只要求扫描线与多边形边界交点个数为偶数。后者要求区域封闭。 前者从边界顶点信息出发,后者从区域内种子点出发。 三、 二维光栅图形的混淆与反混淆 用离散量(像素)表示连续的量(图形)而引起的失真,叫做混淆或者走样。 反混淆方法 提高分辨率:方便,代价巨大 区域采样方法: 把直线段看做具有一定宽度的狭长矩形,当直线段与 像素有交时,求出相交区域的面积。根据面积大小确 定亮度值,使相邻两个像素的灰度之间有平缓的过渡。 非加权区域采样方法: 非加权区域采样方法性质: (1)像素亮度与相交区域面积成正比,和直线段与像素中心点的距离成反比。 (2)直线与像素不相交,对像素的亮度无影响 (3)相交区域面积相同,像素的亮度就相同,与相交区域的几何位置无关。 离散方法求相交面积: (1)把像素分为 n 个子像素 (2)计算子像素中心落在直线段区域内的个数,记为 k (3)k/n 为相交区域面积近似值 加权区域采样方法 改进非加权区域采样方法:相交面积相同,像素亮度可能不同 求出相交区域 A’,然后用 计算相交区域对像素的亮度贡献值,这个计 算结果乘以最大亮度值就是该像素的亮度。W(x,y)是高斯分布函数。 离散算法: 分割像素成 n 个子像素,每个子像素面积为 1/n,用 计算每个子像素 对原像素的亮度贡献权值,记录在加权表中。然后求所有中心落在直线段里的子 像素的集合。最后针对上述集合计算亮度贡献权值的代数和作为亮度值。 四、 二维裁剪 两个步骤:图元在窗口内外的判别,图元与窗口的求交。 简单图形(点、线、面)适合先裁剪再扫描转换。 直线段裁剪 三种关系(1)完全可见(2)完全不可见(3)其他。前两种情况可快速判断 直接求交算法: 直线和窗口都写成参数形式,解方程求交计算裁剪部分。 Cohen-Sutherland 编码算法 递归的。 窗口四条边把二维平面分成九个区域,每个区域赋予四位编码,编码顺序上下 右左。如果出了窗口区域,相应编码位就为 1。 两端点逻辑与非 0 时,线段显然不可见。 验证两端点各位编码值,相异则跟相应边求交。最坏情况求交四次。求交测试顺 序固定。由交点编码继续判断线段可见性。 特点:用这个方法可以快速判断线段的完全和显然不可见。 特别适合:大窗口场合,窗口特别小场合(光标拾取图形)。 Nicholl-Lee-Nicholl 算法 消 除 C-S 算 法 中 多 次 求 交 的 情 况 , 对 2D 平 面 进 行 更 细 的 划 分 。 区域细分为 9 个。考察 P0 在 0,4,5 情形。从 P0 向窗口四个角点引射线,把区域 分成 4 个有意义的区域。判断 p1 所在区域(用斜率),即可判断 P0,P1 该与窗口 哪条边求交,求出交点后判断线段可见部分。 效率高,但只适合二维矩形窗口。 中点分割法: 从 P0 点出发找距 P0 最近的可见点,从 p1 出发找距 P1 最近的可见点。 找与 p0 最近的可见点的方法(找 p1 的类似):不断取 p0p1 的中点 pm,直到 Pm 和 P0 的距离小于某个值(一般为像素大小),否则判断 PmP0 的可见性,若显然 不可见用 pm 替代 p0,否则用 p1 替代 pm。如此进行下去。 适合硬件、并行计算。 多边形裁剪 Sutherland-Hodgman 算法 分割处理:将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的 裁剪。 流水线处理,处理顺序左、上、右、下。 逐边裁剪:两次分解,流水线处理。 第一次:将多边形对矩形窗口的裁剪分解为它关于窗口四边所在直线的裁剪。 第二次:将多边形关于一条直线的裁剪分解为多边形各边关于该直线的裁剪。 裁剪结果的顶点构成:裁剪边内侧的原顶点,多边形的边与裁剪边的交点。 特点:适合硬件计算。能够推广到任意凸多边形及三维裁剪。 Weiler-Atherton 算法 被裁剪多边形是主多边形,裁剪窗口为裁剪 多边形。 内裁剪(A 交 B)、外裁剪(A-B)。 明确进点、出点。 算法步骤: 建主多边形和裁剪多边形的顶点表 求主多边形和裁剪多边形的交点,交点顺序 插入两多边形的顶点表中,相同交点间建立 双向指针。 裁剪: 如果存在没有被跟踪过的交点,执行以下步 骤: (1)建立裁剪结果多边形的顶点表 (2)选取任意没有被跟踪过的交点为始点,将其输出到结果多边形顶点表中。 (3)如果该交点为进点,跟踪主多边形边边界,否则跟踪裁剪多边形边界。 (4)跟踪多边形边界,每遇到多边形顶点,将其输出到结果多边形顶点表中, 直到遇到新的交点。 (5)将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变 跟踪方向(主-》裁剪,裁剪-》主) (6)重复 4、5 直至回到起点 奇异情况:顶点落在裁剪多边形的边上的的主多边形的边,落裁剪边内侧算交点, 外侧的不算交点。 五、 消隐 画家算法 对场景中的多边形按深度进行排序,形成深度优先级表,按从远倒近的顺序 显示多边形 不能处理循环遮挡,计算量大。 Z 缓冲器算法 { for(v=0;vZ 缓冲器的(u,v)单元的值) { 置 Z 缓冲器的第(u,v)单元的深度值为 d; 置帧缓冲器的第(u,v)单元的颜色值为当前多边形颜色值; } } 扫描线 Z 缓冲器算法 优点:避免扫描线和多边形、扫描线和边盲目求交 缺点:在被多个多边形覆盖的像素需要多次计算深度值 扫描线算法 以区间为单位确定填充区间,不需要 Z buffer 区域子分算法 将场景中的多边形投影到绘图窗口,判断绘图窗口是否足够简单。如果是,则算 法结束,否则将窗口进一步分成四块,对此四个小窗口重复上述过程,一直到窗 口仅为一个像素大小。此时若有多个多边形覆盖这个像素,计算它们的深度值, 用最近者的颜色显示该像素。 简单的定义:分离、包含、相交、包围(最靠近观察点) 区别分离和包围的方法:区域编码-》多边形顶点编码-》多边形边编码(周期为 8,边编码为正负 4 时特殊处理)-》多边形编码(为其边的编码和)。编码和为 0 时窗口与多边形分离,为正负 8 时多边形包围窗口。 光线投射算法
还剩8页未读

继续阅读

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

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

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

cgs6654820

贡献于2017-06-06

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