【问题标题】:Angle in 360 degrees360度角度
【发布时间】:2014-09-25 16:57:27
【问题描述】:

我在这里编写了这段代码:

     double cosine = (v1.x*v2.x+v1.y*v2.y)/(150*150);               
     double radian = Math.acos(cosine);
     double angle = Math.toDegrees(radian);

V1 和 V2 是两个向量,它们是简单的 Point(s)() 以保持简单。现在我计算。它们之间的角度,效果很好。但是超过180度。 ,它又回到 179,178 ......但我想要 360°。

问题是例如弧度不会变成负数,所以我可以把它放在一个 if-Segment 中......

感谢您的建议。

【问题讨论】:

  • 这似乎更像是一个数学问题而不是编码问题。你会怎么用纸和铅笔做这个?
  • 是的,我认为这也是一道数学题。我编码的方式就是我在纸上写的方式(我是这样学的)。似乎开始的线只是给了我更小的角度。
  • acos 总是返回前两个象限的值。您必须根据顶点确定您所在的象限,然后相应地调整结果。

标签: java math geometry angle


【解决方案1】:

您正在使用两个向量的点积来计算它们之间的角度,但是,由于点积是可交换的 a.b = b.a - 因此,没有办法获得角度的意义,只有它的大小(正如您所发现的)-acos 在 180º 上是模棱两可的。

尝试改用atan2。它应该是这样的:

double theta1 = Math.atan2(v1.y, v1.x);
double theta2 = Math.atan2(v2.y, v2.x);
double theta = theta1 - theta2;

请注意,atan2 总是在 -pi ... pi 中返回答案,因此您必须添加 pi 以使其在 0 ... 2.0 * pi 范围内。

【讨论】:

  • 您不想添加 pi。如果小于 0,则要添加 2*pi。
【解决方案2】:

您可以同时使用标量积和叉积来获得全范围角度(大多数数学库为 -Pi..Pi):

radian = Math.atan2(v1.x*v2.y-v1.y*v2.x, v1.x*v2.x+v1.y*v2.y)

【讨论】:

  • 啊,我明白了。好的,但我仍然需要检查它是否是
  • mh,好吧,我改变了它,有 0180 和 0-179 的值
  • 我解决了这个问题:double diff = 180+Math.toDegrees(radian); if(radian
  • 最好加一次 360(如果为负数) - 以获得逆时针转动 v1 直到 v2 所需的角度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多