我有两个圆圈完美地位于彼此的边界上。它们具有位置A和B(两个矢量),以及半径Ra和Rb。
现在我添加一个半径为Rc的第三个圆圈。如何找到位置矢量C,其中三个圆圈尽可能靠近放置而不重叠?
我写这个是为了建立一个网站的插图,所以提高效率的奖励点:)
编辑: 我最初发布时没有足够的代表发布插图。 其中两个圆圈(B和C)将重叠,但与C相切。我想将C移出与B共用的重叠区域,进入虚线。
编辑2: 对不起,我已经非常清楚,我已经创建了一个图表,试图解释我想要做的事情。
我在Pixi.js中创建了一个插图,这是一个简单的canvas / webGL库。我使用向量(通过Victor.js)定位圆圈并移动它们。
我随机生成一堆圆圈,然后我将最大的圆圈(A)放在容器的中间。在那之后,我想聚集A周围的所有圆圈,在碰撞发生时解决冲突。这很重要,因为我会在用户点击或悬停它们时缩放各个圈子。
对于没有碰撞的简单情况,矢量解决方案非常简单,我想解决两个圆以相同方式碰撞的情况。
答案 0 :(得分:1)
答案是找到形成边长为三角形的点:Ra + Rb,Ra + Rc,Rb + Rc。这被称为三方解决,但你会得到2个可能的答案。
这里使用的基本公式是余弦定律: c ^ 2 = a ^ 2 + b ^ 2 - 2ab * cos(gamma)
让我们将长度定义为:
我们首先要找到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
的中心相距A
,C
的中心距B.R + C.R
距离B
A.R
的中心,其中B.R
,C.R
,A
是圆B
,C
,C
的半径。换句话说, 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
现在反转您在开头应用的变换(如果有的话)(首先反转旋转,然后反转平移),最后的中心为%>%
。
如果您不想应用初始翻译和轮换,当然,您仍然可以解决问题,但代数有点混乱。