Javascript 笛卡尔坐标到极坐标,导致NaN

Javascript 笛卡尔坐标到极坐标,导致NaN,javascript,math,3d,three.js,polar-coordinates,Javascript,Math,3d,Three.js,Polar Coordinates,所以我正在处理一个三维场景,在那里我需要随意转换极坐标,并编写了一个函数来帮助我转换。问题是,这会导致其中一个角度的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 toRetu

所以我正在处理一个三维场景,在那里我需要随意转换极坐标,并编写了一个函数来帮助我转换。问题是,这会导致其中一个角度的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的,但它似乎在整个场景的某些点上发生

您可以在这里看到问题:

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

我认为这是我数学上的一个问题,因为我不是很擅长,但这似乎是另一个问题,比如我不懂如何使用数学

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


艾萨克

你不需要极坐标;您似乎需要球坐标

你的phi方程看起来不对。看看这个:


如果希望φ与方位角类似(例如,在水平面上,-pi->pi),则应使用atan2

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

x可以是零吗?这将导致在该直线上被零除,该直线的定义范围仅为-1到1;每当y>x或y<-xon时,它返回NaN。在该页的坐标系转换部分,它说使用atan(y,x)不是atan square正确吗?或者这会导致phi介于0和2PI之间,而不是-PI和PI?无论您是按照[0,2*PI)还是(-PI,PI]的方式工作,通常都只是惯例,使用角度的任何数学代码都不应该注意。atan的问题仅定义在[0,PI/2)间隔上,因此您可以获得角度,但不知道是哪个“象限”你在。Atan2有效地执行atan,然后解析角度所在的象限(你可以查看x和y的符号来执行此操作)为了得到一个完整的角度。对不起,我的意思是球形。总是忘了添加额外的维度…另一个评论者说使用atan2,但在那篇文章上说使用atan,你知道其中哪一个是正确的,或者它只是定义phi的范围吗?它们是相同事物的重载版本。我更喜欢atan2,因为它预先定义了服务于您想要正确进入的象限。