24 std::array<double, 2> ret;
25 double hypothenuse = SGGeodesy::distanceM(m1, m2);
26 if (hypothenuse <= r1 + r2) {
27 SG_LOG(SG_AI, SG_WARN,
"innerTangentsAngle turn circles too near");
29 double opposite = r1 + r2;
30 double angle = asin(opposite/hypothenuse) * SG_RADIANS_TO_DEGREES;
33 crs = SGGeodesy::courseDeg(m2, m1);
35 crs = SGGeodesy::courseDeg(m1, m2);
37 ret[0] = SGMiscd::normalizePeriodic(0, 360, crs - angle);
38 ret[1] = SGMiscd::normalizePeriodic(0, 360, crs + angle);
43 double hypothenuse = SGGeodesy::distanceM(m1, m2);
44 if (hypothenuse <= r1 + r2) {
45 SG_LOG(SG_AI, SG_WARN,
"innerTangentsLength turn circles too near");
48 double opposite = r1 + r2;
49 double angle = asin(opposite/hypothenuse) * SG_RADIANS_TO_DEGREES;
52 crs = SGGeodesy::courseDeg(m2, m1);
54 crs = SGGeodesy::courseDeg(m1, m2);
56 double angle1 = SGMiscd::normalizePeriodic(0, 360, crs - angle + 90);
57 double angle2 = SGMiscd::normalizePeriodic(0, 360, crs - angle - 90);
58 SGGeod p1 = SGGeodesy::direct(m1, angle1, r1);
59 SGGeod
p2 = SGGeodesy::direct(m2, angle2, r2);
61 return SGGeodesy::distanceM(p1,
p2);
65 std::array<double, 2> ret;
66 double hypothenuse = SGGeodesy::distanceM(m1, m2);
67 double radiusDiff = abs(r1 - r2);
68 double beta = atan2( radiusDiff, hypothenuse ) * SG_RADIANS_TO_DEGREES;
69 double gamma = SGGeodesy::courseDeg(m1, m2);
70 ret[0] = SGMiscd::normalizePeriodic(0, 360, gamma - beta);
71 ret[1] = SGMiscd::normalizePeriodic(0, 360, gamma + beta);
static std::array< double, 2 > innerTangentsAngle(SGGeod m1, SGGeod m2, double r1, double r2)
Angles of inner tangent between two circles.
static std::array< double, 2 > outerTangentsAngle(SGGeod m1, SGGeod m2, double r1, double r2)
Angles of outer tangent between two circles normalized to 0-360.