我将去哪里寻找采用0或1的2d网格作为输入的算法,然后识别其中所有可能的非重叠矩形?
在一个更实际的解释中:我正在绘制一个由多个正方形表示的网格,我希望找到一种方法将尽可能多的相邻正方形组合成矩形,以减少花费的时间骑自行车穿过每个广场并画画。
不需要最高效率,速度更重要。
附录:显然我正在寻找的似乎是一种称为Tesselation的技术。现在我只需要为这个具体案例找到一个很好的描述。
附录2:“1”方格的边界将是不规则的,在某些情况下甚至不连接,因为“1”方格的分布将是完全随机的。我需要识别这些不规则的形状并将其拆分成规则的矩形。
正确答案:为了在速度和效率之间取得最佳平衡,最好使用网格数据填充四叉树,每个节点的状态值为空/部分填充/填充。
答案 0 :(得分:2)
在您的情况下查看this article from Dr Dobb's Portal查找最大矩形。这是一个非常有效的算法的非常详细的讨论,我认为迭代地重复它可能会解决你的问题。
答案 1 :(得分:1)
由于您没有寻找最小数量的正方形,我建议使用折衷方案,这仍然可以使您的算法变得简单。
最佳解决方案取决于您的数据,但一个简单的替代方案是只收集一行的方框。即:
0 0 1 1 1 0 0 0 1 1 1 1 0
将导致:
skip 2
draw 3
skip 3
draw 4
skip 1
这将减少绘制框的调用次数而不需要缓存(即您可以动态构建框)。
如果你想创建更大的盒子我会建议你回溯算法,你找到第一个1并尝试在所有方向扩展盒子。构建一个框列表,并在使用它们时清除它们。
答案 2 :(得分:1)
我已经做了类似的事情,用于使用OpenGL进行快速而肮脏的3D盒子体素可视化。
我从左上方框开始并存储空/填充标记。然后我尝试将矩形展开到右边,直到我打到一个带有不同标志的框。我在向下的方向做了同样的事。
绘制矩形(如果已填充)。
如果有剩余的框,则递归重复由最后一个矩形(右边,右下角和右下角)引起的所有三个剩余矩形的过程:
xxxx 1111
xxxx 1111
xxxx 1111
2222 3333
2222 3333
2222 3333
答案 3 :(得分:0)
所以你正在寻找'ON'方块的矩形边界?
你想要内在还是外在的?
即。边界必须只有“ON”方块,或者您是否希望矩形包含组中的所有“ON”方块?
答案 4 :(得分:0)
我必须解决一个类似的问题,我的算法支持锯齿状数组,我经过了大量的测试和评论,但它比joel-in-gö的建议要慢: https://stackoverflow.com/a/13802336