5

我对 iPhone 开发非常陌生。我想在 iPhone 中使用 FloodFill 算法创建一个应用程序。我对FloodFill一无所知。请解释一下 FloodFill 算法的目的。如果您提供 FloodFill(iPhone) 的示例应用程序,则意味着我真的非常非常高兴。因为我从早上开始就在探索 FloodFill,但是我什么也没找到。

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

请帮助我做到这一点。

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

4

3 回答 3

6

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

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

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

 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),那里的颜色相同(一个点),因此它将从那里开始另一个泛洪填充。对于down(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........

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

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

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

因此洪水填充从 (4,4) 继续,向右和向下分支。然后,这两个分支之一将分支到 (5,5)。到那时,将不会有更多可能的分支。

那是我的午餐时间:)

于 2011-02-01T13:14:14.470 回答
3

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

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

  2. “选择一个点并填充”类型的算法?有点像您在绘画程序中看到的旧的“油漆罐”洪水填充工具(好吧,至少您曾经看到过,这对我来说已经很长时间了)(我在这里想到的是 MacPaint / Deluxe Paint 时代)。这些算法的范围很广,从在碰到“边缘”时“停止”的微不足道的2D 像素平面(通常与洪水填充开始的“颜色”不同),一直到非常复杂的自动边缘检测算法您可能会在高端绘画/照片处理程序(即 PhotoShop)中看到。

我假设您不会在寻找任何琐碎的案例,因为......好吧,在您尝试破解这个之前,您可能还有一些其他的坚果需要破解。

因此,在 #1 的情况下,您可能应该从阅读文档开始。Mac OS X / iOS 具有极其复杂的 2D 图形 API,主要基于 PDF / PostScript 渲染模型。CoreGraphics / Quartz 会自动为你做“flood fill”,你可以在 Bézier 曲线的级别上做它来启动。

在 #2 的情况下,您可能应该从阅读完全相同的文档开始。无论如何,您可能必须在此级别上与之交互。但是,OpenGL + 可编程着色器可能是更好的选择,这取决于您希望“自动”边缘检测的复杂程度。但是根据我的经验,像这样直接敲击渲染管道的人通常对用于操作像素数据的基本算法有很好的掌握,所以我怀疑这种技术可能不适合你。

在同一上下文中混合 CoreGraphics 和 OpenGL 是一种高级技术,因此您可能必须选择 CoreGraphics 或 OpenGL 作为您的主要渲染 API。然而,CoreGraphics 也有一些非常先进和时髦的 API 来做相同类型的事情,但这超出了你的基本 CoreGraphics API 使用(但你可以通过浏览各种 iOS 图形文档找到所有信息,这两者都是广泛且有据可查)。

于 2011-02-03T07:46:23.570 回答
2

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

希望这可以帮助。

于 2011-02-03T06:58:41.643 回答