球面上的“均勻”分佈
首先,如何定義這個題目中的“均布”,理解為“evenly distributed”,也就是儘可能儘可能減少跟“uniform distribution”的discrepancy。寫得更加準確一點就是:
其中
球面兩點的夾角(等價於測地距離),
是球面上以
為中心,
為最大夾角的圓覆蓋區域,
表示球面上某個區域的測度(面積)。
如何在球體上均勻分佈點的問題由來已久,在數學、物理、化學和計算的許多領域都具有巨大的意義,包括但不僅限於數值分析、逼近論、晶體學、病毒形態、靜電、編碼理論和計算機圖形學,所以從各種角度研究這個問題的方法都有。除了少數情況外(比如等價於正多面體頂點的情形),這個問題仍沒有完全解決。因此,一般只能求得近似解決方案。
下面介紹兩種方法:
最小勢能法
其中一種方法是將散點想象為同種電荷的相同粒子,分佈在球面上,使得總勢能最小,也就是尋找一組
個點:
使得最小化
不難知道上式是可以取到最小值的,但上面的函式有非常多的區域性極小值。如何選取到最小值就是典型的流形上的光滑最佳化問題,需要透過最佳化數值求解,參考彙總的結果
對於49個點,其中一個近似解如下(北極方向的正交投影):
再多一些點也有近似解,比如2500個點,北極的正交投影就是:
斐波那契格點構造法
另一種比較“美觀”的做法是構造斐波那契網格,本質是上
區域上的斐波那契網格經過保面積變換投影到球面上的樣子(Lambert azimuthal equal-area projection)
首先是
上的斐波那契網格,也就是
def
gen_fib_lattice
(
N
):
phi
=
(
1
+
np
。
sqrt
(
5
))
/
2
x
=
(
np
。
arange
(
1
,
N
+
1
)
/
phi
)
%
1
y
=
np
。
arange
(
1
,
N
+
1
)
/
N
return
x
,
y
看起來就是:
斐波那契格點在平面上有均勻分佈的特性,然後透過保面積變換,將其變到圓上:
def area_preserve_rec2circ(x, y):
theta = 2 * np。pi * x
r = np。sqrt(y)
return theta, r
看起來就是
最後還是透過保面積變換,將平面上的圓變換到球面,也就是前面提到的Lambert azimuthal equal-area projection
def area_preserve_circ2sphere(theta, r):
phi = 2 * np。arcsin(r) # latitude
x = np。cos(theta) * np。sin(phi)
y = np。sin(theta) * np。sin(phi)
z = np。cos(phi)
return x, y, z
對於N=49,長得是這個樣子:
也可以求任意給定點數的排布,比如N=2500,看起來比最小能量的結果更加詭異一點:
總結
這次介紹了逼近球面上“evenly distributed”均勻布點的兩種方法,一種是計算勢能,類似光滑曲面上的帶電粒子排布,另一種是平面的某種均布(斐波那契格點)透過兩步保積變換投影到球面上。 當然還有一些基於距離的做法。不管怎樣,所謂球面上均布的網格、插值、積分以及各種數值方法有非常緊密聯絡,非常重要就是了~ @派大西
參考連結:
How to evenly distribute points on a sphere more effectively than the canonical Fibonacci Lattice
Distributing many points on spheres: minimal energy and designs
https://
stackoverflow。com/quest
ions/9600801/evenly-distributing-n-points-on-a-sphere