SHA-1算法的消息计算机图形学填充算法部分实现

  平面区域计算机图形学填充算法算法是计算机图形学领域的一个很重要的算法区域计算机图形学填充算法即给出一个区域的边界 (也可以是没有边界,只是给出指萣颜色)要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案计算机图形学填充算法)。区域计算机图形学填充算法Φ最常用的是多边形填色本文讨论种子计算机图形学填充算法算法(Seed Filling)

    如果要计算机图形学填充算法的区域是以图像元数据方式给絀的,通常使用种子计算机图形学填充算法算法(Seed Filling)进行区域计算机图形学填充算法种子计算机图形学填充算法算法需要给出图像数据嘚区域,以及区域内的一个点这种算法比较适合人机交互方式进行的图像计算机图形学填充算法操作,不适合计算 机自动处理和判断填銫根据对图像区域边界定义方式以及对点的颜色修改方式,种子计算机图形学填充算法又可细分为几类:

     ③为减少递归和压棧次数而改进的扫描线种子计算机图形学填充算法算法等等

       所有种子计算机图形学填充算法算法的核心其实就是一个递归算法,都是从指定的种子点开始向各个方向上搜索,逐个像素进行处理直到遇到边界,各种种子计算机图形学填充算法算法只是在处理 颜色和边界嘚方式上有所不同

  在开始介绍种子计算机图形学填充算法算法之前,首先也介绍两个概念就是“4-联通算法”“8-联通算法”

  既然是搜索就涉及到搜索的方向 问题从区域内任意一点出发,如果只是通过上、下、左、右四个方向搜索到达区域内的任意像素则鼡这种方法计算机图形学填充算法的区域就称为四连通域,这种计算机图形学填充算法方法就称为 “4-联通算法”如果从区域内任意一点絀发,通过上、下、左、右、左上、左下、右上和右下全部八个方向到达区域内的任意像素则这种方法计算机图形学填充算法的区域就稱 为八连通域,这种计算机图形学填充算法方法就称为“8-联通算法”

  如图1(a)所示,假设中心的蓝色点是当前处理的点如果是“4-聯通算法”,则只搜索处理周围蓝色标 识的四个点如果是“8-联通算法”则除了处理上、下、左、右四个蓝色标识的点,还搜索处理四个紅色标识的点两种搜索算法的计算机图形学填充算法效果分别如如图1(b) 和图1(c)所示,假如都是从黄色点开始计算机图形学填充算法则“4-联通算法”如图1(b)所示只搜索计算机图形学填充算法左下角的区域,而“8-联通算法”则如图1(c)所示将左 下角和右上角的区域嘟计算机图形学填充算法了。

   并不能仅仅因为图1的计算机图形学填充算法效果就认为“8-联通算法”一定比“4-联通算法”好应该根据應用环境和实际的需求选择联通搜索方式,在很多情况下只有“4-联通算法”才能得到正确的结果。

  边界计算机图形学填充算法算法與注入计算机图形学填充算法算法的本质其实是一样的都是递归和搜索,区别只在于对边界的确 认也就是递归的结束条件不一样。注叺计算机图形学填充算法算法没有边界的概念只是对联通区域内指定的颜色进行替换,而边界计算机图形学填充算法算法恰恰强调边界嘚存在只要是边界内的 点无论是什么颜色,都替换成指定的颜色边界计算机图形学填充算法算法在应用上也非常的广泛,画图软件中嘚“油漆桶”功能就是边界计算机图形学填充算法算法的例子以下就是边界计算机图形学填充算法算法的 一个实现:

  下图就是应用夲算法实现的“4-联通”和“8-联通”计算机图形学填充算法效果:

   边界计算机图形学填充算法算法与注入计算机图形学填充算法算法的夲质其实是一样的,都是递归和搜索区别只在于对边界的确认,也就是递归的结束条件不一样注入计算机图形学填充算法算法没有边堺的概念,只 是对联通区域内指定的颜色进行替换而边界计算机图形学填充算法算法恰恰强调边界的存在,只要是边界内的点无论是什麼颜色都替换成指定的颜色。边界计算机图形学填充算法算法在应用上也非 常的广泛画图软件中的“油漆桶”功能就是边界计算机图形学填充算法算法的例子。以下就是边界计算机图形学填充算法算法的一个实现:

   关于direction_8的说明请参考上一节图3就是应用本算法实现嘚“4-联通”和“8-联通”计算机图形学填充算法效果(其中颜色值是1的点就是指定的边界):

   前面介绍的1与2,介绍的两种种子计算机图形学填充算法算法的优点是非常简单缺点是使用了递归算法,这不但 需要大量栈空间来存储相邻的点而且效率不高。为了减少算法中嘚递归调用节省栈空间的使用,人们提出了很多改进算法其中一种就是扫描线种子计算机图形学填充算法算法

  扫描线种子计算機图形学填充算法算法不再采用递归的方式处理“4-联通”和“8-联通”的相邻点而是通过沿水平扫描线计算机图形学填充算法像素段,一段一段地来处理“4-联通”和“8- 联通”的相邻点这样算法处理过程中就只需要将每个水平像素段的起始点位置压入一个特殊的栈,而不需偠象递归算法那样将当前位置周围尚未处理的所有相邻点 都压入堆栈从而可以节省堆栈空间。应该说扫描线计算机图形学填充算法算法只是一种避免递归,提高效率的思想前面提到的注入计算机图形学填充算法算法和边界计算机图形学填充算法算法都可以改进成扫描線 计算机图形学填充算法算法,下面介绍的就是结合了边界计算机图形学填充算法算法的扫描线种子计算机图形学填充算法算法

   扫描线种子计算机图形学填充算法算法的基本过程如下:当给定种子点(x, y)时,首先分别向左和向右两个方向计算机图形学填充算法种子点所在掃描线上的位于给定区域的一个区段同时记下这个区段的范围[xLeft, xRight],然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段并依次保存下来。反复这个过程直到计算机图形学填充算法结束。

  扫描线种子计算机图形学填充算法算法可由下列四个步骤实現:

  (1) 初始化一个空的栈用于存放种子点将种子点(x, y)入栈;

  (2)判断栈是否为空,如果栈为空则结束算法否则取出栈顶元素莋为当前扫描线的种子点(x, y),y是当前的扫描线;

  (3) 从种子点(x, y)出发沿当前扫描线向左、右两个方向计算机图形学填充算法,直到边界分别标记区段的左、右端点坐标为xLeft和xRight;

  (4)分别检查与当前扫描线相邻的y - 1和y + 1两条扫描线在区间[xLeft, xRight]中的像素,从xLeft开始向xRight方向搜索若存茬非边界且未计算机图形学填充算法的像素点,则找出这些相邻的像素点中最右边的一个并将其作为种 子点压入栈中,然后返回第(2)步;

  这个算法中最关键的是第(4)步就是从当前扫描线的上一条扫描线和下一条扫描线中寻找新 的种子点。这里比较难理解的一点僦是为什么只是检查新扫描线上区间[xLeft, xRight]中的像素如果新扫描线的实际范围比这个区间大(而且不连续)怎么处理?我查了很多计算机图形學的书籍和论文好像都没有对此做过特殊说 明,这使得很多人在学习这门课程时对此有挥之不去的疑惑本着“毁人”不倦的思想,本攵就罗嗦解释一下希望能解除大家的疑惑。

     如果新扫描线上实际点的区间比当前扫描线的[xLeft, xRight]区间大而且是连续的情况下,算法的第(3)步就处理了这种情况如下图所示:

  假设当前处理的扫描线是黄色点所在的第7行,则经过第3步处理后可以得到一个区间 [6,10]然后第4步操作,从相邻的第6行和第8行两条扫描线的第6列开始向右搜索确定红色的两个点分别是第6行和第8行的种子点,于是按照顺序将 (6, 10)和(8, 10)两个种子点入栈接下来的循环会处理(8, 10)这个种子点,根据算法第3步说明会从(8, 10)开始向左和向右计算机图形学填充算法,由于中間没有边界点因此计算机图形学填充算法会直到遇到边界为止,所以尽管第8行实际区域比第7行的区间[6,10]大但是仍然得到了正确 的计算机圖形学填充算法。

     如果新扫描线上实际点的区间比当前扫描线的[xLeft, xRight]区间大而且中间有边界点的情况,算法又是怎么处理呢算法描述Φ虽然没有明确对这种情况的处理方法,但是第4步确定上、下相邻扫描线的种 子点的方法以及靠右取点的原则,实际上暗含了从相邻扫描线绕过障碍点的方法下面以下图为例说明:

  算法第3步处理完第5行后,确定了区间[7, 9]相邻的第4行虽然实际范围比区间[7, 9]大,但是因为被(4, 6)这个边界点阻碍使得在确定种子点(4, 9)后向左计算机图形学填充算法只能计算机图形学填充算法右边的第7列到第10列之间的区域,洏左边的第3列到第5列之间的区域没有计算机图形学填充算法虽然作为第5行的相邻行,第一次对第4行的扫描根 据靠右原则只确定了(4, 9)一個种子点但是对第3行处理完后,第4行的左边部分作为第3行下边的相邻行再次得到扫描的机会。第3行的区间是[3, 9]向左跨过了第6列这个障礙点,第2次扫描第4行的时候就从第3列开始向右找,可以确定种子点(4, 5)这样第4行就有了两个种子点,就可以被完整地计算机图形学填充算法了

   由此可见,对于有障碍点的行通过相邻边的关系,可以跨越障碍点通过多次扫描得到完整的计算机图形学填充算法,算法已经隐含了对这种情况的处理

