第2章 基本图形的生成与计算_区域填充算法_new
- 格式:ppt
- 大小:658.50 KB
- 文档页数:29
区域填充算法填充原理种⼦填充算法是从区域内任⼀个种⼦像素位置开始,由内向外将填充⾊扩散到整个多边形区域的填充过程。
种⼦填充算法突出的优点是能对具有任意复杂闭合边界的区域进⾏填充。
四邻接点与⼋邻接点四连通域与⼋连通域种⼦填充算法算法定义从种⼦像素点开始,使⽤四邻接点⽅式搜索下⼀像素点的填充算法称为四邻接点填充算法。
从种⼦像素点开始,使⽤⼋邻接点⽅式搜索下⼀像素点的填充算法称为⼋邻接点填充算法。
⼋邻接点填充算法的设计和四邻接点填充算法基本相似,只要把搜索⽅式由四邻接点修改为⼋邻接点即可。
算法原理种⼦填充算法⼀般要求区域边界⾊和填充⾊不同,输⼊参数只有种⼦坐标位置和填充颜⾊。
种⼦填充算法⼀般需要使⽤堆栈数据结构来实现。
先将种⼦像素⼊栈,种⼦像素为栈底像素,如果栈不为空,执⾏如下3步操作:1. 栈顶像素出栈;2. 按填充颜⾊绘制出栈像素。
3. 按左、右、下、上(或左、左上、上、右上、右、右下、下、左下)顺序搜索与出栈像素相邻的四(⼋)个像素,若该像素的颜⾊不是边界⾊并且未置成填充⾊,则把该像素⼊栈;否则丢弃该像素。
该算法也可以填充有孔区域。
缺点:递归执⾏,算法简单,但效率不⾼,区域内每⼀象素都引起⼀次递归,进/出栈,费时费内存。
改进算法,减少递归次数,提⾼效率。
解决⽅法是⽤扫描线填充算法。
扫描线算法⽬标:减少递归层次算法思想:在任意不间断区间中只取⼀个种⼦像素(不间断区间指在⼀条扫描线上⼀组相邻元素),填充当前扫描线上的该段区间;然后确定与这⼀区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来,反复进⾏这个过程,直到所保存的个区段都填充完毕。
扫描线种⼦填充算法算法原理为:先将种⼦像素⼊栈,种⼦像素为栈底像素,如果栈不为空,执⾏如下4步操作。
1. 栈顶像素出栈。
2. 沿扫描线对出栈像素的左右像素进⾏填充,直⾄遇到边界像素为⽌。
即每出栈⼀个像素,就对区域内包含该像素的整个连续区间进⾏填充。
3. 同时记录该区间,将区间最左端像素记为xleft,最右端像素记为xright。
计算机图形学——区域填充算法(基本光栅图形算法)⼀、区域填充概念区域:指已经表⽰成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的⼀点(常称【种⼦点】)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。
1、区域有两种表⽰形式1)内点表⽰:枚举出区域内部的所有象素,内部所有象素着同⼀个颜⾊,边界像素着与内部象素不同的颜⾊。
2)边界表⽰:枚举出区域外部的所有象素,边界上的所有象素着同⼀个颜⾊,内部像素着与边界象素不同的颜⾊。
21)四向连通区域:从区域上⼀点出发可通过【上、下、左、右】四个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
2)⼋向连通区域:从区域上⼀点出发可通过【上、下、左、右、左上、右上、左下、右下】⼋个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
⼆、简单种⼦填充算法给定区域G⼀种⼦点(x, y),⾸先判断该点是否是区域内的⼀点,如果是,则将该点填充为新的颜⾊,然后将该点周围的四个点(四连通)或⼋个点(⼋连通)作为新的种⼦点进⾏同样的处理,通过这种扩散完成对整个区域的填充。
这⾥给出⼀个四连通的种⼦填充算法(区域填充递归算法),使⽤【栈结构】来实现原理算法原理如下:种⼦像素⼊栈,当【栈⾮空】时重复如下三步:这⾥给出⼋连通的种⼦填充算法的代码:void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color){if(x<w&&x>0&&y<h&&y>0){if (pixels[y*w+x]==old_color){pixels[y*w+x]== new_color);flood_fill_8(pixels, x,y+1,old_color,new_color);flood_fill_8(pixels, x,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y,old_color,new_color);flood_fill_8(pixels, x+1,y,old_color,new_color);flood_fill_8(pixels, x+1,y+1,old_color,new_color);flood_fill_8(pixels, x+1,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y+1,old_color,new_color);flood_fill_8(pixels, x-1,y-1,old_color,new_color);}}}简单种⼦填充算法的不⾜a)有些像素会多次⼊栈,降低算法效率,栈结构占空间b)递归执⾏,算法简单,但效率不⾼,区域内每⼀像素都要进/出栈,费时费内存c)改进算法,减少递归次数,提⾼效率三、扫描线种⼦填充算法基本思想从给定的种⼦点开始,填充当前扫描线上种⼦点所在的⼀区段,然后确定与这⼀段相邻的上下两条扫描线上位于区域内的区段(需要填充的区间),从这些区间上各取⼀个种⼦点依次把它们存起来,作为下次填充的种⼦点。
任课教师:李陶深教授tshli@12直线生成算法圆与椭圆的绘制算法5图元的概念436区域填充算法裁剪反走样技术4.4 区域填充算法4.4 区域填充算法—基础知识(3)线框多边形物体:只需扫描转换线段填充多边形物体:要扫描转换多边形本质:点阵表示。
特点:面着色,画面明暗自然、色彩丰富。
4.4 区域填充算法4.4 区域填充算法—基础知识(4)图形学中多边形的两种表示方式顶点表示:用多边形的有序顶点序列表示多边形点阵表示:用位于多边形内部的像素集合来表示多边形4.4 区域填充算法多边形边界的矢量形式数据之上,可用于程序填色,也可用于交互填色。
形边界的图像形式数据之上,并还需提供多边形边界内一点的坐标。
概括地说,该算法先画边界,然后对内定义区域填充。
所以,它一般只能用于人机交互填色,而难以用于程序填色。
4.4 区域填充算法—多边形填色算法的问题多边形填色算法面临的一个首要问题,是判断一个像素是在多边形内还是多边形外。
Question1: How to Judge…?Question2: How to improve …?图4.14 射线法图4.15 转角法4.4 区域填充算法4.4 区域填充算法4.4 区域填充算法4.4 区域填充算法4.4 区域填充算法大量的求交、乘除运算4.4 区域填充算法—扫描线填色算法(1)基本思路:扫描线算法按扫描线的顺序计算出扫描线与多边形的相交区间,然后用要求的颜色填充这些区间内的像素。
该算法利用了扫描线的连续性和边的连续性,避免对像素的逐点判断和反复求交运算,减少了计算量,提高了算法速度。
具体处理过程:先求出扫描线与多边形边的交点,利用扫描线的连续性求出多边形与扫描线相交的连续区域,然后利用多边形边的连续性,求出下一条扫描线与多边形的交点,对所有扫描线由上到下依次处理。
4.4 区域填充算法—扫描线填色算法(2) 算法实现的步骤:对每一条扫描线执行如下四步:(1) 求交:求扫描线与多边形各边的交点;(2) 排序:将求得的交点按递增顺序进行排序;(3) 交点配对:确定相交区间;(4) 区间填色:将相交区间内的像素置成多边形色, 相交区间外的像素置成背景色。