【问题标题】:Split grid up into random sized rectangles将网格分割成随机大小的矩形
【发布时间】:2011-09-04 14:29:46
【问题描述】:

我有一个 500 x 400 像素的正方形,里面有一个 100 像素的网格。现在我想用与网格对齐的更小的随机大小的正方形填充那个正方形。这意味着较小的正方形的大小可以是 100、200、300 或 400 像素。它们的大小和位置需要是随机的,因此每次运行时输出看起来都会有所不同。

此图像显示了大正方形、它的网格以及我正在尝试创建的带有较小正方形的可能输出。

我在 Ruby / Sinatra 中使用 DIV 生成这个,但我想这个问题对于实际使用的算法更普遍。

关于如何用最少的代码做到这一点有什么建议吗?

【问题讨论】:

  • 给定一个正方形,放置它的位置是有限的。如果您不担心速度:生成最大的随机正方形大小;把它放在所有可能的地方;随机选择一个并放上去。如果没有可能的位置,请减小最大尺寸。

标签: ruby algorithm geometry sinatra


【解决方案1】:

这种方法需要很多代码,但我想我会使用 Donald Knuth 的 Dancing Links 算法 (DLX)(或其他算法)来查找 所有 em> 可能的正方形排列。您可以提前计算安排,然后在需要时快速/随机选择一个。

您可以在此处阅读他关于算法及其在五联骨牌中的应用(与您的问题非常相似)的论文:

http://www-cs-faculty.stanford.edu/~uno/papers/dancing-color.ps.gz

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

【讨论】:

    【解决方案2】:

    您可以采用一种简单的递归方法来产生相当好的随机分布,如下所示:作为基本情况,任何 100x100 的网格都必须用 100x100 的正方形填充。否则,如果网格是 n x n 的一些 n 小到足以容纳一个正方形,您可以选择用该大小的正方形平铺它。否则,选择矩形中不是大小为 100 的边,随机选择一个 100 倍数的位置,然后将其分成两半并递归平铺两半。

    这种方法的主要优点是您永远不必跟踪放置旧矩形的位置以避免碰到它们。您总是使用空矩形并以确保区域永远不会重叠的方式不断递归地细分问题。

    这可能并不总是产生好的结果,但它很容易编写代码(我假设总共可能有 15-25 行代码)并且可以轻松调整以更改输出。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2018-10-03
      • 1970-01-01
      • 2014-09-08
      相关资源
      最近更新 更多