我无法正确理解这个算法。我试图制作一个指向某个位置的指南针,而不仅仅是指向北方。有些不对劲。我花了很多时间试图弄清楚这一点,但我就是找不到它。有什么想法吗?
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
double distanceEast = (location.longitude > 0 && otherLocation.longitude < 0) ? 180 - location.longitude + otherLocation.longitude - -180: otherLocation.longitude - location.longitude;
if (distanceEast < 0) {
distanceEast += 360;
}
double distanceWest = (location.longitude < 0 && otherLocation.longitude > 0) ? -180 - location.longitude - 180 - otherLocation.longitude : location.longitude - otherLocation.longitude;
if (distanceWest < 0) {
distanceWest += 360;
}
float latitudinalDifference = (otherLocation.latitude - location.latitude);
float longitudinalDifference = fmin(distanceEast,distanceWest);
float arcTan = atan(longitudinalDifference / latitudinalDifference);
float oldRadian = (-manager.heading.trueHeading *M_PI /180.0f)+arcTan+M_PI;
float newRadian = (-newHeading.trueHeading *M_PI /180.0f)+arcTan+M_PI;
CABasicAnimation *animation;
animation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.fromValue = [NSNumber numberWithFloat:oldRadian];
animation.toValue = [NSNumber numberWithFloat:newRadian];
animation.duration = 0.5f;
directionsArrow.layer.anchorPoint = CGPointMake(0.5, 0.5);
[directionsArrow.layer addAnimation:animation forKey:@"rotationCompass"];
directionsArrow.transform = CGAffineTransformMakeRotation(newRadian);
}
double lon = location.longitude - otherLocation.longitude;
double y = sin(lon) * cos(otherLocation.latitude);
double x = cos(location.latitude) * sin(otherLocation.latitude) - sin(location.latitude) * cos(otherLocation.latitude) * cos(lon);
double angle = atan2(y, x);
angle
是两个位置之间的方位。
位置感知编程指南中的"地图坐标系"说:"具体来说,在墨卡托地图投影上,在地图上任意两点之间绘制的直线会产生可用于地球表面实际导航的航向标题。 这让我认为您应该将地图坐标转换为地图点(MKMapPointForCoordinate
),并就地图点之间的差异调用atan
。 (实际上,您可能应该使用atan2
,而不是atan
。 你试过吗?