2012-10-03 20 views
11

假設我有一個有中心的D維球體[C1,C2,C3,C4,... CD]和一個半徑R.現在我想繪製N個均勻分佈的點(與每個點等距其他)在球體的表面上。這些點的確切位置並不重要,只是它們彼此完全等距。我想,返回這些點的陣列功能,P.如何繪製D維球體表面上的N點,大致等距離分開?

function plotter(D, C[1...D], R, N) 
{ 
    //code to generate the equidistant points on the sphere 

    return P[1...N][1...D]; 
} 

3-dimensional sphere with many points

3-dimensional sphere with a few points

+0

這在數學上是相當技術上得到正確的。我會在math.stackexchange.com上提出這個問題。但只是將它作爲單位D-Sphere上的點(因爲縮放和平移使它的半徑R,居中於(c_1,...,c_D)是微不足道的。 –

+0

我還沒有完全想到這一點,所以它(R,0,0,...,0)並假設球體在原點處居中),現在在D-1軸上旋轉該點(shouldn' (但它必須是一致的)以θ/(N-1)的角度,並在那裏放置一個新點(這將涉及到很多[矩陣乘法](http://en.wikipedia.org/wiki/Rotation_matrix# General_rotations),做這個N-1次,這可能讓你想要你想要的,但是我很抱歉,如果它失敗了,我還沒有想到它會一直如此。 –

+0

您可以創建一個隨機解決方案,然後對其進行退火。在D-Sphere上創建N個隨機點。使用均勻性度量來評估它。隨機調整一個隨機點。如果這改善了措施,請保持調整,否則撤消它。重複,直到累了。 – NovaDenizen

回答

0

我能想到的唯一的辦法應該產生良好的結果是。

  1. 在球體表面生成N個點。通常的做法是,根據D維正態分佈生成點並歸一化回到球體。這些將不會被等距分開 - 所以我們需要第二步
  2. 接下來使用一些排斥函數使每個點排斥其他點並使用一個小的時間步,您將運動方向調整爲與D球相切。移動點,然後重新投影到球體。繼續這樣做,直到你足夠的考慮點。
6

有幾個選項:

  • 隨機扔在球點並使用勞埃德鬆弛,使它們均勻地分佈:你反覆計算其Voronoi圖,並將它們移向其Voronoi單元的中心(而不是在球體上工作,你可能想要使用一個侷限於球體的歐幾里德沃羅諾伊圖:例如CGAL可以參考,或者參考my article)。

  • 如果粗略的近似值很好(即,如果均勻隨機分佈足夠好),您可以使用Wiki上描述的公式:N-Sphere。如果不是,您仍然可以使用此隨機採樣作爲上述方法的初始化。

  • 對於等距採樣仍然是隨機但較好的概念,可以生成泊松磁盤分佈。高維的快速代碼可在Robert Bridson's homepage獲得。不過,您可能需要將其調整爲球形域。

1

我不知道這裏是否已經提到過;但是你也可以像其他人所說的那樣從球體上的均勻分佈中提取畫點。之後,根據能量來流動每個點;使用梯度下降法。這個特殊的問題受到了很多關注。看看以下paperthis website

+0

作爲一個插件,我已經爲[在球體上生成點的有序分佈]編寫了Python代碼(https://github.com/arvsrao/SpherePoints)。 – Arvind

+0

你知道在哪裏可以找到n球的實現嗎? (N> 2) – gota