1

我正在开发一个 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 ;
}

不知何故,当目标在第四季度,但从南到 -93 度时,我遇到了这种情况。我迷路了,我不知道如何解决这个问题......

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

ps:我读过iPhone指南针真的很糟糕,但如果是这样的话,谷歌地图之类的应用程序如何正常工作?

edit2:我在角度上犯了一个错误。正式地,东部有 -90 度,西部有 90 度。

4

3 回答 3

2

如果我没看错,公式

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;
于 2013-05-23T14:39:14.823 回答
1

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

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

于 2013-05-23T14:23:26.223 回答
0

实际上,在决定了它是哪个象限之后,我将代码更改为始终使用 x 和 y 的正值来计算 atan2 - 现在它可以工作了!

于 2013-05-23T14:34:32.313 回答