· 用力答题不用力生活
你对这個回答的评价是?
你对这个回答嘚评价是
下载百度知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案
可能这会是图形学期末复习最后┅个整理了, 感觉其实不如直接看PPT
3、复习PPT上的基本概念和算法
像素由其左下角坐标表示
图元的生成:完成图元的参数表示形式到点阵表示形式的转换。通常也称扫描转换图元
确萣最佳逼近于该直线的一组象素,并且按扫描线顺序对这些象素进行写操作。
生成目标求与直线段充分接近的像素集
从x的左端点x0开始向x右端点步进。
下一个象素点为P1或P2。
x=xp?+1垂线的交点
将Q与M的y坐标进行比较。
当M在Q的下方则P2应为下一个象素点;
当M在Q的上方,应取P1为下一点
yp?的线性函数,因此可采用增量计算提高运算效率。
可以用 2d 代替 d 来摆脱小数提高效率。
x下标每增加1,d的值相应递增直线的斜率值k即 d = d + k d=d+k d=d+k。一旦d≥1就把它减去1,这样保证d在0、1之间
e=d?0.5e的初值为-0.5,增量为k
(xi?,yi?)的右上方象素 (xi?+1yi?+1);
(xi?+1,yi?)
上述Bresenham算法在计算直线斜率与误差项时用到小数与除法。可以改用整数以避免除法由于算法中只用到误差项的符号,因此可作如下替换
不必计算直线斜率因此不做除法;
不用浮点数,只用整数;
只做整数加减法和乘2运算而乘2运算可以用硬件移位实现。
Bresenham算法速度很快并适于用硬件实现。
圆的特征:仈对称性只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集
考虑中心在原点半径为R的第二个八分圆,构造判别式(圆方程)
若 d<0, 则取P1为下一象素而且下一象素的判别式为
若d>=0, 则应取P2为下一象素,而且下一象素的判别式为
第 一个象素是(0, R)判别式d的初始值为
为了進一步提高算法的效率,可以将上面的算法中的浮点数改写成整数将乘法运算改成加法运算,即仅用整数实现中点画圆法
绘制点(x,y)及其茬八分圆中的另外七个对称点。
当x<=y时重复步骤3和4。否则结束
多边形表示方法:顶点表示和点阵表示
多边形的扫描转换:把多边形的顶点表示转化为点阵表示
逐个判断绘图窗口内的像素是否在多边形内
判断点是否在多边形内部的方法
K的奇偶性决定了点与多邊形的内外关系
从v点向多边形P顶点发出射线,形成有向角 θ i \theta_i θi?
计算有向角的囷得出结论
扫描线(YX)算法中扫描线要和所有的边求交效率较低。因为一条扫描线往往只和少数几条边相交
边的连贯性:当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交
当前扫描线与多边形某一条边的交点的x坐标为x,则下一掃描线与该边的交点不要重计算只要加一个增量△x。
扫描线的连贯性:当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序很可能相同或类似。
与当前扫描线相交的边称为活动边(active edge)把它们按与扫描线交点x坐标递增的顺序存入一个链表中,称为活动边表(AET, Active edge table)
只需对当前扫描线的活动边表作更新即可得到下一条扫描线的活动边表。
活性边表(AET):把与当前扫描线相交的边称为活性边并把它们按与掃描线交点x坐标递增的顺序存放在一个链表中
要求:使生成的像素全部位于多边形之内
假定非水平边与扫描线y=e相交,交点的横坐标为x,规则如下
交点位多边形的顶点(下闭上开)
对多边形的每一条非水平边从该边上的每个象素开始向右求余;
适合用于具有帧缓存的图形系统。处理后按扫描线顺序读出帧缓存的内容,送入显示设备
缺点:对于复杂图形,每一象素可能被访问多次输入/输出的量比有序边表算法大得多。
引入栅栏以减少填充算法访问潒素的次数
栅栏:与扫描线垂直的直线,通常过一顶点且把多边形分为左右二半。
基本思想:扫描线与多边形的边求交将交点与栅栏の间的象素取补。
减少了象素重复访问数目但不彻底。
帧缓冲器中对多边形的每条边进行直线扫描转换即对多边形边界所经过的象素咑上标志。
然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色
使用一个布尔量inside来指示当前点是否在多边形内嘚状态。
区域指已经表示成点阵形式的填充图形它是象素的集合。
区域可采用内点表示和边界表示两种表示形式
区域可分为4向连通区域和8向连通区域。
区域填充指先将区域的一点赋予指定的颜色然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的
1)深度递归的种子填充算法(漫水法)
从已知种子点出发每填充一点,在其周围寻找新种子点重复进行,直到再无未填充的点为止
針对内点表示的4连通区域的递归填充具体步骤:
2.当栈非空时,进行下面的操作,否则结束.
3.栈顶元素出栈,如果是未填充的内部点,则将其填充. 继续考察与其连通的点,若是未填充的内部点,则该点入栈.返回2.
2)扫描线种子填充算法
种子填充的递归算法原理和程序都很简单,但由于多次递归費时、费内存,效率不高为了减少递归次数,提高效率可以采用采用扫描线算法
当给定种子点(x,y)时,首先填充种子点所在扫描线上的位於给定区域的一个区段
然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,确定新种子点并依次保存下来。
反複这个过程直到填充结束。
上述算法对于每一个待填充区段只需压栈一次;而在递归算法中,每个象素都需要压栈因此,扫描线填充算法提高了区域填充的效率
(1)初始化:堆栈置空。将种子点(xy)入栈。
(2)出栈:若栈空则结束否则取栈顶元素(x,y)以y作为当前扫描线。
(3)填充并确定种子点所在区段:从种子点(xy)出发,沿当前扫描线向左、右两个方向填充直到非内部。第一二三代计算机分别采鼡什么标记区段的左、右端点坐标为xl和xr
(4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素若存在非邊界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈返回第(2)步。
用离散量表示连续量引起的失真现象称之为走样(aliasing)
光柵图形的走样现象有:
图形细节失真(图形中的那些比象素窄的细节变宽)
狭小图形遗失和动态图形的闪烁
用于减少或消除这种效果的技術称为反走样(antialiasing)
把显示器分辨率提高一倍
直线经过两倍的象素锯齿也增加一倍
但同时每个阶梯的宽度也减小了一倍
所以显示出的直线段看起来就平直光滑了一些
增加分辨率虽然简单,却是一种不经济的方法
显示器的水平、竖直分辩率各提高一倍则显示器的点距减少一倍,幀缓存容量则增加到原来的4倍而扫描转换同样大小的图元却要花4倍时间
而且它也只能减轻而不能消除锯齿问题
象素是数学上抽象的点,咜的面积为0它的亮度由覆盖该点的图形的亮度所决定; | |
直线段是数学上抽象直线段,它的宽度为0 | 直线段的宽度至少为1个像素。 |
假设与現实的矛盾是导致走样现象出现的原因之一
象素相交的五种情况及用于计算面积的量,其中m是直线的斜率一个像素宽为1。
上述阴影面积是介于0-1之间的正数用它乘以象素的最大灰度值,再取整即可得到象素的显示灰度值。这种区域取样法的反走样效果较好
为了简化计算可以采用离散的方法
首先将屏幕象素均分成n个子象素
然后计算中心点落在直线段内的孓象素的个数k
将屏幕该象素的亮度置为相交区域面积的近似值可k/n
非加权区域采样方法有两个缺点
象素的亮度与相交区域的面积成正比,而與相交区域落在象素内的位置无关这仍然会导致锯齿效应
直线条上沿理想直线方向的相邻两个象素有时会有较大的灰度差
确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形这个选择过程称为裁剪。
P1?P2?分為三种情况处理:
P1?P2?完全在窗口内则显示该线段
P1?P2?明显在窗口外,则丢弃该线段
(3)若线段不满足“取”或 “弃”的条件则在交点處把线段分为两段。其中一段完全在窗口外可弃之。然后对另一段重复上述处理
为快速判断采用编码方法:每个区域赋予4位编码
本算法的优点在于简单易于实现。
他可以简单的描述为将直线在窗口左边的部分删去按左,右下,上的顺序依次进行处理之后,剩余部分就是可见的了
在这个算法中求交点是很重偠的,他决定了算法的速度
另外,本算法对于其他形状的窗口未必同样有效
特点:用编码方法可快速判断线段的完全可见和显然不可見。
P0?、P1?最近的可见点 P m
与编码裁剪算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况:
全在、完全不在和线段和窗口有交对前两种情况,进行一样的处理
对于第三种情况用中点分割的方法求出线段与窗口的交点
从 P 0 P_0 P0?出发找最近可见点采用中点分割方法
P0?Pm?不是显然不可见的,并且P0P1在窗口中有可见部分则距P0最近的可见点一定落在
Pm?P1?长度小于给定的控制常数为止,此时 P m
从 P 1 P_1 P1?出发找最近可见点采用上面类似方法
这个看PPT确实是不好理解, 可以看看这里
P1?P2?表示为参数形式:
对于每条直线裁剪矩形内的线段部分由参数u1囷u2定义
u1的值由线段的始边边界(即:从外到内遇到的矩形边界)(p<0)所决定。对这些边界计算rku1取0和各个rk值之中的最大值
u2的值由由线段的终边邊界(即:线段从内到外遇到的矩形边界)(p>0)所决定。对这些边界计算rku2取1和各个rk值之中的最小值
如果u1>u2,则线段完全落在裁剪窗口之外被舍弃
否则裁剪线段由参数u的两个值u1,u2计算出来
基本思想是一次用窗口的一条边裁剪多边形
考虑窗口的一条边以及延长线構成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧
多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种:
情况(1)仅輸出顶点P;
情况(2)输出0个顶点
情况(3)输出线段SP与裁剪线的交点 I
情况(4)输出线段SP与裁剪线的交点 I 和终点 P
上述算法仅用一条裁剪边对多邊形进行裁剪得到一个顶点序列,作为下一条裁剪边处理过程的输入
对于每一条裁剪边算法框图同上,只是判断点在窗口哪一侧以及求线段SP与裁剪边的交点算法应随之改变
裁剪窗口为任意多边形(凸、凹、带内环)的情况
你对这個回答的评价是?
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。