Estoy tratando de desarrollar mi propio motor de realidad aumentada.Calcular rodamiento entre dos ubicaciones (lat, largo)
Buscando en internet, he encontrado esto útil tutorial. Al leerlo, veo que lo importante es llevarlo entre la ubicación del usuario, la ubicación del punto y el norte.
La siguiente imagen es de ese tutorial.
Después, me escribió un método de Objective-C para obtener la beta:
+ (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;
}
Pero, cuando lo intento, no funciona muy bien.
Así que revisé iPhone AR Toolkit, para ver cómo funciona (he estado trabajando con este kit de herramientas, pero es tan grande para mí).
Y, en ARGeoCoordinate.m hay otra implementación de cómo obtener la beta:
- (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;
}
Utiliza esta fórmula:
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference/longitudinalDifference);
¿Por qué es (* M_PI .5f) en esta fórmula? No lo entiendo
Y continúo buscando, he encontrado otro page hablando de cómo calcular la distancia y el rumbo de 2 ubicaciones. En esta página hay otra aplicación:
/**
* 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;
}
¿Cuál es la correcta?
¿Alguna vez resolvió este problema? Estoy interesado en la solución que utilizó con – Craigy
Sí, tengo que agregar mi propia respuesta en breve. – VansFannel