destinationPointByDistanceAndBearing method

Coordinate destinationPointByDistanceAndBearing(
  1. Coordinate l,
  2. num distance,
  3. num bearing, [
  4. num? radius,
])

calculate a destination point given the distance and bearing

Implementation

Coordinate destinationPointByDistanceAndBearing(
    Coordinate l, num distance, num bearing,
    [num? radius]) {
  radius = radius ?? _RADIUS;

  num angularDistanceRadius = distance / radius;
  num bearingRadians = degToRadian(bearing as double);

  num latRadians = degToRadian(l.y);
  num lngRadians = degToRadian(l.x);

  num sinLatRadians = math.sin(latRadians);
  num cosLatRadians = math.cos(latRadians);
  num sinAngularDistanceRadius = math.sin(angularDistanceRadius);
  num cosAngularDistanceRadius = math.cos(angularDistanceRadius);
  num sinBearingRadians = math.sin(bearingRadians);
  num cosBearingRadians = math.cos(bearingRadians);

  var sinLatRadians2 = sinLatRadians * cosAngularDistanceRadius +
      cosLatRadians * sinAngularDistanceRadius * cosBearingRadians;
  num latRadians2 = math.asin(sinLatRadians2);
  var y = sinBearingRadians * sinAngularDistanceRadius * cosLatRadians;
  var x = cosAngularDistanceRadius - sinLatRadians * sinLatRadians2;
  num lngRadians2 = lngRadians + math.atan2(y, x);
  return Coordinate((radianToDeg(lngRadians2 as double) + 540) % 360 - 180,
      radianToDeg(latRadians2 as double));
}