4

我无法正确使用此算法。我正在尝试制作一个指向某个位置的指南针,而不仅仅是指向,比如说,北方。出了点问题。我花了很多时间试图弄清楚这一点,但我就是找不到。有任何想法吗?

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

2 回答 2

1
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是两个位置之间的方位角。

于 2012-11-28T08:30:18.410 回答
1

位置感知编程指南中的“地图坐标系”说:“具体而言,在墨卡托地图投影上,在地图上任意两点之间绘制的直线会产生可用于地球表面实际导航的航向。 ” 这让我认为您应该将地图坐标转换为地图点 ( MKMapPointForCoordinate) 并调用atan地图点之间的差异。(实际上,您可能应该使用atan2,而不是atan。)您尝试过吗?

于 2012-11-28T08:25:56.793 回答