如何随机放置矩形,重叠最小,色散很好

时间:2011-10-19 15:55:49

标签: algorithm random overlap

我想将任意数量的矩形放入固定大小的父级中,以便它们是:

  1. 随机放置
  2. 随机旋转到给定度范围
  3. 很好地分散在中心点周围(并非所有人都聚集在一个角落)
  4. 由于空间不足,除非必要,否则不重叠
  5. 在必要时最小重叠
  6. 为了帮助您可视化问题,我想在窗口内分散图像,供用户选择。

    谷歌搜索引导我做各种包装等算法,但没有真正满足我的要求。

    有没有人有什么好主意?

3 个答案:

答案 0 :(得分:2)

它不应该比:

复杂得多
  1. 随机旋转将新矩形放置在随机位置。简单地使用三个随机值(x,y,r)应该这样做,除非你想要随机大小(在这种情况下你也需要w和h)。这不应该给任何角落聚集(通过随机是随机的)。
  2. 对于已放置的每个矩形,检查是否有碰撞。 Here's one way.同时检查与窗口侧面的碰撞(如果您不希望事物延伸到屏幕之外);在边界周围放置四个虚拟矩形可能是一种廉价的方法。
  3. 如果存在任何碰撞,则有两种选择:将新矩形移动到新的随机位置,或者将新矩形和阻挡矩形彼此远离,直到它们不再接触为止。两者都有yay和nays - 只移动新的更快更容易,但如果页面真的满了它可能找不到它适合的地方;移动两者几乎肯定是成功的,但需要更长时间,可能会导致链式反应碰撞,所有这些都必须以递归方式进行整理。
  4. 在任何情况下,您都希望尝试保持矩形的数量较小,因为比较的数量很快就会变得非常大。使用短路(例如“如果它们在屏幕的中间位置,那么请不要仔细查看”)可能有所帮助,但不是保证。

    编辑:好的,所以要求#5。有可能推动两个矩形 - 直到它们 - 不再 - 碰撞 - 递归添加新矩形的方法将最终成为最简单的方法 - 只需在几千次迭代后切断循环,一切都会试图尽可能远离其他一切,留下最小的重叠。或者,让方法在一个单独的线程中运行,以便用户可以看到它们随着更多的添加而扩散(也可以阻止它看起来像是在思考时锁定),一旦没有矩形移动超过X单位,就停止迭代。

答案 1 :(得分:1)

这个怎么样?考虑一下你必须放置的矩形,这些矩形是带状的,带电的粒子彼此排斥,并且也被容器的壁排斥。您可以从容器中(随机)分配它们(并给它们随机角度)开始,然后运行模拟,其中每个“粒子”响应于作用在其上的力而移动(角度将根据这些力的转动力矩而改变) )。在满足公差范围内的配置时停止。

您可以通过将每个矩形视为椭圆来简化计算,可以通过将每个椭圆视为经过缩放和旋转的圆来进一步简化计算。

答案 2 :(得分:0)

我不明白要求2.您是说矩形本身围绕矩形中心点旋转,或者矩形仅覆盖围绕所有矩形中心点的360度圆的一部分。

我不确定随机是否可行。

简单地将所需的矩形数量除以360度。这是在绘制每个矩形时偏移的度数。这应该包括要求3,4和5。