繁体   English   中英

将一个圆圈放在其他圆圈附近时避免碰撞

[英]Avoiding collision when placing a circle near other circles

  • 我有一个主要圈子和其他附近的圈子。
  • 所有圆圈的大小始终相同。
  • 任何两个圆圈都不能重叠。
  • 我想找出潜在圈子可以放置在圈子附近的位置(下面有更多详细信息)。
  • 理想情况下,我想快速完成此操作(我知道,每个人都这么说 - 但相信我,我真的这样做了。)。
  • 我希望答案是对要使用的算法的一般高级描述。

这可能是Placing a circle so it does not collision with any other circles的副本,我觉得这没什么好印象的。 既是问题也是答案。

这是一个大概的图像,解释如下:

很多圈子

  • 红圈圈。
  • 黑色圆圈是附近放置的其他圆圈。
  • 每个Potential圆的中心应该在黄色带上 这是一个相对较窄的范围,比圆的半径略窄,我对任何圆心在这个范围之外的圆都不感兴趣。
  • 灰色是我希望算法找到的潜在圈子:
    1. 右上角的那个,尽可能靠近圆圈。 如果它周围的三个其他圆圈中的任何一个向它的中心靠近一点,这里就没有潜在的圆圈。
    2. 右下方,在允许的范围内尽可能远离圆。 如果旁边的两个Other圆圈靠得再近一点,这里就没有势能圆圈了。
    3. 左边画了四个电位圈。 这些可能有很多,如果算法只返回其中的任何一个就好了。
  • 青色圆圈是一个边界框,如果圆心在外面,则不会影响将圆圈放在黄色带上。

算法输入:圈和其他圈。 上图所需的算法 output:三个或四个潜在的圆圈。 一个在右上方,一个在右下方,还有一个或两个在左侧(我不太介意它是哪个)。


我尝试了什么? 谷歌搜索。 查看堆栈溢出。 思维。

我在想算法应该做的第一件事可能是将其他圆从(X, Y)坐标转换为(angle, distance) from Main并按角度排序。 然后将黄色带分成一些段,对于每个段,得到所有可能影响它的圆圈。

在这里我有点迷路了。

下一步,做一些数学来尝试 position 这个圆。 对于两个圆圈,我可以放置一个圆圈,使其恰好接触到它们。 也许当有 N 个圆圈时,我只需为每一对做这个,看看我是否还剩下什么? 或者只是每个 N 的中心? 我可以将其保存为草稿,以便在我再考虑时它不会全部消失吗?

[编辑]:我想更好的方法是从主圈周围的 12 个潜在圈开始,看看哪些是非法的,哪些其他圈挡住了路,然后尝试轻推潜在圈,使它们脱离其他石头方式。 我们应该确切地知道我们需要将 Potential Stone 移动多远以及向哪个方向移动,这取决于它与哪个 Other Stone 重叠。 重复,希望避免无限循环,但我认为我能做到。

这是一个很好的问题。 让我们关注一个词:潜力。

想想力导向图布局,就像这样:

https://observablehq.com/@d3/temporal-force-directed-graph

最终,布局收敛于最小能量解决方案,其中 spring 长度最小。

让我们把它带到你的问题。 我们将定义一个势场。 主圆和其他圆提供排斥力。 黄色环提供吸引力。

在平面上选择一个随机点。 判断是否可行,不可行则拒绝,例如与main或其他circle重叠。 现在我们在一个可行但非最佳的位置留下了一个圆圈。 我们将在几个时间步长内将这个圆圈移动到新的候选位置。 将作用在其上的吸引力和排斥力相加,然后将其向指定方向移动少量。 在某些时候,它很可能会尝试将 go 变为不可行的 position,可能与主圈重叠。 到那时我们就完成了,我们 output 其 position 作为一个好的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM