outerTangent static method

LineSegment? outerTangent(
  1. Coordinate c1,
  2. double r1,
  3. Coordinate c2,
  4. double r2,
)

Implementation

static LineSegment? outerTangent(
    Coordinate c1, double r1, Coordinate c2, double r2) {
  if (r1 > r2) {
    LineSegment seg = outerTangent(c2, r2, c1, r1)!;
    return LineSegment(seg.p1, seg.p0);
  }
  double x1 = c1.x;
  double y1 = c1.y;
  double x2 = c2.x;
  double y2 = c2.y;
  double a3 = -atan2(y2 - y1, x2 - x1);
  double dr = r2 - r1;
  double d = sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
  double a2 = asin(dr / d);
  if (a2.isNaN) return null;

  double a1 = a3 - a2;
  double aa = (pi / 2) - a1;
  double x3 = x1 + (r1 * cos(aa));
  double y3 = y1 + (r1 * sin(aa));
  double x4 = x2 + (r2 * cos(aa));
  double y4 = y2 + (r2 * sin(aa));
  return LineSegment.of2(x3, y3, x4, y4);
}