【问题标题】:Calculating angle between two vectors?计算两个向量之间的角度?
【发布时间】:2013-05-23 14:12:54
【问题描述】:

我正在开发一个 iOS 应用程序,它必须根据设备标题显示 POI(兴趣点)。我使用CLLocationManager 来获取用户的位置和航向。我有一对目的地的坐标。基于此,我正在计算哪个季度是那个季度,并以度为单位返回与南(0度)偏差的浮点值。我在北方有 -/+180 度,在南方有 0 度。这是代码sn-p:

-(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是东等等!

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

edit2:我在角度上犯了一个错误。官方官方说东-90度西90度。

【问题讨论】:

  • 旁注:测试浮点是否相等可能不会给您预期的结果。
  • 是的,但是准确地看 N/S/E/W 设备精度几乎是不可能的,所以这完全是出于“数学”目的

标签: iphone ios cllocationmanager compass-geolocation


【解决方案1】:

如果我没看错的话,公式

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

应该适用于所有象限,使所有if 语句变得不必要。


atan2(y, x)返回向量(x, y)与x轴正方向的夹角,返回值始终在-pipi之间。

将参数中的(y, x) 替换为(x, -y) 表示向量旋转了90度,因此上式的结果 是测量到负 y 轴的角度,这是您想要的。


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

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

【讨论】:

  • 朝南我有0度,向东是-,向西是+,所以我猜应该最后是atan2(-x,-y)吧?
  • @FilipChwastowski:对于 x > 0,y == 0 我的公式给出的角度 = 90 度,我认为这就是你想要的。
  • 不,我确实提到我在北方有 -/+180 度;)请编辑你的答案,这样没有人会迷失方向,最终 +/- 度方向是我可以接受的;)跨度>
  • @FilipChwastowski:对不起,我现在很困惑。在您的问题中,您有代码if (x &gt; 0 &amp;&amp; y == 0) { NSLog(@"look east"); angle = 90.0; },所以我的答案基于此。所以你真的想要东方向的角度= -90?
  • 我的错,对不起 - 你当然是对的,再次道歉 :) 回答被接受 ;)
【解决方案2】:

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

Google 地图即使使用相对不准确的指南针也能正常工作的主要原因是,道路的结构会为您提供提示,因此与不知道道路在哪里相比,您可能会遇到更大的错误。

【讨论】:

  • 你确定它“知道”吗?如果 x * y > 0 怎么办?可能的情况是:都 0 ...
  • 是的。这就是您为 atan2 提供两个参数的原因。如果xy 都是负数,那么你就在象限III。如果它们都是正面的,那么您就在象限 I 等。 atan2 的输出将介于 pi 和 -pi 之间(我认为)。这就是整个圈子。
  • arctg(alfa) 总是介于 -pi/2 和 pi/2 之间;)
  • 这正是 arctg(alpha) 和 atan2(y, x) 之间的区别。 1 的反正切可以是 45 度(或225 度,或405 度,...),但arctg(1) 是pi/4(它选择-pi 和pi 之间的那个)。但是然后 atan2(1, 1) != atan2(-1, -1)。 atan2(1, 1) 是 pi/4,但 atan2(-1, -1) 是 -3pi/4。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多