intersectionByPaths method

Coordinate? intersectionByPaths(
  1. Coordinate l1,
  2. Coordinate l2,
  3. num b1,
  4. num b2,
)

calculate the geo point of intersection of two given paths

Implementation

Coordinate? intersectionByPaths(
    Coordinate l1, Coordinate l2, num b1, num b2) {
  num l1LatRadians = degToRadian(l1.y);
  num l1LngRadians = degToRadian(l1.x);
  num l2LatRadians = degToRadian(l2.y);
  num l2LngRadians = degToRadian(l2.x);
  num b1Radians = degToRadian(b1 as double);
  num b2Radians = degToRadian(b2 as double);
  var latRadiansDiff = l2LatRadians - l1LatRadians;
  var lngRadiansDiff = l2LngRadians - l1LngRadians;

  num angularDistance = 2 *
      math.asin(math.sqrt(
          math.sin(latRadiansDiff / 2) * math.sin(latRadiansDiff / 2) +
              math.cos(l1LatRadians) *
                  math.cos(l2LatRadians) *
                  math.sin(lngRadiansDiff / 2) *
                  math.sin(lngRadiansDiff / 2)));
  if (angularDistance == 0) return null;

  num initBearingX = math.acos((math.sin(l2LatRadians) -
          math.sin(l1LatRadians) * math.cos(angularDistance)) /
      (math.sin(angularDistance) * math.cos(l1LatRadians)));
  if (initBearingX.isNaN) initBearingX = 0;
  num initBearingY = math.acos((math.sin(l1LatRadians) -
          math.sin(l2LatRadians) * math.cos(angularDistance)) /
      (math.sin(angularDistance) * math.cos(l2LatRadians)));

  var finalBearingX = math.sin(l2LngRadians - l1LngRadians) > 0
      ? initBearingX
      : 2 * _PI - initBearingX;
  var finalBearingY = math.sin(l2LngRadians - l1LngRadians) > 0
      ? 2 * _PI - initBearingY
      : initBearingY;

  var angle1 = b1Radians - finalBearingX;
  var angle2 = finalBearingY - b2Radians;

  if (math.sin(angle1) == 0 && math.sin(angle2) == 0) return null;
  if (math.sin(angle1) * math.sin(angle2) < 0) return null;

  num angle3 = math.acos(-math.cos(angle1) * math.cos(angle2) +
      math.sin(angle1) * math.sin(angle2) * math.cos(angularDistance));
  num dst13 = math.atan2(
      math.sin(angularDistance) * math.sin(angle1) * math.sin(angle2),
      math.cos(angle2) + math.cos(angle1) * math.cos(angle3));
  num lat3 = math.asin(math.sin(l1LatRadians) * math.cos(dst13) +
      math.cos(l1LatRadians) * math.sin(dst13) * math.cos(b1Radians));
  num lngRadiansDiff13 = math.atan2(
      math.sin(b1Radians) * math.sin(dst13) * math.cos(l1LatRadians),
      math.cos(dst13) - math.sin(l1LatRadians) * math.sin(lat3));
  var l3LngRadians = l1LngRadians + lngRadiansDiff13;

  return Coordinate((radianToDeg(l3LngRadians as double) + 540) % 360 - 180,
      radianToDeg(lat3 as double));
}