【问题标题】:Random rectangles placement with minimal overlap and good dispersion具有最小重叠和良好分散性的随机矩形放置
【发布时间】:2013-03-17 15:57:38
【问题描述】:

我有一个大矩形(面向轴),其中包含许多小矩形(与父级相同的方向,固定大小为 82x176 像素)。

现在我有一个在外面的小矩形,我必须把它放在大矩形里面,这样它是: - 随机放置; - 除非由于空间不足而必要,否则不要与其他小矩形重叠(在这种情况下,重叠最少)。

在我的代码执行期间将多次使用的算法还需要包含一个良好的分布,以便小矩形很好地分散在大矩形的中心周围,而不是全部聚集在一个角落。

谷歌搜索,我发现了几种关于矩形打包、最大空矩形、随机分布的算法......但没有一个能真正满足我的要求,也没有显示出良好的代码实现。

有没有人有什么好主意(代码或伪代码更好,如果可能的话,因为通常当我看到数学公式时我的大脑会崩溃)?

【问题讨论】:

  • 小矩形的坐标是任意的还是 82*n, 176*m ?
  • 它们必须是任意的。
  • IDK 是肯定的,但我会使用您之前问过的empty rect 并从最小距离删除开始,然后从任何地方开始并将小矩形放置在那里的任何地方,如果它适合的话。无论如何,您都必须做最大的空矩形问题才能获得最小的重叠。
  • 问题是我什至无法为最大的空矩形问题找到一个好的实现。要获得良好的分发效果并不容易。
  • 您的要求是矛盾的:小矩形放置不能既随机在最小化重叠和最大化分散的位置

标签: c# random geometry distribution bin-packing


【解决方案1】:

您的问题太模糊,太难了,任何人都无法发布解决方案;这不是解决方案。相反,它是关于如何解决这类问题的一课。从阅读以下内容开始:

http://en.wikipedia.org/wiki/How_to_Solve_It

也许当你在看这本书的时候拿起一本。

正如波利亚所说的那样

如果你不能解决一个问题,那么你可以解决一个更简单的问题:找到它。

这是您的问题的一个更简单的版本:

我有一条直线。在这条线上,我有一组线段。集合中每条线段的起点和终点都在 0 和某个参数 n 之间,包括在内。一些线段可能会相互重叠。

给定一条新线段的长度,小于 n,随机放置新线段,使其起点和终点都在 0 和 n 之间,并且它不会“重叠”集合中的任何线段。如果这样做是不可能的,则计算新线段的开始和结束坐标,以最小化它的重叠量。

你能给我写一个 C# 中那个问题的解决方案吗?相信我,如果你不能解决更简单的问题,那么你永远不会解决矩形版本。

如果你不能解决那个问题,那么再次让它更容易直到你可以解决它。如果 n 永远不会大于 200 怎么办?如果现有段的集合只有零个、一个或两个元素怎么办?如果新段的长度总是三怎么办?如果你摆脱随机性的要求怎么办?如果你摆脱了最小化问题怎么办?等等。 继续让问题变得更简单,直到你能解决它。一旦你对更简单的问题有了解决方案,试着把它变成更大问题的解决方案。通过练习解决更简单的问题,您将深入了解如何解决更难的问题。

【讨论】:

    【解决方案2】:

    根据您的需要,某些东西可能已经存在。例如,如果您正在开发 Web 应用程序,请查看 jQuery Masonry:http://masonry.desandro.com/demos/basic-multi-column.html

    如果该代码满足您的需求,但您不是在开发网络应用程序,那么也许您可以检查源代码以获得您需要的东西。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      相关资源
      最近更新 更多