[英]Optimizing a function to place circle in position which does not overlap other circles
[英]Avoiding collision when placing a circle near other circles
这可能是Placing a circle so it does not collision with any other circles的副本,我觉得这没什么好印象的。 既是问题也是答案。
这是一个大概的图像,解释如下:
算法输入:主圈和其他圈。 上图所需的算法 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.