计算机图形学第3章-基本光栅图形生成算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 边相关扫描线多边形填充算法 • 边相关扫描线填充算法比逐点判别算法速度提高很多, 是一种较经典的多边形填充算法。 • 该算法利用了扫描线的相关性和多边形边的相关性, 而不是逐点进行处理。
• 扫描线的相关性:某条扫描线上相邻的象素,几乎都具有同样的内外性 质,这种性质只有遇到多边形边线与该扫描线的交点时才会发生改变。 见下图(a)。 • 边的相关性:由于相邻扫描线上的交点是与多边形的边线相关的。对同 一条边,前一条扫描线yi与该边的交点为xi,而后一条扫描线yi+1=yi+1 与该边的交点则为xi+1=xi+1/m,利用这种相关性可以省去大量的求交 运算。见下图(b)所示。
i
1 2 3
xi
20 21 22
yi
10 11 12 x加1,y加1 x加1,y加1 x加1,y不变
4
5 6 7
23
24 25 26
12
13 14 15
x加1,y加1
x加1,y加1 x加1,y加1 x加1,y加1
8
9 10
27
28 29
16
16 17
x加1,y不变
x加1,y加1 x加1,y加1
这里仅讨论圆心位于坐标原点的圆的扫描转换算法,对 于圆心不在原点的圆,可先用平移变换,将它的圆心平移 到原点,然后进行扫描转换,最后再平移到原来的位置;
• 奇异点的处理 • 将多边形的顶点分为两大类: • 局部极值点:如图中的点P1、P2、P4和P6。对于这些点来说,进 入该点的边线和离开该点的边线位于过该点扫描线的同一侧。 • 非极值点:如图中的点P3、P5。对于这些点来说,进入该点的边 线和离开该点的边线位于过该点扫描线的两侧。 • 处理奇异点规则 • 对于局部极值点,应看成两个点; • 对于非极值点,应看成一个点。
第三项:某边斜率的倒数:1/m。 第四项:指针。用来指向同一条扫描线相交的其它边,如果其它边 不存在,则该项置空
• 数据结构 • 活动边表(AET:Active Edge Table):ET表建立以后,就可以开始 扫描转换了。对不同的扫描线,与之相交的边线也是不同的,当对 某一条扫描线进行扫描转换时,我们只需要考虑与它相交的那些边 线,为此需要建立一个只与当前扫描线相交的边记录链表,称之为 活动边表。
• 多边形填充就是把多边形的顶点表示转换为点阵表示,即 从多边形的给定边界出发,求出位于其内部的各个像素, 并将帧缓冲器内的各个对应元素设置相应的灰度或颜色。
• 填充条件:多边形的顶点序列(Pi,i=0,1,…,n)、填充色。 • 对多边形进行填充,关键是找出多边形内的象素。 • 多边形内点的判别准则 • 从测试点引出一条伸向无穷远处的射线(假设是水平向右的射线), 那么:若射线与多边形边界的交点个数为奇数时,则该点为内 点;若交点个数为偶数时,则该点为外点。 • 奇异点 • 上述的判别准则,在大多数情况 下是正确的,但当水平扫描线正 好通过多边形顶点时,要特别注 意。例如,图中过顶点的射线1、 射线6,它们与多边形的交点个数 为奇数,按照判别准则它们应该 是内点,但实际上却是外点。 而 图中过顶点的射线3、射线5,对 于判别准则的使用又是正确的。
• 直线生成算法
• DDA方法 • Bresenham算法
• 圆弧生成算法
• 中点圆生成算法
• 多边形的填充
• • • • 多边形表示方法 多边形填充的扫描线算法 边缘填充算法 边界标志算法
• 区域填充
• 区域的基本概念 • 简单种子填充算法 • 扫描线种子填充算法
• 光栅图形的反走样算法
• 用现有绘图软件系统 • 画图\Word中的图文编辑工具\AutoCAD\Photoshop 等大型绘图软件 • 用绘图软件包 • OpenGL就是一个典型的、已经被接受的国际工业标 准的图形软件包。 • Java3D • 用操作系统的绘图功能 • 如Windows中Win32API中就提供了基本的绘图功能
• 算法步骤 • 根据给出的多边形顶点坐标,建立ET表;
求出顶点坐标中最大y值ymax和最小y值ymin。
• 初始化AET表指针,使它为空。 • 使用扫描线的yj值作为循环变量,使其初值为ymin。 对于循环变量yj的每一整数值,重复作以下事情,直到yj大于ymax, 或ET表与AET表都为空为止:
执行过程
1 1
2 2
1
1
2 2 3
图3.32扫描线种子填充算法的执行过程
图形的边界一般都呈阶梯形 图形的细节失真、狭小图形遗失
图3.33阶梯形边界 图
图3.34阶梯形线段
狭小图形遗失和运动图形的闪 光现象
(a) 待显示的细小图形 (b) 显示结果 (a)待显示的狭小矩形 (b) 显示结果
图3.35 细节失真
•
•
•
•
• Bresenham算法基本思想 • 上述算法扩展到任一八分圆坐标空间图,从而形成一般
的Bresenham算法。下图是各象限的判断条件。
例题2:已知起点A(20,10)和终点B(30,18),用Bresenham法在 A和B之间生成一段直线。 解:Δx=10, Δy= 8 ,斜率在0和1之间;
• 逐点判别算法
求出多边形的最小包围盒:从Pi(xi,yi)中求极值,xmin、ymin、xmax、 ymax。 对包围盒中的每个象素引水平射线进行测试。 求出该射线与多边形每条边的有效交点个数。 如果个数为奇数:该点置为填充色。
• 逐点判别算法虽然简单,但不可取,原因是速度慢。它割 断了各象素之间的联系,孤立地考虑问题,由于要对每个 象素进行多次求交运算,求交时要做大量的乘除运算,从 而影响了填充速度。
(a)扫描线的相关性
(b)边的相关性
• 数据结构 • 边相关扫描线填充算法的实现需要建立两个表:边表(ET)和活动 边表(AET)。 • 边表(ET:Edge Table)用来对除水平边外的所有边进行登记,来 建立边的记录。边的记录定义为:
第一项:某边的最大y值(ymax)。注意要进行奇异点处理:对于非 极值点应该ymax=ymax-1。 第二项:某边的最小的y对应的x值。
• 多边形的表示方法
• 顶点表示是用多边形的顶点的序列来描述多边形,该表示几何意义 强、占内存少,但不能直观地说明哪些像素在多边形内; • 点阵表示是用位于多边形内的象素的集合来刻划多边形,该方法虽 然没有多边形的几何信息,但具有面着色所需要的图像表示形式;
P1 P2
P4
P3
多边形顶点表示
多边形点阵表示
如果ET表中yj桶非空,则将yj桶中的全部记录合并到AET表中。 对AET表链中的记录按x的大小从小到大排序。 依次取出AET表各记录中的xi坐标值,两两配对填充,即将每对xi之间的 象素填上所要求的颜色。 如果AET表中某记录的ymax=yj,则删除该记录。 对于仍留在AET表中的每个记录,用xi+1/m代替xi进行修改,这就是该记 录的边线与下一条扫描线yj+1的交点。 使yj加1,以便进入下一轮循环。
算法步骤:
步骤 1:将算法设置的堆栈置为空。将给定的种子点(x, y)压入 堆栈。
步骤 2:如果堆栈为空,算法结束;否则取栈顶元素(x, y)作为种 子点。
步骤 3:从种子点(x, y)开始,沿纵坐标为y的当前扫描线向左右两 个方向逐个像素用新的颜色值进行填充,直到边界为止。设区间两边 界的横坐标分别为xleft 和xright。 步骤4:在与当前扫描线相邻的上下两条扫描线上,以区间[xleft,xright]为 搜索范围,求出需要填充的各小区间,把各小区间中最右边的点并作为 种子点压入堆栈,转到步骤2。
区域填充是指先将区域内的一点(常称 种子点)赋予给定颜色,然后将这种颜 色扩展到整个区域内的过程。
区域是指已经表示成点阵形式的像素集合在光栅图形中, 区域可采用内点表示和边界表示两种形式进行描述。
内点表示法:把位于给定区域内的所有像 素一一列举出来的方法称为内点表示法。
图3.25内点表示的区域
边界表示法:把位于给定区域边界上 的像素一一列举出来的方法称为边界表 示法。
图3.26边界表示的区域
4连通的区域: 取区域内任意 两点,在该区域内若从其中 一点出发通过上、下、左、 右四种运动可到达另一点。
图3.27四个方向的运动
8连通区域: 取区域内任意两点, 若从其中任一点出发,在该区 域内通过沿水平方向、垂直方 向和对角线方向的八种运动可 到达另一点。
图3.31四连通区域与 八连通区域的不同 边界
基本思想:给定区域G一种子点(x, y)首先判断该点是否是 区域内的一点,如果是,则将该点填充为新的颜色,然后 将该点周围的四个点(四连通)或八个点(八连通)作为 新的种子点进行同样的处理,通过这种扩散完成对整个区 域的填充
基本思想:首先填充当前扫描线上的位于给定区域内的一区 段,然后确定与这一区段相邻的上下两条扫描线上位于区 域内的区段,并依次把它们保存起来。反复进行这个过程, 直到所保存的各区段都填充完毕
圆的八分对称性
中点算法生成圆
• 圆心位于原点的圆有四条对称轴x=0、y=0、y=x和y=-x, 见下图。从而若已知圆弧上一点P(x,y),就可以得到其关 于四条对称轴的七个对称点,这种性质称为八分对称性。 因此只要能画出八分之一的圆弧,就可以利用对称性的原 理得到整个圆弧。
•
图a
图b
•
di<0
• 在数学上,理想的直线是一条由无穷多个无限小的连续的 点组成。
• 在光栅显示平面上,我们只能用二维光栅格网上尽可能靠 近这条直线的象素点的集合来表示它。每个象素具有一定 的尺寸,是显示平面上可被访问的最小单位,它的坐标x 和y只能是整数,也就是说相邻象素的坐标值是阶跃的而不 是连续的。
•
•
•
图3.36 狭小图形的遗失
提高分辨率的方法:
提高分辨率的方法 采用硬件: 采用高分辨率的光 栅图形显示器,花费的代价 大。 采用软件: 花费的代价小,也 容易实现。 用软件提高分辨率的方法是: 高分辨率计算,低分辨率显 示。
di≥0
•
输入:圆的半径R; 算法步骤:
1. 2. 3.
4.
void midPointCircle(int r){ float d; x=0; y=r; 计算初始决策变量值d=1.25d=1.25-r; R、x=0、y=R; while(x<=y){ 绘制点(x,y)及其在八分圆中 draw(x,y);//绘制点(x,y)及其七个对称点; 的另外七个对称点; if(d<0){ d+=x*2.0+3; 判断决策变量d的符号:若 }else{ d<0,则先将d更新为d+2x+3, d+=2.0*(x-y)+5; 再将(x,y)更新为(x+1,y);否 y--; 则先将d更新为d+2(x-y)+5, } 再将(x,y)更新为(x+1,y-1); x++; } 当x<=y时,重复步骤3和4。 } 否则结束。
• 算法实现: • 对多边形P的每一非水平边(i=0,1,…,n)上的各像素做向 右求反运算即可,见下图,其中(a)为给定的多边形;(b) 为对区域赋初值;(c),(d),(e)和(f)表示逐边向右求反。
• 基本原理:首先用一种特殊的颜色在帧缓冲器中将多边形 的边界(水平边的Байду номын сангаас分边界除外)勾画出来。然后再把位 于多边形内的各个像素着上所需的颜色 步骤1:以值为boundary-color 的特殊颜色勾画多边形的 边界。设多边形顶点为Pi= (xi, yi),0≤i≤n, xi, yi均为整 数;置Pn+1=P0。每一条扫描线上着上这种特殊颜色的点 的个数必定是偶数(包括零)。 步骤2:设interior_point 是一布尔变量。对每一条扫描线 从左到右进行搜索,如果当前是像素位于多边形内,则 interior_point=true,需要填上值为polygon_color的颜色; 否则该像素在多边形外,需要填上值background_color的 颜色
图3.28个方向的 运动
4连通区域也可理解成8连通区 域,但是两者的边界不尽相 同。如果图中标有· 号的象素 组成的区域作为4连通区域, 则其边界由图中的标有△号 的象素组成。如果将该区域 作为8连通的区域,则其边界 由图中标有△号和×号的两 种象素组成。
图3.29内点表示 的八连通区域
图3.30边界表示 的八连通区域