嘿大家好。我真的很难搞清楚这个逻辑,希望你能帮我。在我继续之前,我只想告诉你,我是业余程序员,也是一个初学者,没有任何形式的正式计算机科学培训,所以请容忍我。:D另外,我使用的是Python,但我可以使用Java或类似的工具。
不管怎样,我希望实现一个地区的增长,在一个初步的Drawbot使用。
这里有一篇关于区域增长的文章:http://en.wikipedia.org/wiki/Region_growing
按照我的设想,绘图所基于的图像将满足以下条件:在任意颜色深度下,图像大小最多为3x3英寸
图像将是白色背景上的黑色连续形状
形状可以位于背景上的任何位置。
我已经考虑过这个问题的下列解决办法。虽然有些工作在一定程度上,但它们在性能或可行性上都有一些相当大的缺陷(至少在我看来是不可行的)。此外,由于这是一个Drawbot,这需要用一条连续的线来完成。但这并不意味着我不能回溯,它只是消除了多个起点(种子)的可能性。
考虑的方法:
随机行走:
我的第一直觉是用随机行走来解决这个问题。我想,实现这一点的随机行走程序应该是这样的:
伪python。。。Cells To Visit = Number of Black Cells
Cells Visited = 0
MarkColor = red
While Cells Visited < Cells To Visit:
if currentcell is black:
Mark Current Cell As Visited #change pixel to red
Cells Visited +=1
neighbors = Get_Adjacent_Cells() #returns cells either black or red
next cell = random.choose(neighbors)
currentCell = next cell
虽然我认为这是可行的,但在我看来,这是非常无效的,并不能保证良好的结果,但为了实际完成一些事情,我可能最终尝试这个。。。我在伪代码中的逻辑是不是还模模糊糊地正确?
扫描模式:
在我看来,这个方法是最容易实现的。我的想法是我可以在形状的一个极端选择一个起点(例如,最左下点)。从那里开始,它会向右移动,只在x轴上移动,直到它碰到一个白色像素。从这里开始,它将在y轴上向上移动一个像素,然后在x轴上向左移动,直到达到一个白色像素。如果正上方的像素碰巧是白色,则在x轴上回溯,直到在其上方找到一个黑色像素。
经进一步检验,这种方法有一些主要缺点。
当面对这样的形状时:
结果如下:
即使我告诉它过一段时间后开始清扫,中腿仍然会被忽略。
4/8连通邻域:
在我看来,这种方法是最强大和最有效的,但在这一点上,我无法完全搞清楚,我也无法考虑如何在不可能留下一些被忽视的领域的情况下实现它
在每一个单元中,我都会查看相邻的黑单元,设计一些方法来排列我应该首先访问哪个单元,访问所有的黑单元,然后重复这个过程,直到所有的单元都被覆盖。
我在这里看到的问题首先是处理实现这一点所必需的数据结构,而且仅仅是找出其背后的逻辑。
这些是我能想到的最好的解决办法。谢谢你花时间读这篇文章,我意识到它很长,但我想我应该尽可能地把它说清楚。任何和所有的建议将非常感谢。。。谢谢!
编辑:
我也研究了迷宫生成和求解算法,但不知道如何在这里实现。我对迷宫求解算法的理解是,它们依赖于迷宫通道的宽度相等。我当然可能错了。