Вычислить азимут между двумя точками (широта, долгота)

Я пытаюсь разработать свой собственный движок дополненной реальности.

Поискав в Интернете, я нашел этот полезный учебник . Читая его, я вижу, что важен азимут между местоположением пользователя, местоположением точки и севером.

Следующее изображение взято из этого урока.

enter image description here

После этого я написал метод Objective-C для получения бета-версии:

+ (float) calculateBetaFrom:(CLLocationCoordinate2D)user to:(CLLocationCoordinate2D)destination
{
    double beta = 0;
    double a, b = 0;

    a = destination.latitude - user.latitude;
    b = destination.longitude - user.longitude;

    beta = atan2(a, b) * 180.0 / M_PI;
    if (beta < 0.0)
        beta += 360.0;
    else if (beta > 360.0)
        beta -= 360;

    return beta;
}

Но когда я его пробую, он работает не очень хорошо.

Итак, я проверил iPhone AR Toolkit, чтобы увидеть, как он работает (я работал с этим набором инструментов, но он такой большой для меня).

И в ARGeoCoordinate.m есть другая реализация того, как получить бета-версию:

- (float)angleFromCoordinate:(CLLocationCoordinate2D)first toCoordinate:(CLLocationCoordinate2D)second {

    float longitudinalDifference    = second.longitude - first.longitude;
    float latitudinalDifference     = second.latitude  - first.latitude;
    float possibleAzimuth           = (M_PI * .5f) - atan(latitudinalDifference / longitudinalDifference);

    if (longitudinalDifference > 0) 
        return possibleAzimuth;
    else if (longitudinalDifference < 0) 
        return possibleAzimuth + M_PI;
    else if (latitudinalDifference < 0) 
        return M_PI;

    return 0.0f;
}

Она использует эту формулу:

float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference / longitudinalDifference);

Почему (M_PI * .5f) в этой формуле? Я этого не понимаю.

И продолжая поиск, я нашел еще одну страницу , где рассказывается о том, как рассчитать расстояние и азимут двух местоположений. На этой странице представлена ​​другая реализация:

/**
 * Returns the (initial) bearing from this point to the supplied point, in degrees
 *   see http://williams.best.vwh.net/avform.htm#Crs
 *
 * @param   {LatLon} point: Latitude/longitude of destination point
 * @returns {Number} Initial bearing in degrees from North
 */
LatLon.prototype.bearingTo = function(point) {
  var lat1 = this._lat.toRad(), lat2 = point._lat.toRad();
  var dLon = (point._lon-this._lon).toRad();

  var y = Math.sin(dLon) * Math.cos(lat2);
  var x = Math.cos(lat1)*Math.sin(lat2) -
          Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
  var brng = Math.atan2(y, x);

  return (brng.toDeg()+360) % 360;
}

Какая из них правильная?

17
задан VansFannel 14 November 2011 в 14:29
поделиться