2017-06-12 102 views
1

我試圖找出什麼是下一個例子回事
https://threejs.org/examples/css3d_periodictable.html(球體版)three.js所球面座標公式

var vector = new THREE.Vector3(); 
var spherical = new THREE.Spherical(); 
for (var i = 0, l = objects.length; i < l; i ++) { 
    var phi = Math.acos(-1 + (2 * i)/l); 
    var theta = Math.sqrt(l * Math.PI) * phi; 
    var object = new THREE.Object3D(); 

    spherical.set(800, phi, theta); 
    object.position.setFromSpherical(spherical); 
    ... 
} 

我讀了一些文章數學(有剛剛轉換的說明球座標到笛卡爾),並發現這個問題 Can someone explain the formula。由於我的名譽,我不可能在那裏發表評論,但是我仍然不明白他們是如何得到這兩個公式的。

var phi = Math.acos(-1 + (2 * i)/l); 
var theta = Math.sqrt(l * Math.PI) * phi; 

所以我的問題是:

1)你如何獲得這些公式?

2)爲什麼用來獲得phi和theta的對象的長度?

回答

2

請注意phi對應於反餘弦定律從Pi變爲0,而theta線性取決於phi。所以這些角度的組合形成了半球表面上的螺旋(給出的代碼不包含使第二個半球形成線索)。

反餘弦定律提供了等距線圈(圈?不知道螺旋圈的確切術語)。 theta的線性相關性給出了方位(經向)角度上的一些分佈。 Sqrt(Pi*L)由於總體螺旋長度(適合L項),選擇了乘數。

看週期表開始的球體的極點 - 極點處的氫,氦與其接近,鋰是下一個等等 - 形成螺旋狀。

請注意,phi/theta名稱與普通(和wiki頁面)名稱不同 - 此處θ是方位角。

+0

謝謝,我是對的,循環中phi的所有值總是在從「Pi到0」的範圍內,如果我設置** i = L **和** i = 0 **,我會得到這兩個邊界「0和Pi」? 其實我現在才注意到螺旋!但是爲什麼Sqrt,爲什麼L並不是每個對象的大小? Sqrt(Pi * L)是否像一個螺旋長度的公式?也許是有一些數學解釋的鏈接,它也會有幫助 –

+1

是的,0..Pi是反餘弦主體值的範圍。隨着i = L和0,你會得到0和Pi。對象應該沿着所有螺旋分佈,所以它的長度已被使用。我不知道這個球形螺旋長度的公式,但它可以通過積分曲線元素(微分幾何)推導出來。 – MBo