计算到某个位置的角度

时间:2015-02-04 22:02:11

标签: ios objective-c coordinates

我有一个箭头图像,表现得像指南针到特定位置。有时它可以工作,有时它会被镜像。因此,如果我面向东方并且位置在我的正上方,它应该指向上方,但有时它指向下方。

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading
{
    // update direction of arrow
    CGFloat degrees = [self p_calculateAngleBetween:_myLocation
                                                and:_otherLocation];
    CGFloat rads = (degrees - heading.trueHeading) * M_PI / 180;


    CGAffineTransform tr = CGAffineTransformIdentity;
    tr = CGAffineTransformConcat(tr, CGAffineTransformMakeRotation(rads) );

    [_directionArrowView setTransform:tr];
}

-(CGFloat) p_calculateAngleBetween:(CLLocationCoordinate2D)coords0 and:(CLLocationCoordinate2D)coords1 {
    double x = 0, y = 0 , deg = 0, deltaLon = 0;

    deltaLon = coords1.longitude - coords0.longitude;
    y = sin(deltaLon) * cos(coords1.latitude);
    x = cos(coords0.latitude) * sin(coords1.latitude) - sin(coords0.latitude) * cos(coords1.latitude) * cos(deltaLon);
    deg = RADIANS_TO_DEGREES(atan2(y, x));

    if(deg < 0)
    {
        deg = -deg;
    }
    else
    {
        deg = 360 - deg;
    }

    return deg;
} 

这是与另一个位置计算角度的正确方法吗?或者我错过了一步?有时箭头指向相反的方向,我的假设是我的数学问题。

1 个答案:

答案 0 :(得分:0)

从x&amp;计算弧度Y:

double r = atan(y/x);
if (x<0)
    r = M_PI + r;
else if (x>0 && y<0)
    r = 2 * M_PI + r;

当X为零时没有除以0的问题,因为atan函数正确处理了这个问题:

  

如果参数为正无穷大(负无穷大),则返回+ pi / 2(-pi / 2)。