intersection method
Coordinate?
intersection({
- required Coordinate firstPoint,
- required double firstBearing,
- required Coordinate secondPoint,
- 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());
}