找到与 2 个给定圆相切的直线
Find line that is tangent to 2 given circles
我有两个圈子(C1 和 C2)
我需要找到与这两个圆相切的直线的直线方程。
据我所知,给定一个点 (P1) 和 C2 的点和半径,可以很容易地获得 C2 和 P1 的 2 个可能的切点,以生成 2 个直线方程。但是因为我没有 P1,只知道该点将是 C1 上可能的 2 个点之一,我不确定如何计算它。
我假设这将是沿着获得 C1 的 2 个切线方程等于 C2 的切线方程的方向。
两个圆的半径可以是任意的,它们可以相同也可以相差很大。它们也永远不会重叠(尽管它们仍然可以接触)。我正在寻找 2 个可能的内部切线。
哦,还有,视觉效果会很有帮助哈哈:)
(来源:imag.fr)
因此我们将使用位点变换。如果圆C和C'的圆心分别为O和O',半径为r和r',那么我们知道存在一个唯一的以J为圆心,比为a的位点变换,使得:
a = |JO|/|JO'| = r/r'
注意AB是从A到B的向量,|z|向量 z 的范数。
因此你得到 J
,知道它在我们都知道的 O 和 O' 之间。
然后用u JR在JO'上的投影,v在其正交上分解,并考虑O'JR所成角的正弦s和余弦c,我们有
|u| = |JR| * c
|v| = |JR| * s
c^2 + s^2 = 1
最后因为三角形 JRO' 在 R 中是 right-angled :
s = r' / |JO|'
将所有这些放在一起,我们得到:
J = O + OO' / |OO'| * a / (a+1)
if |OJ| == r and |O'J| == r' then
return the orthogonal line to (OO') passing through J
|JR| = √( |JO'|^ - r'^2 )
s = r' / |JO'|
c = √( 1 - s^2 )
u = c * |JR| * OO' / |OO'|
w = (-u.y, u.x) % any orthogonal vector to u
v = s * |JR| * w / |w|
return lines corresponding to parametric equations J+t*(u+v) and J+t*(u-v)
令 O
为通过中心的线与切线之间的交点。
令 d
为中心与 h1
之间的距离,h2
为 O
与中心之间的距离。类似地,它们与半径成正比。
因此,
h1 / h2 = r1 / r2 = m,
h1 + h2 = d,
给予
h1 = m d / (1 + m),
h2 = d / (1 + m).
然后O
的坐标通过中心之间的插值找到
xo = (h2.x1 + h1.x2) / d
yo = (h2.y1 + h1.y2) / d
切线的角度是通过中心的线的角度加上或减去这条线与切线之间的角度,
a = arctan((y2 - y1)/(x2 - x1)) +/- arcsin(r1 / h1).
你可以将切线的隐式方程写成
cos(a).y - sin(a).x = cos(a).yo - sin(a).xo.
我有两个圈子(C1 和 C2) 我需要找到与这两个圆相切的直线的直线方程。
据我所知,给定一个点 (P1) 和 C2 的点和半径,可以很容易地获得 C2 和 P1 的 2 个可能的切点,以生成 2 个直线方程。但是因为我没有 P1,只知道该点将是 C1 上可能的 2 个点之一,我不确定如何计算它。
我假设这将是沿着获得 C1 的 2 个切线方程等于 C2 的切线方程的方向。
两个圆的半径可以是任意的,它们可以相同也可以相差很大。它们也永远不会重叠(尽管它们仍然可以接触)。我正在寻找 2 个可能的内部切线。
哦,还有,视觉效果会很有帮助哈哈:)
(来源:imag.fr)
因此我们将使用位点变换。如果圆C和C'的圆心分别为O和O',半径为r和r',那么我们知道存在一个唯一的以J为圆心,比为a的位点变换,使得:
a = |JO|/|JO'| = r/r'
注意AB是从A到B的向量,|z|向量 z 的范数。
因此你得到 J
,知道它在我们都知道的 O 和 O' 之间。
然后用u JR在JO'上的投影,v在其正交上分解,并考虑O'JR所成角的正弦s和余弦c,我们有
|u| = |JR| * c
|v| = |JR| * s
c^2 + s^2 = 1
最后因为三角形 JRO' 在 R 中是 right-angled :
s = r' / |JO|'
将所有这些放在一起,我们得到:
J = O + OO' / |OO'| * a / (a+1)
if |OJ| == r and |O'J| == r' then
return the orthogonal line to (OO') passing through J
|JR| = √( |JO'|^ - r'^2 )
s = r' / |JO'|
c = √( 1 - s^2 )
u = c * |JR| * OO' / |OO'|
w = (-u.y, u.x) % any orthogonal vector to u
v = s * |JR| * w / |w|
return lines corresponding to parametric equations J+t*(u+v) and J+t*(u-v)
令 O
为通过中心的线与切线之间的交点。
令 d
为中心与 h1
之间的距离,h2
为 O
与中心之间的距离。类似地,它们与半径成正比。
因此,
h1 / h2 = r1 / r2 = m,
h1 + h2 = d,
给予
h1 = m d / (1 + m),
h2 = d / (1 + m).
然后O
的坐标通过中心之间的插值找到
xo = (h2.x1 + h1.x2) / d
yo = (h2.y1 + h1.y2) / d
切线的角度是通过中心的线的角度加上或减去这条线与切线之间的角度,
a = arctan((y2 - y1)/(x2 - x1)) +/- arcsin(r1 / h1).
你可以将切线的隐式方程写成
cos(a).y - sin(a).x = cos(a).yo - sin(a).xo.