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

Location Awareness ProgrammingGuideの「MapCoordinatesSystems」には、「具体的には、メルカトル図法では、地図上の任意の2点間に直線を引くと、地球の表面での実際のナビゲーションに使用できるコース見出しが生成されます。 」これにより、マップ座標をマップポイント()に変換し、マップポイント間の違いMKMapPointForCoordinateを呼び出す必要があると思います。atan(実際には、おそらく使用する必要がありますが、使用atan2しないでatanください。)それを試しましたか?

于 2012-11-28T08:25:56.793 に答える
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);

angle2つの場所の間の方位です。

于 2012-11-28T08:30:18.410 に答える