intersection method

Coordinate? intersection({
  1. required Coordinate firstPoint,
  2. required double firstBearing,
  3. required Coordinate secondPoint,
  4. required double secondBearing,
})

This function returns the point of intersection of two paths which one starts from firstPoint with firstBearing and the other one starts from secondPoint with secondBearing

firstPoint First point coordinates firstBearing First path's bearing secondPoint Second point coordinates secondBearing Second path's bearing Returns Intersections coordinates of two paths or return null if there is no intersection

final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final fcoCoordinates = Coordinate(41.8002778,12.2388889); // The coordinates of Roma Fiumicino Airport
final bearingFromIstanbulToWest = 270.0;
final bearingFromRomeToNorthEast = 45.0;
final intersection = greatCircle.intersection(istCoordinates, bearingFromIstanbulToWest, fcoCoordinates, bearingFromRomeToNorthEast);

Implementation

Coordinate? intersection(
    {required Coordinate firstPoint,
    required double firstBearing,
    required Coordinate secondPoint,
    required double secondBearing}) {
  final double lat1 = firstPoint.latitude.toRadians();
  final double lon1 = firstPoint.longitude.toRadians();
  final double lat2 = secondPoint.latitude.toRadians();
  final double lon2 = secondPoint.longitude.toRadians();

  final double dLon = lon2 - lon1;
  final double dLat = lat2 - lat1;

  final double delta12 = 2 *
      asin(sqrt(sin(dLat / 2) * sin(dLat / 2) +
          cos(lat1) * cos(lat2) * sin(dLon / 2) * sin(dLon / 2)));

  final double cosTetaa =
      (sin(lat2) - sin(lat1) * cos(delta12)) / (sin(delta12) * cos(lat1));
  final double cosTetab =
      (sin(lat1) - sin(lat2) * cos(delta12)) / (sin(delta12) * cos(lat2));
  final double tetaa = acos(cosTetaa);
  final double tetab = acos(cosTetab);

  final double teta12 = sin(lon2 - lon1) > 0 ? tetaa : (2 * pi - tetaa);
  final double teta21 = sin(lon2 - lon1) > 0 ? (2 * pi - tetab) : tetab;

  final double alpha1 = firstBearing.toRadians() - teta12;
  final double alpha2 = teta21 - secondBearing.toRadians();

  if (sin(alpha1) == 0.0 && sin(alpha2) == 0.0) return null;
  if (sin(alpha1) * sin(alpha2) < 0) return null;

  final double cosAlpha3 =
      -cos(alpha1) * cos(alpha2) + sin(alpha1) * sin(alpha2) * cos(delta12);
  final double delta13 = atan2(sin(delta12) * sin(alpha1) * sin(alpha2),
      cos(alpha2) + cos(alpha1) * cosAlpha3);

  final double lat = asin(min(
      max(
          sin(lat1) * cos(delta13) +
              cos(lat1) * sin(delta13) * cos(firstBearing.toRadians()),
          -1),
      1));
  final double deltaLon13 = atan2(
      sin(firstBearing.toRadians()) * sin(delta13) * cos(lat1),
      cos(delta13) - sin(lat1) * sin(lat));
  final double lon = lon1 + deltaLon13;

  return Coordinate(lat.toDegrees(), lon.toDegrees());
}