Geometry 如何将由小正方形组成的区域划分为更大的矩形?

Geometry 如何将由小正方形组成的区域划分为更大的矩形?,geometry,2d,area,rectangles,Geometry,2d,Area,Rectangles,我应该在哪里寻找算法,将0或1作为输入值的2d网格,然后识别其中所有可能的非重叠矩形 在一个更实际的解释中:我正在绘制一个由多个正方形表示的网格,我希望找到一种方法,将尽可能多的相邻正方形组合成矩形,以减少在每个正方形中循环并绘制的时间 不需要最大效率,速度更重要 附录:显然,我要寻找的似乎是一种称为Tesselation的技术。现在我只需要为这个具体的案例找到一个好的描述 附录2:“1”正方形的边界将是不规则的,在某些情况下甚至没有连接,因为“1”正方形的分布将是完全随机的。我需要识别这些不规

我应该在哪里寻找算法,将0或1作为输入值的2d网格,然后识别其中所有可能的非重叠矩形

在一个更实际的解释中:我正在绘制一个由多个正方形表示的网格,我希望找到一种方法,将尽可能多的相邻正方形组合成矩形,以减少在每个正方形中循环并绘制的时间


不需要最大效率,速度更重要

附录:显然,我要寻找的似乎是一种称为Tesselation的技术。现在我只需要为这个具体的案例找到一个好的描述

附录2:“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
这将减少对draw box的调用次数,而无需任何缓存(即,您可以动态构建您的box)


如果你想创建更大的盒子,我建议使用回溯算法,找到第一个1,然后尝试向各个方向展开盒子。创建一个框列表,并在使用它们时清除1:s。

我已经使用OpenGL对3d框进行了类似的快速脏体素可视化

我从左上角的框开始存储空/满标志。然后我试着向右扩展矩形,直到我碰到一个带有不同标志的框。我在向下方向也做了同样的事情

绘制矩形(如果已填充)

如果有框重新生成,则递归地对最后一个矩形(右、下和右下)生成的所有三个重新生成矩形重复此过程:

xxxx   1111
xxxx   1111
xxxx   1111

2222   3333
2222   3333
2222   3333

看看如何在你的情况下找到一个最大的矩形。这是一个非常详细的关于一个非常有效的算法的讨论,我认为迭代地重复它可能会解决您的问题。

我必须解决一个类似的问题,我的算法支持锯齿阵列,我已经对它进行了大量测试和评论,但它比joel-in-gö的建议慢:

“不需要最高效率,速度更重要。”-嗯?我假设你的意思是“我不想要绝对最小数量的矩形,只是一些能够很快实现良好近似的东西”…?哦,你证明了在每个正方形中循环是你的性能瓶颈吗?关于近似,是的,那就是。我基本上是在寻找效率与速度之间最平衡的解决方案。另外,是的,我100%确信循环是瓶颈,因为Perl比OpenGL本身慢得多。您的数据是静态的吗?也就是说,它值得缓存吗?根据使用情况,它大约每3-30分钟改变一次。事实上,该算法将在创建另一个缓存时应用。最终目标是获得一个边界框,用于3d渲染过程中的遮挡检查。补充说明见附录3。谢谢你帮我澄清。:)是的,这正是我想要的。我已经考虑过一维,但希望其他人已经花时间思考如何在二维中进行。是的,除非其他人提出更好的解决方案,否则我将这样做。:)