iPhone中的FloodFill

时间:2011-02-01 12:43:39

标签: iphone colors flood-fill

我对iPhone开发很新。我想在iPhone中使用FloodFill算法创建一个应用程序。我不知道FloodFill。请向我解释FloodFill算法的目的。如果您为FloodFill(iPhone)提供示例应用程序意味着我真的非常非常高兴。因为我从早上开始探索FloodFill但是,我找不到任何东西。

我的任务是,我想用颜色逐个填充图像。这意味着,如果我选择一种颜色并单击图像的特定区域,则意味着它会以所选颜色着色。

请帮我这样做。

编辑:我无法为iPhone编写洪水填充算法实现的代码。

3 个答案:

答案 0 :(得分:6)

这是一个递归算法,意味着它会调用自己来完成整个过程的较小部分。

洪水填充将从一个像素开始。然后它将检查四个相邻的像素(上,下,左,右)。对于与我们开始使用的颜色相同的四个像素中的任何一个,它将从该像素开始调用另一个填充填充。

想象一下小图片在哪里。是一种颜色,X是另一种颜色。这些数字仅供参考,所以7,0是右上角。 (忽略红/黑语法hilighting!)

 01234567
0........
1.XXXX...
2.X..X...
3.X...X..
4.XXX..X.
5...X..X.
6...XXX..
7........

现在假设你在3,3开始填充洪水。它将改变3,3到新颜色。 然后它会检查,向下,向左,向右。 对于向上(3,2),颜色相同(一个点),因此它将从那里开始另一个洪水填充。 对于向下(3,4),颜色是不同的,所以这个分支将停止。 左,(2,3)和右(4,3)也是相同的(一个点),所以从那里开始更多的洪水填充分支。

假设新颜色是O,所以我们现在有了这个:

 01234567
0........
1.XXXX...
2.X.OX...
3.XOOOX..
4.XXX..X.
5...X..X.
6...XXX..
7........

“up”分支从(3,2)开始新的洪水填充。 从这里开始,是X,所以停止。右边是X,所以停止,向下是O,所以停止,但是左(2,2)是相同的(一个点),所以它从那里开始一个新的洪水填充。

同样,原始洪水填充的“右”分支从(4,3)开始。它可以使用的唯一分支是向下(4,4)。现在我们有了这个:

 01234567
0........
1.XXXX...
2.XOOX...
3.XOOOX..
4.XXXO.X.
5...X..X.
6...XXX..
7........

所以洪水填充从(4,4)开始,通过向右和向下分支。然后,这两个分支中的一个将分支到(5,5)。到那时,将不再有可能的分支。

那是我的午餐时间填满了:)

答案 1 :(得分:3)

这是一个非常奇怪的问题。你的意思是:

  1. “充满洪水”的多边形?其中 polygon 意味着从平凡多边形一直到复杂的偶数/奇数规则任意多边形填充(其中多边形可以由贝塞尔曲线路径定义)?

  2. “选择点和洪水填充”类型算法?有点像你看到的旧的“油漆罐”洪水填充工具(好吧,至少你曾经看过,这对我来说已经很长时间了)在油漆程序中(我在想MacPaint / Deluxe Paint时代)。这些算法适用于普通 2D像素平面的任何位置,当它到达“边缘”时“停止”(通常与填充开始的颜色不同),一直向上您可以在高端油漆/照片处理程序(即PhotoShop)中看到非常复杂的自动边缘检测算法。

  3. 我会假设你不是在寻找任何琐碎的案例,因为......好吧,在你试图破解之前,你可能还有一些其他需要解决的问题这个。

    因此,在#1的情况下,您应该从reading the documentation开始。 Mac OS X / iOS具有极其复杂的2D图形API,主要基于PDF / PostScript渲染模型。 CoreGraphics / Quartz会自动为你做“洪水填充”,你可以在Bézier曲线的水平上进行启动。

    在#2的情况下,您应该从reading the exact same documentation开始。无论如何,你可能不得不在这个级别与它进行交互。但是,OpenGL +可编程着色器可能是更好的选择,具体取决于您希望“自动”边缘检测的复杂程度。但是根据我的经验,直接敲击渲染管道的人通常很好地掌握了操作像素数据的基本算法,所以我怀疑这种技术可能不适合你。

    在相同的上下文中混合使用CoreGraphics和OpenGL是一种高级技术,因此您可能不得不选择CoreGraphics或OpenGL作为主要渲染API。然而,CoreGraphics还有一些非常先进和时髦的API用于执行相同类型的东西,但这远远超出了你的基本CoreGraphics API用法(但你会通过浏览各种iOS图形文档找到所有信息,这两者都是广泛而且有很好的记录)。

答案 2 :(得分:2)

您应该按照program编写自己的实现。

希望这会有所帮助。