我想将任意数量的矩形放入一个固定大小的父对象中,以便它们是:
随机放置
在给定的度数范围内随机旋转
很好地分散在中心点周围(不是全部聚集在一个角落里)
除非由于缺少空间而有必要,否则不重叠
必要时最小重叠
为了帮助您直观地看到问题,我想将图像分散在一个窗口中,供用户选择。
google让我做了各种打包算法,但没有什么能真正满足我的需求。
有人有什么好主意吗?

最佳答案

它不应该比:
将新矩形随机放置在具有随机旋转的位置。简单地使用三个随机值(x,y,r)就可以了,除非你也需要随机大小(在这种情况下你也需要w和h)这不应该产生任何角聚集(通过随机是随机的)。
对于已经放置的每个矩形,检查是否有冲突Here's one way.还要检查与窗口侧边的冲突(如果不想让内容超出屏幕);在边框周围放置四个虚拟矩形可能是一种廉价的方法。
如果有任何冲突,则有两种选择:要么将新矩形移动到新的随机位置,要么将新矩形和块矩形彼此移开,直到它们不再接触。两者都有优缺点——如果页面真的满了,只移动新的页面可能永远找不到合适的位置,但移动新的页面会更快更容易;移动两者几乎肯定会成功,但需要更长的时间,并可能导致链式反应碰撞,所有这些都必须递归地进行排序。
在任何情况下,您都需要尽量减少矩形的数量,因为比较的数量会很快变得非常大。使用短路(例如“如果它们在屏幕的中间,那么就不用仔细观察”)可能会有帮助,但并不能保证。
编辑:好的,所以要求5。很有可能,推两个矩形,直到它们不再递归地碰撞,添加新矩形的方法最终将是最简单的方法-在几千次迭代之后,只要切断循环,所有的东西都将试图尽可能远离其他任何东西,留下最小的重叠或者,让这个方法在一个单独的线程中运行,这样用户可以看到它们随着更多的添加而展开(也可以阻止它看起来像是在思考时被锁定),一旦没有一个矩形在一次迭代中移动了超过x个单位就停止。

关于algorithm - 如何以最小的重叠和良好的分散性随机放置矩形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7824236/

10-09 00:57