首页 > 代码库 > 求两个圆的公切线

求两个圆的公切线

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[deta1]) y -
      p1 + p2 + q Sqrt[deta1] == 0;
  innerLine2 = ((a2 - a1) (r1 + r2) - (b1 - b2) Sqrt[
         deta1]) x + ((b2 - b1) (r1 + r2) - (a2 - a1) Sqrt[deta1]) y -
      p1 + p2 - q Sqrt[deta1] == 0;
  outerLine1 = ((a2 - a1) (r1 - r2) + (b1 - b2) Sqrt[
         deta2]) x + ((b2 - b1) (r1 - r2) + (a2 - a1) Sqrt[deta2]) y -
      p1 - p2 + q Sqrt[deta2] == 0;
  outerLine2 = ((a2 - a1) (r1 - r2) - (b1 - b2) Sqrt[
         deta2]) x + ((b2 - b1) (r1 - r2) - (a2 - a1) Sqrt[deta2]) y -
      p1 - p2 - q Sqrt[deta2] == 0;
  Show[Graphics[{Circle[{a1, b1}, r1], 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}]

 

求两个圆的公切线