第四章 多边形填充
- 格式:ppt
- 大小:1.56 MB
- 文档页数:31
试验实验一:图形的区域填充一、实验目的区域填充是指先将区域内的一点(常称为种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。
区域填充技术广泛应用于交互式图形、动画和美术画的计算机辅助制作中。
本实验采用递归填充算法或打描线算法实现对光栅图形的区域填充。
通过本实验,可以掌握光栅图形编程的基本原理和方法。
实验内容掌握光栅图形的表示方法,实现种子算法或扫描线算法。
通过程序设计实现上述算法。
建议采用VC++实现OpenGL程序设计。
三、实验原理、方法和手段递归算法在要填充的区域内取一点(X, Y)的当前颜色记为oldcoloo用要填充的颜色ne wcolor去取代,递归函数如下:procedure flood-fill(XXoldcoloLnewcolor:integer); beginif getpixel(fiainebufier,x,y)=oldcolorthen beginsetpixel(fiamebuffer,x,y,newcolor); flood-fill(X.Y+1 .oldcoloLiiewcolor);flood-fill(X.Y^ 1 ,oldcoloi;newcolor); flood-fill(X-l,Y;oldcoloi;newcolor); flood-fill(X+l,Yoldcoloi;newcolor);endend扫描线算法扫描线算法的效率明显高于递归算法,其算法的基本思想如下:(1)(初始化)将算法设置的堆栈置为空,将给定的种子点(x,y)压入堆栈。
(2)(出栈)如果堆栈为空,算法结束;否则取栈顶元素(x,y)作为种子点。
(3)(区段填充)从种子点(x,y)开始沿纵坐标为y的当前扫描线向左右两个方向逐个象素进行填色,其值置为newcoloi;直到抵达边界为止。
(4)(定范围)以XleA和Xn血分别表示在步骤3中填充的区段两端点的横坐标。
(5)(进栈)分别在与当前扫描线相邻的上下两条打描线上,确定位于区间[Xldb Xn 曲]内的给定区域的区段。
多边形的填充——扫描线算法(原理)2007年10月05日星期五 11:52多边形在计算机中有两种表示:点阵表示和顶点表示。
顶点表示是用多边形的顶点的序列来描述多边形,该表示几何意义强、占内存少,但它不能直观地说明哪些像素在多边形内。
点阵表示是用位于多边形内的象素的集合来刻划多边形,该方法虽然没有多边形的几何信息,但具有面着色所需要的图像表示形式。
多边形填充就是把多边形的顶点表示转换为点阵表示,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置为相应的灰度或颜色。
多边形填充最常用的方法就是扫描线算法。
下面分两篇文章介绍这种算法的原理和具体实现。
这里所介绍的算法只是针对非自交多边形,这些多边形可以是凸的、凹的或者带有空洞的。
所谓扫描线算法就是找到多边形的最小y值和最大y值,然后用这个范围内的每一条水平线与多边形相交,求得交点,再绘制线段。
所以我们只需要对一条水平线进行分析就可以。
很显然,一条扫描线和多边形有偶数个交点,将这些交点按照x值从小到大排列,然后取第1、2个绘制,第3、4个绘制......直到所有交点都被取完。
所以,对于一条扫描线,我们需要做的工作可以分为三个步骤:1)求出扫描线与多边形边的交点 2)将交点按照x升序排列 3)将排好序的交点两两配对,然后绘制相应线段。
这三个步骤中,后两个步骤很简单,没有特别的内容需要介绍。
但是第一个步骤比较麻烦。
这里有几个问题需要解决。
一是当扫描线与顶点相交时,交点的取舍。
当与那个顶点关联的边在扫描线同侧时,交点自然算两次,当与那个顶点关联的边在扫描线两侧时,交点只能算一次。
我们使用“下闭上开”的办法。
二是多边形边界上的像素取舍,我们采用“左闭右开”的办法。
三是如何减少计算量。
在绘制直线时,有一种DDA算法,它是利用(x,y)直接求出下一个点位于(x+1,y+m)或者(x+1/m, y+1)。
在这里可以利用这一点。
当已经得到y = e和多边形所有边的交点时,对于下一条扫描线y=e+1,如果没有新边与y=e+1相交,就可以推出y = e+1 和多边形所有边的交点。