chyanog 发表于 2014-8-27 22:47:19

求两圆的外公切线方程及切点

两圆的方程分别是\[\left(x-a_1\right){}^2+\left(y-b_1\right){}^2=r_1^2\] \[\left(x-a_2\right){}^2+\left(y-b_2\right){}^2=r_2^2\]
尽可能用含`a_1,b_1,r_1, a_2,b_2,r2`的式子表示

wayne 发表于 2014-8-27 23:14:25

1)已知两个圆心$O_1,O_2$的坐标,那么过这两个圆心的距离$r=\sqrt{(a_1-a_2)^2+(b_1-b_2)^2}$,以及直线的方程$C$可以得知。
2)已知两个圆心的半径,那么两个公切点的距离$d$可以求得 $d=\sqrt{r^2+(r_1-r_2)^2}$。
假设$r_1<r_2$,那么公切线的方程相当于 直线$C$绕$O_1$逆时针旋转$\arcsin(\frac{r_2-r_1}{r})$,再沿法向方向(外侧,内侧) 分别平移 $r_1$个单位即可
切点的坐标 同理,可通过旋转求得。

282842712474 发表于 2014-8-27 23:28:11

在其中一个圆上选一个点为反演中心,反演之后一个圆变成了直线,另外一个圆还是圆,作直线和圆的公切圆,其方程也不难求得,然后再反演回来。
(这大概也是尺规作图的步骤吧,反演尺规作图可以实现)

数学星空 发表于 2014-8-28 00:20:05

直接设公切线方程为:
\
与第一个圆 \((x-a_1)^2+(y-b_1)^2=r_1^2\)相切的条件为:
\
与第二个圆 \((x-a_2)^2+(y-b_2)^2=r_2^2\)相切的条件为:
\
将上面两个相切条件消元得到:

两圆的公内切线:
\[(b_2+r_1-b_1+r_2)(-b_2+r_1+b_1+r_2)+(2(b_1-b_2))(a_1-a_2)k+(a_2+r_1-a_1+r_2)(-a_2+r_1+a_1+r_2)k^2=0\]
\
两圆的公外切线:
\[(b_2+r_1-b_1-r_2)(-b_2+r_1+b_1-r_2)+(2(b_1-b_2))(a_1-a_2)k+(-a_2+a_1+r_1-r_2)(a_2-a_1+r_1-r_2)k^2=0\]
\[ r_1^2a_2^2+r_1^2b_2^2-2r_1r_2a_1a_2-2r_1r_2b_1b_2+r_2^2a_1^2+r_2^2b_1^2-a_1^2b_2^2+2a_1a_2b_1b_2-a_2^2b_1^2+(2r_1^2b_2-2r_1r_2b_1-2r_1r_2b_2+2r_2^2b_1-2a_1^2b_2+2a_1a_2b_1+2a_1a_2b_2-2a_2^2b_1)b+(-a_2+a_1+r_1-r_2)(a_2-a_1+r_1-r_2)b^2=0\]
注意:由于每个\(k\)和\(b\)均有两个根,分别取同大或者同小取得两组\(\{k,b\}\)即可。

至于切点\(A(x_1,y_1),B(x_2,y_2)\),只需将每组\(\{k,b\}\)代入下式计算:
\
\


chyanog 发表于 2014-8-28 16:33:28

搜到一个不错的链接https://donghaoren.org/blog/2009/circle-common-tangents(不过文章中的公式某个符号好像写错了),可以用Mathematica验证:
Manipulate[
Block[{deta, p1, p2, q, a1, b1, a2, b2, line1, line2},
{{a1, b1}, {a2, b2}} = p;
deta = (a1 - a2)^2 + (b1 - b2)^2 - (r1 - r2)^2;
p1 = r1 (a2^2 + b2^2 - a1 a2 - b1 b2);
p2 = r2 (a1^2 + b1^2 - a1 a2 - b1 b2);
q = a1 b2 - a2 b1;
line1 = ((a2 - a1) (r1 - r2)+(b1 - b2) Sqrt) x + ((b2 - b1) (r1 - r2) + (a2 - a1) Sqrt) y - p1 - p2 + q Sqrt==0;
line2 = ((a2 - a1) (r1 - r2)-(b1 - b2) Sqrt) x + ((b2 - b1) (r1 - r2) - (a2 - a1) Sqrt) y - p1 - p2 - q Sqrt==0;
Show, Circle[{a2, b2}, r2]},
    PlotRange -> 6, Frame -> 1],
   ContourPlot]
], {{p, {{-3, 1}, {3, 0}}}, Locator}, {{r1, 1}, 1, 3}, {{r2, 2}, 1,
3}]
已更新,内外公切线都有了
Manipulate[
Block[{deta1, deta2, p1, p2, q, a1, b1, a2, b2, outerLine1,
   outerLine2, innerLine1, innerLine2},
{{a1, b1}, {a2, b2}} = p;
deta1 = (a1 - a2)^2 + (b1 - b2)^2 - (r1 + r2)^2;
deta2 = (a1 - a2)^2 + (b1 - b2)^2 - (r1 - r2)^2;
p1 = r1 (a2^2 + b2^2 - a1 a2 - b1 b2);
p2 = r2 (a1^2 + b1^2 - a1 a2 - b1 b2);
q = a1 b2 - a2 b1;
innerLine1 = ((a2 - a1) (r1 + r2) + (b1 - b2) Sqrt[
         deta1]) x + ((b2 - b1) (r1 + r2) + (a2 - a1) Sqrt) y -
      p1 + p2 + q Sqrt == 0;
innerLine2 = ((a2 - a1) (r1 + r2) - (b1 - b2) Sqrt[
         deta1]) x + ((b2 - b1) (r1 + r2) - (a2 - a1) Sqrt) y -
      p1 + p2 - q Sqrt == 0;
outerLine1 = ((a2 - a1) (r1 - r2) + (b1 - b2) Sqrt[
         deta2]) x + ((b2 - b1) (r1 - r2) + (a2 - a1) Sqrt) y -
      p1 - p2 + q Sqrt == 0;
outerLine2 = ((a2 - a1) (r1 - r2) - (b1 - b2) Sqrt[
         deta2]) x + ((b2 - b1) (r1 - r2) - (a2 - a1) Sqrt) y -
      p1 - p2 - q Sqrt == 0;
Show, Circle[{a2, b2}, r2]},PlotRange -> 6, Frame -> 1],
   ContourPlot[ Evaluate@{outerLine1, outerLine2, innerLine1, innerLine2}, {x, -5,5}, {y, -5, 5}]]
], {{p, {{-3, 1}, {3, 0}}}, Locator}, {{r1, 1}, 1, 3}, {{r2, 2}, 1,
3}]

