2012-12-22 145 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