【问题标题】:How to arrange circles to use lowest possible space?如何安排圆圈以使用尽可能低的空间?
【发布时间】:2013-09-12 14:03:48
【问题描述】:

我正在使用 Javascript 构建一个配置工具,它以不同的方式计算电缆中继器的测量值。基本上,您可以输入电缆数量和电缆直径。现在我想将这些电缆可视化为具有给定直径的圆圈,并自动将它们打包在一起以尽可能少地占用空间。这里有两个例子:

7 根电缆打包在一起:

48 根电缆:

如您所见,我已经尝试通过使用物理引擎 (physics.js) 来实现这一点,并让重力自动以最佳方式排列元素。这在某种程度上适用于少量元素,但对于大量元素(> 20)需要相当长的时间才能完成,并且并不总是产生最佳结果。除此之外,我认为这种方式有点过头了。

有没有一种简洁的方法来计算 x 给定直径为 d 的圆的位置?甚至可能有一个框架或类似的框架来处理这些任务?我很好奇你的想法,在此先感谢。哦,顺便说一句,这不是家庭作业——我 35 岁以上 :-D

【问题讨论】:

  • 只是给您一个起点:当您查看围绕另一个圆的圆时,当所有圆的直径相同时,您可能会注意到外圆的中心构成了一个漂亮的正六边形。事实上,六边形网格是填充圆圈的最佳方式。也许你可以从这里算出(或谷歌)数学:)
  • @pawel:+1 我必须用谷歌搜索它! :) 显然一些数学家和物理学家也喜欢这个查询:en.wikipedia.org/wiki/Circle_packing_in_a_circle
  • 小世界!!我早在 19 年前就从斯泰森大学毕业了!
  • 嗯,可能仍然是家庭作业.. :-P 但我相信这对 SO 来说是题外话,因为它更像是一个数学问题而不是代码问题。为什么不检查math.stackexchange.comphysics.stackexchange.com(但是,线条模糊)。
  • @Robert Gravity 可能不会产生最佳结果,但我对这种方法印象深刻。

标签: javascript math optimization geometry


【解决方案1】:

如果“最小可能空间”是指“包含在最小区域”(或“被最紧密的凸包包围”),您可能会发现检查article in Wikipedia about circle packing 很有用:

在二维欧几里得空间中,约瑟夫·路易斯·拉格朗日证明了 1773年,密度最高的圆的格子排列 是六边形堆积排列,其中的中心 圆形排列成六边形格子(交错的行,像 蜂窝),每个圆圈被其他 6 个圆圈包围。

您能否将您的算法建立在这一发现的基础上?我在想的是:从至少覆盖电缆数量的“微不足道”的六边形排列开始,然后开始迭代外圈并移除离中心圈最远的那个。继续,直到你得到你需要的确切数量的圈子。

如果你这样做,你可以节省计算“你已经知道的”的时间。也就是说,如果你有七个圆圈,你就知道它是一个中间有一个圆圈的六边形,句号。如果你有 8 个圆,你从 12 个圆的六边形开始,其中包含 6 个圆的六边形,其中包含 1 个圆:总共 19 个圆(12 + 6 + 1)。您开始从外六边形(有 12 个圆圈的那个)中删除圆圈,直到删除 11 个,并且您剩下 8 个圆圈(1 + 6 + 1)处于最佳排列。

【讨论】:

  • 或者你也可以做相反的事情,简单地添加一个六边形图案的圆圈。下一步是找出一种算法来快速计算中心坐标
  • 感谢您的回答,Arrieta,让事情变得清晰。我同意 slebetman,我可能会从中心开始,并继续在它周围添加六边形圆圈。我接受了您的回答,因为它为相同大小的圆提供了最佳解决方案(最小面积!= 最小封闭圆直径)。
【解决方案2】:

这个算法并不总能找到经过验证的最佳解决方案(这很难,因为for most numbers over 13 the best known configuration has not yet been proven to be ideal),但在大多数情况下,它至少应该给出一个“相当不错”的解决方案:

  • 从一个中心圆开始并放置
  • 每增加一个圈子
    • 找到最接近中心圆的角度 与已放置的圆圈重叠
    • 把它放在那里

此算法的时间复杂度取决于您找到新圆的最近位置的效率。通过一些优化,您应该能够使其与圈数成线性关系。这意味着算法的整体复杂度将是

【讨论】:

  • 感谢您的回答!据我所知,您的解决方案也有效,但它是一种更通用的方法,因为您可以将它用于圆直径不同的情况(这在后一个版本中可能会变得有趣)。
猜你喜欢
  • 2023-03-23
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多