hujunhua 发表于 2014-8-28 21:01:25

楼主或许应该讲明白,到底是想要结果,还是想要方法。

hujunhua 发表于 2014-8-28 22:22:50

设公切线与两圆的切点分别是:\((a_1+r_1\cos\theta, b_1+r_1\sin\theta)\)和\((a_2+r_2\cos\theta, b_2+r_2\sin\theta)\), 那么公切线的斜率就是\(-\cot\theta\), 公切线方程就是
\[(x-a_1)\cos\theta+(y-b_1)\sin\theta-r_1=0\]为了消去参数,与\[(a_2-a_1)\cos\theta+(b_2-b_1)\sin\theta+(r_2-r_1)=0\]联立消去 `\theta` 即可得到公切线方程。`r_1, r_2`可正可负,正负4种组合即得4条公切线方程。

hujunhua 发表于 2014-8-29 04:36:21

用Mathematica10试了一下楼上的方法,直接带三角函数消元不行,也许另有命令?我用X,Y 代替余弦和正弦,加了一个方程X^2+Y^2=1, 消元成功。
Manipulate[
Block[{a1, b1, a2, b2, CommonTangents}, {{a1, b1}, {a2, b2}} = p;
CommonTangents:=Eliminate[{x X + y Y == a1 X + b1 Y + r1 == a2 X + b2 Y + r2, X^2 + Y^2 == 1}, {X, Y}];
Show, Circle[{a2, b2}, r2]}, PlotRange -> 6, Frame -> 1],
ContourPlot]],
{{p, {{-3, 1}, {3, 0}}}, Locator}, {{r1, 1}, 1,3}, {{r2, 2}, 1, 3}]
楼上的用来消元的两个等式可以简写为一个连等式: \(x\cos\theta+y\sin\theta=a_1\cos\theta+b_1\sin\theta+r_1=a_2\cos\theta+b_2\sin\theta+r_2\)
从中消元得到的实际上是一条退化的二次曲线,包含两条公切线。 r1,r2同号时为两条外公切线,异号时为两条内公切线。

zeroieme 发表于 2014-8-29 16:08:56

外公切线倾斜角=圆心连线倾斜角±反正切(半径差/圆心距离)
代入7#公式

内公切线倾斜角=圆心连线倾斜角±反正切(半径和/圆心距离)

chyanog 发表于 2014-8-29 16:27:32

设切线方程为\(a x+b y+1=0\),根据点到直线距离公式得
GroebnerBasis[{(a a1 + b b1 + 1)^2 ==r1^2 (a^2 + b^2), (a a2 + b b2 + 1)^2 == r2^2 (a^2 + b^2),a x + b y + 1 == 0},
{a, b}][] // Factor // FullSimplify[#, ComplexityFunction -> LeafCount] &
结果\(\left(r_1^2 \left(\left(x-a_2\right){}^2+\left(y-b_2\right){}^2\right)-2 r_2 r_1 \left(\left(x-a_1\right) \left(x-a_2\right)+\left(y-b_1\right) \left(y-b_2\right)\right)+r_2^2 \left(\left(x-a_1\right){}^2+\left(y-b_1\right){}^2\right)-\left(a_1 y-a_1 b_2-a_2 y-x b_1+a_2 b_1+x b_2\right){}^2\right) \left(r_2^2 \left(\left(x-a_1\right){}^2+\left(y-b_1\right){}^2\right)+2 r_1 r_2 \left(\left(x-a_1\right) \left(x-a_2\right)+\left(y-b_1\right) \left(y-b_2\right)\right)+\text{r1}^2 \left(\left(x-a_2\right){}^2+\left(y-b_2\right){}^2\right)-\left(a_1 y-a_1 b_2-a_2 y-x b_1+a_2 b_1+x b_2\right){}^2\right)\)
页: [1] 2
查看完整版本: 求两圆的外公切线方程及切点