2012-12-22 98 views
0

所以我正在一个三维场景,我需要随意转换和从极坐标转换,并写了一个函数来帮助我转换。问题在于它会经常导致其中一个角度出现NaN。我使用的功能如下:笛卡尔到极坐标导致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 
} 

披是什么是返回NaN,并且虽然我虽然我想通了,它导致NaN的它好像它是在某些点发生的所有整个场景中

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

凡在左上角看到相机的极性和笛卡尔坐标,极坐标的最后一节(PHI)将显示为NaN的时。

我认为它与我的数学有些类似的问题,因为我不擅长它,但它似乎可能是一个不同的问题,比如我不理解如何使用Math.asin ...

感谢您的时间,并让我知道是否有任何其他人需要的信息!

艾萨克

+0

x可以为零吗?那将导致在该行上除以零 – mindandmedia

+0

asin仅从-1到1定义;它返回NaN,只要y> x或y <-x – Stuart

回答

1

如果你希望皮皮能像方位(例如在水平面以上,-pi - > PI),你应该使用ATAN2。

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

在这个页面http://en.wikipedia.org/wiki/Spherical_coordinate_system在坐标系转换部分它说使用atan(y,x)而不是atan square正确吗?或者会导致0到2PI之间的phi,而不是-PI和PI? – Cabbibo

+1

无论你是在[0,2 * pi]方面工作还是(-pi,pi)通常都只是惯例,任何使用角度的数学代码都不应该注意。atan的问题只能定义在[0,pi/2)区间,所以你可以得到一个角度,但不知道你在哪个“象限”。Atan2有效地做一个atan,然后解决角度在哪个象限中,(你可以看看x和y的符号来做这),以获得一个完整的角度。见http://en.wikipedia.org/wiki/Atan2 – stevejpurves

+0

非常清晰的解释。非常感谢! – Cabbibo

1

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

您的phi等式看起来不正确。检查了这一点:

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

+0

对不起,我的意思是球形。总是忘记添加额外的维度......另一位评论者说要使用atan2,但在那篇文章中说的是使用atan,你知道其中哪一个是正确的,还是只是定义了phi的范围? – Cabbibo

+1

它们是同一件事的超载版本。我更喜欢atan2,因为它保留了你想正确使用的象限。 – duffymo

+0

这是有道理的!谢谢! – Cabbibo