isOnSegmentGC static method

bool isOnSegmentGC(
  1. num lat1,
  2. num lng1,
  3. num lat2,
  4. num lng2,
  5. num lat3,
  6. num lng3,
  7. num havTolerance,
)

Implementation

static bool isOnSegmentGC(num lat1, num lng1, num lat2, num lng2,
    num lat3, num lng3, num havTolerance) {
  num havDist13 = havDistance(lat1, lat3, lng1 - lng3);
  if (havDist13 <= havTolerance) {
    return true;
  }
  num havDist23 = havDistance(lat2, lat3, lng2 - lng3);
  if (havDist23 <= havTolerance) {
    return true;
  }
  double sinBearing = sinDeltaBearing(lat1, lng1, lat2, lng2, lat3, lng3);
  num sinDist13 = MathUtil.sinFromHav(havDist13);
  num havCrossTrack = MathUtil.havFromSin(sinDist13 * sinBearing);
  if (havCrossTrack > havTolerance) {
    return false;
  }
  num havDist12 = havDistance(lat1, lat2, lng1 - lng2);
  num term = havDist12 + havCrossTrack * (1 - 2 * havDist12);
  if (havDist13 > term || havDist23 > term) {
    return false;
  }
  if (havDist12 < 0.74) {
    return true;
  }
  num cosCrossTrack = 1 - 2 * havCrossTrack;
  double havAlongTrack13 = (havDist13 - havCrossTrack) / cosCrossTrack;
  double havAlongTrack23 = (havDist23 - havCrossTrack) / cosCrossTrack;
  num sinSumAlongTrack = MathUtil.sinSumFromHav(havAlongTrack13, havAlongTrack23);
  return sinSumAlongTrack > 0;  // Compare with half-circle == PI using sign of sin().
}