我需要在java中的2D网格中找到“洞” - 你能指点我做最好的算法吗?
输入以下几点:
5,3
5,4
8,4
5,5
6,3
7,3
7,4
6,5
我需要弄清楚这个网格中“洞”或包围空间的位置。关于如何做到这一点,我有点迷失。
积分图:
假设每个点都是1x1
答案 0 :(得分:1)
这基本上是一个blob提取算法+一点额外的。这样做:
1)找到最西端,最东端,最北端和最南端的任何固体。记住它们为xmin xmax ymin ymax。
2)用这些尺寸分配一个2d的整数数组(初始化为0),并将所有实心点放在其中作为值-1。
3)将计数器初始化为1.扫描2d阵列。每当您找到一个0的点时,将其设置为counter
并将counter
填充到每个不是-1的相邻点上,直到您的点数用完为止。 (要进行填充,一种方法是保留一组尚未填充所有邻居的所有点,并迭代这些点,向集合中添加新点,直到集合耗尽 - >没有任何剩余的填充物。)现在递增计数器并继续。
4)当您扫描整个网格时,扫描周边。每次在外围看到非-1时,将该blob标记为未被包围(通过使用bool数组,只要找到blob的数量)。
5)你没有标记的每个编号blob都被包围了。
在此处阅读blob提取:http://en.wikipedia.org/wiki/Blob_extraction