【问题标题】:Cartesian to Polar coordinates resulting in NaN笛卡尔到极坐标导致 NaN
【发布时间】:2012-12-23 05:40:50
【问题描述】:

所以我正在处理一个 3-D 场景,我需要在其中随意转换和从极坐标转换,并编写了一个函数来帮助我转换。问题是它经常导致其中一个角度的 NaN。我使用的功能如下:

toPolar: function(x,y,z){
    var sqrd = (x*x)+(y*y)+(z*z)
    var radius = Math.pow(sqrd,.5)
    var theta = Math.acos(z/radius)
    var phi = Math.asin(y/x)
    var toReturn={
        r:radius,
        t:theta,
        p:phi
    }
    return toReturn
}

Phi 是返回 NaN 的原因,虽然我知道它在哪里导致 NaN,但它似乎在整个场景中的某些点发生

您可以在这里看到问题: http://cabbibo.com/sketches/audioSketch3/

在左上角,您可以看到相机的极坐标和笛卡尔坐标,极坐标 (phi) 的最后一部分会不时显示为 NaN。

我认为我的数学存在某种问题,因为我并不擅长它,但似乎这可能是一个不同的问题,例如我不了解如何使用 Math.asin ...

感谢您的宝贵时间,如果有人需要任何其他信息,请告诉我!

艾萨克

【问题讨论】:

  • x 可以为零吗?这将导致该行被零除
  • asin 仅定义为从 -1 到 1;每当 y > x 或 y 时,它都会返回 NaN

标签: javascript math 3d three.js polar-coordinates


【解决方案1】:

如果您希望 phi 像方位角一样(例如,在水平面上,-pi -> pi),您应该使用 atan2。

var phi = Math.atan2(y,x);

【讨论】:

  • 在这个页面上en.wikipedia.org/wiki/Spherical_coordinate_system 在坐标系转换部分它说使用 atan(y,x) 而不是 atan square 对吗?还是会导致 phi 介于 0 和 2PI 之间,而不是 -PI 和 PI?
  • 无论您是按照 [0,2*pi) 还是 (-pi,pi] 工作通常只是惯例,使用您的角度的任何数学代码都不应注意。atan 的问题只是在 [0,pi/2) 区间内定义,因此您可以获得一个角度,但不知道您在哪个“象限”中。Atan2 有效地执行 atan,然后解析角度所在的象限,(您可以查看x 和 y 的符号来做到这一点)以获得一个完整的角度。见en.wikipedia.org/wiki/Atan2
【解决方案2】:

你不想要极坐标;你似乎想要球坐标。

您的 phi 方程看起来不正确。看看这个:

http://en.wikipedia.org/wiki/Spherical_coordinate_system

【讨论】:

  • 对不起,我的意思是球形的。总是忘记添加那个额外的维度......另一个评论者说使用atan2,但在那篇文章中说使用atan,你知道其中哪个是正确的,还是只是定义phi的范围?跨度>
  • 它们是同一事物的重载版本。我更喜欢 atan2 因为它保留了您想要正确进入的象限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2015-06-17
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多