Calculer le relèvement entre deux emplacements (lat, long)

Je suis en train de développer mon propre réalité augmentée moteur.

Des recherches sur internet, j'ai trouvé ce utile tutoriel. Le lisant, je vois que la chose la plus importante est le palier entre l'emplacement de l'utilisateur, l'emplacement du point et du nord.

L'image ci-dessous est à partir de ce tutoriel.

Calculer le relèvement entre deux emplacements (lat, long)

La suite, j'ai écrit un Objective-C méthode pour obtenir bêta:

+ (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;
}

Mais, quand je l'ai essayer, ça ne fonctionne pas très bien.

Alors, j'ai vérifié iPhone AR boîte à outils, pour voir comment il fonctionne (j'ai travaillé avec cette boîte à outils, mais il est tellement grand pour moi).

Et, dans ARGeoCoordinate.m il y a une autre mise en œuvre de la façon d'obtenir la bêta:

- (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;
}

Il utilise cette formule:

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

Pourquoi (M_PI * .5f) dans cette formule? Je ne comprends pas.

Et continuer à chercher, j'ai trouvé un autre page parler de la façon de calculer la distance et le relèvement de 2 endroits. Dans cette page il y a une autre mise en œuvre:

/**
 * 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;
}

Lequel est le bon?

source d'informationauteur VansFannel