【问题标题】:Need help merging some rectangles需要帮助合并一些矩形
【发布时间】:2017-09-04 18:36:51
【问题描述】:

嗨,我在左边有一个乱七八糟的东西,它几乎是一个带有一些孔的矩形阵列(标记为红色)。我正在寻找一种方法来组合它们,以使我最终得到尽可能少的矩形,并且最好让它们中的大多数尽可能接近正方形。看右边的图片,这就是我想要完成的事情,只是更漂亮一点,最好更自动化一点。

我在游戏中需要这个,它不会在运行时完成,所以速度并不是一个真正的问题(除非它非常慢,因为我必须在相当大的区域内完成)但我从来没有以前做这样的事情,老实说,我什至不知道从哪里开始。

我已经尝试过暴力破解数组,从左上角的正方形开始并进行某种合并,直到没有任何东西可以合并,但它确实效率不高,因为它不能考虑合并矩形 3x2、4x3、等等。

如果您能指出任何可以处理此类事情的算法,或者知道如何实现这一点,我们将不胜感激。谢谢!

【问题讨论】:

  • 不久前我遇到了一个类似的问题:stackoverflow.com/questions/11002205/… 但是在我的情况下,生成的矩形可能会重叠。也许您可以调整一下,找到所有最大尺寸的重叠矩形,然后对于被多个矩形覆盖的每个区域,将其添加到这些矩形之一。
  • 我完全理解,矩形是通过在一个大矩形上绘制垂直/水平线然后选择一些随机创建的矩形作为“红色”矩形创建的吗?
  • 不,我从一张只有红色矩形的工作表开始,然后在它们周围切割整张工作表。

标签: algorithm merge rectangles


【解决方案1】:

你可以试试贪心算法。当然它不会是最优的(好吧,你没有严格定义最优标准)。但也许它的性能足以满足您的需求。

所以你可以试试:

  • 找到一对可以合并最大总面积的矩形
  • 用新的替换它们 - 合并操作的结果
  • 重复直到找不到合适的一对

如果您还关心生成的矩形接近正方形,您可以尝试将a * totalArea + (1 - a) * (min_resulting_side/max_resulting_side) 之类的东西最大化,并将合适的值设为 0

【讨论】:

  • 盲目合并 2 个矩形的问题在于,可能会出现这个模因:i.imgur.com/4O1H1a6.png 如果我碰巧合并蓝色的,那么这会阻止形成巨大的白色簇,这显然会导致在最终列表中使用较少的矩形,这是一个重要的优先事项
  • @Otopkin 在我的算法中,每一步都必须合并构成最大面积的一对矩形。有了它,您还可以找到一个不是最佳的示例。我只是希望它对于您的实际应用程序来说已经足够好了。
  • 我可能会按照这些思路做一些事情,应该给出一个足够好的基线,以便我以后可以手动微调。我研究了一些多边形缩减算法,它们用于 3d 模型等,最坏的情况下,我可以将其转换为网格,在 Blender 中打开并使用他们的 rofl。
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 2011-10-12
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2013-10-29
相关资源
最近更新 更多