计算两个向量之间的angular度?

我正在开发一个iOS应用程序,它必须根据设备标题显示兴趣点(兴趣点)。 我使用CLLocationManager来获取用户的位置和标题。 我有一对目的地的坐标。 基于此,我正在计算哪一个季度是这样的,并返回偏离南(0度)的浮点值。 我在北方有180度,南方有0度。 这里是代码片段:

 -(float)updateTargetLongitude:(float)lon Latitude:(float)lat{ // //longitude = x // //latitude = y NSLog(@"current location = (%.5f, %.5f)", [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLongitude"], [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLatitude"]); float x = lon - [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLongitude"]; float y = lat - [[NSUserDefaults standardUserDefaults] doubleForKey:@"currentLatitude"]; float angle; NSLog(@"Searching angle from source (%.5f, %.5f) to destination (%.5f, %.5f)", locationManager.location.coordinate.longitude, locationManager.location.coordinate.latitude, lon, lat); if (x == 0 && y == 0) { NSLog(@"you're there already!"); return -0.1; } if(x == 0 && y > 0){ NSLog(@"look north"); angle = 180.0; } if (x == 0 && y < 0) { NSLog(@"look south"); angle = 0; } if (x > 0 && y == 0) { NSLog(@"look east"); angle = 90.0; } if (x < 0 && y == 0) { NSLog(@"look west"); angle = -90; } if (x > 0 && y > 0) { NSLog(@"first quarter"); angle = -atan2f(y, x) - M_PI_2; } if (x < 0 && y > 0) { NSLog(@"second quarter"); angle = atan2f(y, x) + M_PI_2; } if (x < 0 && y < 0) { NSLog(@"third quarter"); angle = atan2f(x, y); } if (x > 0 && y < 0) { NSLog(@"fourth quarter"); angle = -atan2f(x, y); } NSLog(@"returning radians angle = %.4f for (%.5f, %.5f) :: degrees = %.3f", angle, y, x, angle * 180 / M_PI); return angle * 180 / M_PI ; } 

不知怎的,我有情况,目标是在第四季度,但从南方-93度。 我迷路了,我不知道如何解决这个问题。

编辑:按季度我是指笛卡尔坐标系,其中+ y是北,+ x是东等等!

PS:我读过iPhone指南针真的很糟糕,但是如果是这样的话,像Google地图这样的应用程序是否正常工作?

编辑2 :我犯了一个错误的angular度。 东部-90度,西部90度。

如果我看到它正确的,公式

 angle = atan2(x, -y) * 180.0/M_PI; 

应该在所有象限中工作,使所有if语句不必要。


atan2(y, x)返回向量(x, y)和正x轴之间的angular度,返回值总是在-pipi之间。

在参数中用(x, -y)代替(y, x)意味着向量被旋转90度,因此上面公式的结果是测量到负的y轴的angular度,这就是你想要的。


更新(根据问题中的“edit2”):如果要求是“南= 0度”,“东= 90度”,“西= 90度”,那么公式将是

 angle = atan2(-x, -y) * 180.0/M_PI; 

atan2函数已经考虑了象限。 换句话说,如果xy都是负的,它就“知道”你处于第三象限。 知道这一点,你可以看到atan2(y, x)的angular度输出是什么,然后将其改变为你想要显示的方式。

谷歌地图的主要原因,即使是一个相对不准确的指南针,道路的结构给你的提示,所以你可以得到一个更大的错误比如果你不知道在哪里的道路。

实际上,在决定了哪个象限之后,我改变了代码,总是用x和y的正值来计算atan2 – 现在它起作用了!