【问题标题】:JavaScript atan2() function not giving expected resultsJavaScript atan2() 函数未给出预期结果
【发布时间】:2012-05-07 18:39:53
【问题描述】:

通常,极坐标从 0 到 π 再到 2π(实际上就在 2π 之前,因为它又等于 0)。然而,当使用 JavaScript atan2() 函数时,我得到了一个不同的、奇怪的范围:

笛卡尔 X |笛卡尔Y | θ (θ) ==================================================== ========= 1 | 0 | 0 (0 × π) 1 | 1 | 0.7853981633974483 (0.25 × π) 0 | 1 | 1.5707963267948966 (0.5 × π) -1 | 1 | 2.356194490192345 (0.75 × π) -1 | 0 | 3.141592653589793 (1 × π) -1 | -1 | -2.356194490192345 (-0.75 × π) 0 | -1 | -1.5707963267948966 (-0.5 × π) 1 | -1 | -0.7853981633974483 (-0.25 × π)

如您所见,到达 π (180°) 后,它会向下跳到 –π (–180°),然后再回到 0。我怎样才能让它使用范围 {0, ..., 2π} 而不是 {–π, 。 ..,π}?我一直在尝试考虑每个计算来“修复”这些值,但我也想知道为什么 JavaScript 选择这个范围而不是典型的极坐标范围。谢谢!

【问题讨论】:

    标签: javascript coordinates atan2 radians polar-coordinates


    【解决方案1】:

    atan2 返回该范围内的角度是相当标准的;例如,这就是 C 标准库中的 atan2 所做的。

    如果你想要0..2pi而不是-pi..pi,测试结果是否为负,如果是则添加2pi。

    【讨论】:

    • 我将此答案标记为正确只是因为它回答了我关于“为什么”的问题(这是标准的)。我想我只需要处理这种特质。谢谢!
    • 不客气。使用范围 -pi..pi 确实没有什么比大约 0..2pi 更特殊的了。事实上,可以说它更有意义,因为它将不连续性置于负 x 轴而不是正 x 轴,这通常是明智的。例如,atan2(y,x) 或多或少与 log(x+iy) 的虚部相同,当 x+iy 为正且实数时,您真的希望它被定义(且连续)。
    【解决方案2】:

    这是atan2(y, x) 不是atan2(x, y)

    【讨论】:

    • 天哪...花了我一个小时来解决我的错误...谢谢!为什么有人会创建这样的 API?这个订单有什么理由吗?
    【解决方案3】:

    如果结果是否定的,只需将2 * PI 添加到结果中。

    function atan2Normalized(x,y) {
        var result = Math.atan2(x, y);
        if (result < 0) {
            result += (2 * Math.PI);
        }
        return(result);
    }
    

    【讨论】:

    • @GarethMcCaughanq - 你是对的 - 我知道,但只是打错了。我已经更正了。
    • 谢谢!这肯定会有所帮助。我也可以使用条件(或任何技术术语),例如theta_fixed = (theta &gt; 0) ? theta : (theta + 2 * Math.PI);
    【解决方案4】:

    我怎样才能让它使用范围 {0, ..., 2π} 而不是 {–π, ..., π}?

    Math.atan2(Y,X) 函数将为-0 提供与0 不同的结果。

    例如,Math.atan2(0, -1) 返回3.141592653589793Math.atan2(-0, -1) 返回-3.141592653589793

    您可以使用这个事实来简化等式,以获得[0, 2π) 范围内的结果。

    注意如果您否定 XY 值会得到什么:

       X   |   Y   |  -X   |  -Y   |  Math.atan2(-Y,-X)
    ===========================================================
       1   |   0   |  -1   |  -0   | -1.00π (-3.141592653589793)
       1   |   1   |  -1   |  -1   | -0.75π (-2.356194490192345)
       0   |   1   |  -0   |  -1   | -0.50π (-1.5707963267948966)
      -1   |   1   |   1   |  -1   | -0.25π (-0.7853981633974483)
      -1   |   0   |   1   |  -0   |  0.00π (0)
      -1   |  -1   |   1   |   1   |  0.25π (0.7853981633974483)
       0   |  -1   |  -0   |   1   |  0.50π (1.5707963267948966)
       1   |  -1   |  -1   |   1   |  0.75π (2.356194490192345)
    

    如果您随后将π 添加到结果中,您将获得[0, 2π) 范围内的值。

    因此你可以使用:

    var theta = Math.atan2(-Y, -X) + Math.PI;
    

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2021-09-15
      • 2016-01-30
      • 2021-04-11
      相关资源
      最近更新 更多