gpt4 book ai didi

algorithm - 三边测量算法将 3 个圆定位为尽可能靠近而不重叠

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:46 24 4
gpt4 key购买 nike

我有两个圆圈,它们完美地位于彼此的边界上。它们具有位置 A 和 B(均为矢量),以及半径 Ra 和 Rb。

现在我添加第三个圆,半径为 Rc。如何找到三个圆尽可能靠近且不重叠的位置向量C?

我写这篇文章是为了我正在 build 的网站的插图,所以效率加分:)

编辑:当我最初发布时,我没有足够的代表来发布插图。两个圆(B 和 C)将重叠,但与 A 相切。我想将 C 移出它与 B 共享的重叠区域,进入虚线。

Circles

编辑 2:很抱歉,我一直不清楚,我创建了一个图表来试图解释我正在尝试做的事情。

我正在使用 Pixi.js(一个简单的 Canvas /webGL 库)创建插图。我正在使用 Vectors(通过 Victor.js)定位圆圈并四处移动它们。

我随机生成了一堆圆圈,然后将最大的圆圈 (A) 放在容器的中间。之后,我想将 A 周围的所有圆聚集在一起,解决发生的碰撞。这很重要,因为我将在用户点击或悬停时缩放各个圆圈。

对于没有任何碰撞的简单情况,矢量解决方案非常简单,我想尽可能解决两个圆以相同方式碰撞的情况。

Problem diagram

最佳答案

答案是找到边长为 Ra+Rb、Ra+Rc、Rb+Rc 的三角形的点。这称为三边求解,但您会得到 2 个可能的答案。

这里使用的基本公式是余弦定律:c^2 = a^2 + b^2 - 2ab*cos(gamma)

让我们将长度定义为:

  1. La = Ra+Rb
  2. Lb = Rb+Rc
  3. Lc = Rc+Ra

我们首先要找到 AB 和 AC 之间的角度。求解 arccos(a) = (Lb^2 + Lc^2 - La^2)/2*Lb*Lc
(如果此时你已经有了AB的坐标系角度,可以跳到第3步)

第二步是求AB相对于X轴的坐标系角度。这是使用基本三角函数完成的。求高度h = Ay - By,角度为arcsin(b) = h/La

第三步是添加或减去(2 个答案!)角度 a 和 b,这是从点 A 开始的矢量方向,其中点 C 位于距离 Lc 处。要找到 C,请再次使用三角函数。

Cx = Ax + Lc * cos(a + b)
Cy = Ay + Lc * sin(a + b)

关于algorithm - 三边测量算法将 3 个圆定位为尽可能靠近而不重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com