intermediate method

Coordinate intermediate({
  1. required Coordinate startPoint,
  2. required Coordinate endPoint,
  3. required double fraction,
})

This function returns the point at given fraction between startPoint and endPoint

startPoint Initial coordinates endPoint Final coordinates fraction Fraction between coordinates Returns Intermediate coordinates between startPoint and endPoint

final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final fraction = 0.25;
final intermediate = greatCircle.intermediate(istCoordinates, jfkCoordinates, fraction);

Implementation

Coordinate intermediate(
    {required Coordinate startPoint,
    required Coordinate endPoint,
    required double fraction}) {
  if (startPoint == endPoint) return startPoint;

  final double lat1 = startPoint.latitude.toRadians();
  final double lat2 = endPoint.latitude.toRadians();
  final double lon1 = startPoint.longitude.toRadians();
  final double lon2 = endPoint.longitude.toRadians();

  final double dLon = lon2 - lon1;
  final double dLat = lat2 - lat1;
  final double a = sin(dLat / 2) * sin(dLat / 2) +
      cos(lat1) * cos(lat2) * sin(dLon / 2) * sin(dLon / 2);
  final double c = 2 * atan2(sqrt(a), sqrt(1 - a));

  final double A = sin((1 - fraction) * c) / sin(c);
  final double B = sin(fraction * c) / sin(c);
  final double x = A * cos(lat1) * cos(lon1) + B * cos(lat2) * cos(lon2);
  final double y = A * cos(lat1) * sin(lon1) + B * cos(lat2) * sin(lon2);
  final double z = A * sin(lat1) + B * sin(lat2);

  final double lat = atan2(z, sqrt(x * x + y * y));
  final double lon = atan2(y, x);

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