Iphone 计算两个向量之间的角度?

Iphone 计算两个向量之间的角度?,iphone,ios,cllocationmanager,compass-geolocation,Iphone,Ios,Cllocationmanager,Compass Geolocation,我正在开发一个iOS应用程序,它必须根据设备标题显示POI(兴趣点)。我使用CLLocationManager获取用户的位置和标题。我有一对目的地的坐标。基于此,我计算哪个季度是那个季度,并返回偏离南方(0度)的浮动值,单位为度。我在北方有-/+180度,在南方有0度。下面是代码片段: -(float)updateTargetLongitude:(float)lon Latitude:(float)lat{ // //longitude = x // //latitude = y

我正在开发一个iOS应用程序,它必须根据设备标题显示POI(兴趣点)。我使用
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 ;
}
-(float)updateTarget经度:(float)经度:(float)纬度:(float)纬度{
////经度=x
////纬度=y
NSLog(@“当前位置=(.5f,%.5f)”,[[NSUserDefaults standardUserDefaults]doubleForKey:@“CurrentLength”],[[NSUserDefaults standardUserDefaults]doubleForKey:@“currentLatitude”];
float x=lon-[[NSUserDefaults standardUserDefaults]doubleForKey:@“currentLength”];
浮动y=lat-[[NSUserDefaults standardUserDefaults]doubleForKey:@“currentLatitude”];
浮动角;
NSLog(@“从源(%.5f,%.5f)到目标(%.5f,%.5f)的搜索角度)”,locationManager.location.coordinate.longitude,locationManager.location.coordinate.latitude,lon,lat);
如果(x==0&&y==0){
NSLog(@“你已经在那里了!”);
回报率-0.1;
}
如果(x==0&&y>0){
NSLog(“向北看”);
角度=180.0;
}
如果(x==0&&y<0){
NSLog(“向南看”);
角度=0;
}
如果(x>0&&y==0){
NSLog(“向东看”);
角度=90.0;
}
如果(x<0&&y==0){
NSLog(“向西看”);
角度=-90;
}
如果(x>0&&y>0){
NSLog(“第一季度”);
角度=-atan2f(y,x)-M_PI_2;
}
如果(x<0&&y>0){
NSLog(“第二季度”);
角度=atan2f(y,x)+M_PI_2;
}
if(x<0&&y<0){
NSLog(“第三季度”);
角度=atan2f(x,y);
}
如果(x>0&&y<0){
NSLog(“第四季度”);
角度=-atan2f(x,y);
}
NSLog(@“返回弧度角度=%.4f,对于(%.5f,%.5f)::度=%.3f”,角度,y,x,角度*180/M_-PI);
返回角*180/M_PI;
}
不知怎的,我有这样的情况,当目标在第四节,但是-93度从南。我迷路了,我不知道如何修复它

编辑:按季度,我指的是笛卡尔坐标系,+y是北,+x是东,依此类推

p、 美国:我听说iPhone compass真的很糟糕,但如果是这样的话,像谷歌地图这样的应用程序是如何正常工作的呢


编辑2:我在角度上犯了一个错误。当然,东90度,西90度。

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


谷歌地图即使使用相对不准确的指南针也能正常工作的主要原因是,道路的结构会给你提示,因此你可以比不知道道路在哪里的情况下产生更大的错误。

事实上,在决定了它是哪个象限后,我改变了代码,总是用x和y的正值计算atan2-现在它工作了

如果我看对了,公式

angle = atan2(x, -y) * 180.0/M_PI;
应该在所有象限中工作,使得所有
if
语句都不必要


atan2(y,x)
返回向量
(x,y)
和正x轴之间的角度,返回值始终在
-pi
pi
之间

将参数中的
(y,x)
替换为
(x,-y)
意味着向量旋转90度,因此上述公式的结果 是相对于负y轴测量的角度,这是您想要的


更新(根据问题中的“edit2”):如果要求为“南=0度”、“东=-90度”、“西=+90度”,则公式为

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

你确定它“知道”吗?如果x*y>0怎么办?在两种情况下都是可能的:都<0或都>0…是的。这就是为什么要为atan2提供两个参数。如果
x
y
均为负值,则您处于象限三。如果两者均为正值,则您处于象限一,以此类推。atan2的输出将介于π和-π之间(我认为)。这就是整个循环。arctg(alfa)始终在-pi/2和pi/2之间;)这正是arctg(α)和atan2(y,x)之间的区别。1的反正切可以是45度(或225度,或405度,…),但arctg(1)是pi/4(它选择-pi和pi之间的一个)。但随后atan2(1,1)!=atan2(-1,-1)。atan2(1,1)是π/4,但atan2(-1,-1)是-3pi/4。旁注:测试浮点是否相等可能不会得到预期的结果。是的,但精确地看N/S/E/W和设备精度几乎是不可能的,因此这完全是出于“数学”目的面向南我有0度,向东是-,向西是+,所以我想它最终应该是atan2(-x,-y),对吗?@FilipChwastowski:对于x>0,y==0,我的公式给出了角度=90度,我想这就是你想要的。不,我确实提到过我在北方有-/+180度;)请编辑您的答案,这样就不会在最终+/-度方向处迷路,所以我可以接受;)@菲利普什瓦斯托斯基:对不起,我现在很困惑。在你的问题中,如果(x>0&&y==0){NSLog(@“向东看”);angle=90.0;},你的代码是
,所以我的答案基于此。所以你真的想要东边方向的角度=-90?我的错,对不起-当然你是对的,再次道歉:)回答接受;)