我有一个情况,我有两个圈子(C1和C2) 我需要找到与这两个圆相切的直线的线方程。
据我所知,给定一个点(P1)和C2的点和半径,可以很容易地得到2个可能的切点,C2和P1做2线方程。但由于我没有P1,只知道该点是C1上可能的2点之一,我不知道如何计算它。
我认为这将是获得C1的2个切线方程等于C2相同的方法。
这两个圆圈可以有任何半径,它们可以是相同的,也可以是非常不同的。它们也永远不会重叠(尽管它们仍然可以触摸)。我正在寻找两条可能的内部切线。
哦,而且,视觉效果会非常有用哈哈:)
答案 0 :(得分:1)
所以我们将使用相似变换。如果圈C和C'分别具有中心O和O&#,以及半径r和r',然后我们知道存在一个唯一的中心J和比率为a的相似变换,这样:
a = |JO|/|JO'| = r/r'
注意AB是从A到B的向量,| z |向量z的范数。
因此,你得到J
,知道它介于O和O之间。我们都知道。
然后用你在JO'上的JR投影,和v在其正交上的分解,并考虑到由O&#JR;形成的角度的正弦和余弦c,我们有
|u| = |JR| * c
|v| = |JR| * s
c^2 + s^2 = 1
最后因为三角形JRO'在R中是直角的:
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)
答案 1 :(得分:1)
让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.