Я пытаюсь разработать свой собственный механизм усовершенствованной реальности.
Поиск в Интернете, я нашел этот полезный учебник. Читая это, я вижу, что важная вещь зависит от местоположения пользователя, местоположения точки и севера.
В этом уроке показан следующий снимок.
После этого я написал метод 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;
}
Какой из них правильный?