三边测量算法将3个圆圈尽可能靠近而不重叠

时间:2015-06-01 17:12:47

标签: algorithm math geometry computational-geometry

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

现在我添加一个半径为Rc的第三个圆圈。如何找到位置矢量C,其中三个圆圈尽可能靠近放置而不重叠?

我写这个是为了建立一个网站的插图,所以提高效率的奖励点:)

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

Circles

编辑2: 对不起,我已经非常清楚,我已经创建了一个图表,试图解释我想要做的事情。

我在Pixi.js中创建了一个插图,这是一个简单的canvas / webGL库。我使用向量(通过Victor.js)定位圆圈并移动它们。

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

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

Problem diagram

3 个答案:

答案 0 :(得分:1)

答案是找到形成边长为三角形的点: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
  4. 我们首先要找到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)

答案 1 :(得分:1)

当圆圈相互接触时,中心之间的距离称为半径之和。求解这个方程组并找到Cx,Cy坐标。有两种可能的解决方案。当坐标原点放置在一个圆的中心时,解决方案更简单。

(Cx-Ax)^2 + (Cy-Ay)^2 = (Ra+Rc)^2
(Cx-Bx)^2 + (Cy-By)^2 = (Rb+Rc)^2

答案 2 :(得分:1)

如果您假设第一个圈子(A)具有居中(0,0),第二个圈子(B)居中于肯定x,则问题会得到简化-轴。如果情况并非如此,您可以将A的中心翻译为(0,0),然后旋转平面以实现此目的。 (然后在最后反转这些操作以恢复原始配置。)

然后C的中心与A.R + C.R的中心相距AC的中心距B.R + C.R距离B A.R的中心,其中B.RC.RA是圆BCC的半径。换句话说, x^2 + y^2 = (A.R + C.R)^2 (x-B.x)^2 + y^2 = (B.R + C.R)^2 的中心位于两个圆的交叉点

(B.x,0)

其中B是圈-2*B.x*x + B.x^2 = B.R^2 + 2*B.R*C.R - A.R^2 - 2*A.R*C.R 的中心。从第二个方程中减去第一个方程式

C

换句话说,x的中心有C.x = (A.R^2 + 2*A.R*C.R + B.x^2 - B.R^2 - 2*B.R*C.R)/(2*B.x) 坐标

C.x

现在我们已C.y,我们可以轻松计算C.y = plus or minus sqrt((A.R+C.R)^2 - C.x^2)

C

现在反转您在开头应用的变换(如果有的话)(首先反转旋转,然后反转平移),最后的中心为%>%

如果您不想应用初始翻译和轮换,当然,您仍然可以解决问题,但代数有点混乱。