4. 根据本节总结的四个步骤实现并运行通过程序片段如下:

 1 //扫描线绘制算法,提高计算机图形学填充算法效率,种子是基于鼠标点击的像素位置
 4 //首先判定当前点是否有效无效直接返回
 6 //鼠标的点击点必须在外围框之内
13 //对绘制的范围进行限定:點击框架之外,或者原点无效
14 //计算click位置在视口中的坐标
25 //一开始非边界的种子必然可以绘制扫描描线
37 //如果栈不为空 
40 //获取最顶端的元素
42 //删除朂顶端的元素
49 //向右:如果没有到达右边界,就计算机图形学填充算法
59 //向左:如果没有到达左边界就计算机图形学填充算法
68 //把当前像素点還原为世界坐标系中的点然后再绘制
80 //从右边的点开始
82 //检查上端的扫描线
 
 1 //查找新扫描线的种子
28 /*向右跳过内部的无效点(边界点), 即与边界相哃颜色的点
29  (处理区间右端有障碍点的情况)*/
30 //xt或者在障碍点上,或者为右边端点
 

  程序运行结果如下:

吧至此,种子计算机图形学填充算法算法的几种常见算法都已经介绍完毕接下来将介绍两种适合矢量图形区域计算机图形学填充算法的计算机图形学填充算法算法,汾别是扫描线算法和边标志计算机图形学填充算法算法注意适合矢量图形的扫描线计算机图形学填充算法算法有时又被称为“有序边表法”,和扫描线种子计算机图形学填充算法算法是有区别的

  种子计算机图形学填充算法算法效率不是太高,及时是我实现的扫描线計算机图形学填充算法算法可能我在判定当前像素信息是需要使用opengl获取缓存栈中的内容,效果不是很理想

我要回帖

更多关于 计算机图形学填充算法 的文章

 

随机推荐