【问题标题】:How do you calculate the angle between one object and another?你如何计算一个物体和另一个物体之间的角度?
【发布时间】:2012-03-09 20:42:22
【问题描述】:

假设你的第一个对象是你的原点并且向上的向量是向上的,你如何计算一个对象和另一个对象之间的角度?我在 android 和 java 中为这个问题苦苦挣扎了大约六个小时,没有任何真正好的问题或答案可以给出正确的计算方法。

如果问题不是很清楚: 我在屏幕上有一个对象,我想知道这个对象与屏幕上另一个对象的 y 轴(或 90 度)的角度是多少。因此,如果第一个对象在 1,1,第二个对象在 2,2,那么角度应该是 315。这是因为 0 度向右,90 度向上(y 轴),180 度向左, 270 度向下。

【问题讨论】:

  • 你可以试试数学栈交换网站。
  • [叹气] 我想你想要arctan,但你的问题很不清楚。
  • 这是题外话。但答案是dot product.,
  • 还有什么不清楚的地方?我发布这个问题是因为我找到了答案,但我花了大约 2 天的时间。我希望它会帮助别人。顺便说一句,即使我搜索了几个小时,我也没有在互联网上找到答案。 8 小时后,我将发布我找到的答案,但请随时回答。我会在任何一天选择一个更好的答案。

标签: java android angle


【解决方案1】:

可能有更优雅的解决方案,但我发现这很有效:

float angle = (float)Math.toDegrees(Math.atan2((double)(y1 - y2),(double)(x1 - x2)));
angle = (angle + 180.0f) % 360.0f;
angle = 360.0f - angle;

这给出了从 0 向右、90 向上、180 向左和 270 向下开始的角度。我回答了我自己的问题,因为我花了一天多的时间才找到它,而且它不在互联网上。我希望它可以帮助某人。我将把这个问题搁置一两天,看看是否有人能找到更优雅的解决方案或更好的方式来表达答案。这个答案是用 java 编写的,并且已经在 Android 上进行了测试。

【讨论】:

    【解决方案2】:

    答案是使用dot product,因此:

    theta = arccos( a.b / (||a|| ||b||) )
    

    其中. 表示点积,|| || 表示向量幅度。

    因此,在您的情况下,您选择 a 代表“向上”(因此可能是 (0,0,1)),而 b 代表您的两点之间的差异。

    【讨论】:

    • @JamesHolloway:我没有给人们提供完整编码解决方案的习惯。我建议看一下我链接到的文章;如果您遇到特定问题,请告诉我。
    • 我已经解决了,但是花了很长时间,我希望能帮助其他人提供正确的答案,这样他们就不必花 2 天时间来弄清楚.
    【解决方案3】:

    在 Java 中有一个名为 Math.atan2() 的函数。这需要一个“向量”。通常你有 2 个点,你需要计算它们之间的角度。这可以像这样完成:

    Point p1 = new Point(2,6);
    Point p2 = new Point(3,1);
    double angle = Math.atan2(p2.y-p1.y,p2.x-p1.x);
    

    Math.atan2 以此处指定的格式返回结果:Math.atan2

    【讨论】:

    • 这是二维的。 3D 呢?
    • 关闭,但它没有给出正确的答案,即向右 0 度、向上 90 度、向左 180 度和向下 270 度。它给出了相反的结果,这是没有帮助的。它还给出了从 -180 到 +180 的答案(转换为度数时)。
    • 是的。它按照上述文档中的指定返回它。如果结果低于 0,则从 360 中减去结果。这应该可以满足您的需求。
    • 是的,但是在您使用 Math.toDegrees(angle) 进行转换后,它仍然在 -180 到 +180 的范围内......所以 "angle = 360 - Math.toDegrees(angle) " 仍然不正确...
    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多