Tôi đang cố gắng phát triển động cơ thực tế tăng cường của riêng mình.Tính toán vòng bi giữa hai vị trí (vĩ độ, dài)
Tìm kiếm trên internet, tôi thấy hữu ích này tutorial. Đọc nó tôi thấy rằng điều quan trọng là mang giữa vị trí người dùng, vị trí điểm và phía bắc.
Hình ảnh sau đây là từ hướng dẫn đó.
Sau đó, tôi đã viết một phương pháp Objective-C để có được phiên bản 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;
}
Tuy nhiên, khi tôi thử nó, nó không hoạt động rất tốt.
Vì vậy, tôi đã kiểm tra Bộ công cụ AR của iPhone, để xem cách nó hoạt động (Tôi đã làm việc với bộ công cụ này, nhưng nó là quá lớn đối với tôi).
Và, trong ARGeoCoordinate.m có một thực hiện như thế nào để có được phiên bản 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;
}
Nó sử dụng công thức này:
float possibleAzimuth = (M_PI * .5f) - atan(latitudinalDifference/longitudinalDifference);
Tại sao (M_PI * .5f) trong công thức này? Tôi không hiểu.
Và tiếp tục tìm kiếm, tôi đã tìm thấy một số khác page nói về cách tính khoảng cách và vòng bi của 2 vị trí. Trong trang này có một triển khai khác:
/**
* 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;
}
Cái nào là đúng?
Bạn đã bao giờ giải quyết vấn đề này chưa? Tôi quan tâm đến giải pháp bạn đã đi với – Craigy
Có, tôi phải thêm câu trả lời của riêng mình ngay. – VansFannel