web-dev-qa-db-ja.com

球上にn点を均一に分散させる

球上のn個の点を分散させて、各点がその「周囲」に「同じ」領域を持つようにします。基本的に、n点で評価し、各領域要素が同じである(そして、4pi r ^ 2/nに等しい)と仮定して、球全体で関数を統合しようとしています。

私の質問は これ に非常に関連していますが、「受け入れられた」回答で提示されたコードが希望どおりに機能することに同意できないようです(R = 1000、nxを選択して生成された添付の写真を参照) = ny = 40)。明らかに、私のポイントは極にはるかに集中しており、赤道に沿って非常に集中していません。

助言がありますか? 

編集:参考のために、私は いくつかのソフトウェア 各ポイントがその周りに等しい「面積」を持つようにメッシュを生成することを見つけました(球上で均一な面積分布を確認するには下にスクロールします)が、コード私はより時間のかからないアプローチで行きました:私は単に方位角と極角([0,2pi]と[0、pi])を繰り返し、各パッチの「極小」領域を計算しました(da = r ^ 2 sin theta dtheta dphi)。基本的に、これが球体全体の統合に必要なすべてです。均一な領域の分散を実装するのがそれほど難しくないことを望んでいました。

18
alexvas

背景情報:

球には4つの円周率ステラジアンがあります。これは球の合計「度」ですが、ステラジアンは円形の通常のラジアンとは大きく異なるため、相対的な意味でのみこの用語を使用します。1つは、3次元であるためです。しっかりしています。それらを球のアイスクリームの形をした角度と考えてください。 enter image description here

http://en.wikipedia.org/wiki/Steradian はそれらの素晴らしい例を提供します。

それらは、円のラジアンのように、半径と直接的な関係があります。 1ステラジアン= 1単位の半径の2乗。

したがって、最初に球にプロットする必要のあるアイテムの数を調べます。その数をnとします。 sr =ステラジアン(測定単位)= r^2(半径の2乗)

4 pi / n sr = x

xは、各ポイントに割り当てられるステラジアンの数です。

4点としましょう。

4 pi / 4 sr = x

pi sr = xしたがって、各ポイントにはpi srの割り当てられたスペースが割り当てられます。

ここでこれを検討してください...ポイントをプロットしているので、各ポイントは割り当てられたスペースの中央に配置されると見なします...つまり、円錐形の領域の中央に配置されます。これはsrはです。今、あなたは少し何かを考える必要があります、領域を完全に円で埋めることは可能ですか?真剣に、これについて考えてください...そうではありませんか?黒丸は常に特定の場所の間にスペースを残します。サッカーボールについて少し考えてみてください。それは、均一な分布を提供するために一緒になることができる形状から構成されています。この考えのポイントは、円の半径のように、すべてのドットが正確に特定の距離だけ離れているわけではないことを理解してもらうことです。それでも、サッカーボールの正方形の中心は非常に近く、均一です。

私があなただったら、サッカーボールのように割り当てられた球形の空間のこれらの「チャンク」のそれぞれを配置するための最も効率的な「形状」を特定するアルゴリズムを書いてみることです。そうでなければ、これがあなたが得ようとしている最良の答えかもしれないと思います... 4 pi / n sr = x...、各点をプロットする方法がないので、互いに正確に同じ距離です(特定の構成、つまり特別な数のポイントで可能になる場合)、すべての特別なケースを見つけるためのアルゴリズムが存在する場合があります。

私はこの回答を編集して、特別な場合について詳しく説明しています。ここでは、少し余分な情報があればよいと思います。点が等距離にある特別な場合は、それらが正多面体の頂点を形成する可能性があることです。基本的な正多面体の形状は5つだけで、他のすべてはこれらによって作られています。

詳細とその証拠については、このページをお読みください https://www.uwgb.edu/dutchs/symmetry/platonic.htm

今、私は信用できません、私はいくつかの簡単な調査をして、同様の投稿を見つけました https://math.stackexchange.com/questions/279544/return-an-array-of-evenly-distributed-points- on-a-sphere-give-radius-and-Origin

オイラーの多面体公式の使用 http://plus.maths.org/content/eulers-polyhedron-formula

また、多面体には3つの基本形状、「三角形、正方形、六角形」しか存在しないため、プロットする点の数を最も近い多面体形状に丸めて、それぞれを均等にプロットするアルゴリズムを作成できます。

enter image description here

ああ、そしてこの素晴らしい記事を見てください、それは私よりもはるかに優れたステラジアンと3次元の「度」を説明しています。 http://mathforum.org/library/drmath/view/55358.html

10
Klik

これが私がPythonで作ったばかりのアルゴリズムの例です:

from numpy import random, cos, sin, sqrt, pi
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

def Rand_sphere(n):
  """n points distributed evenly on the surface of a unit sphere""" 
  z = 2 * random.Rand(n) - 1   # uniform in -1, 1
  t = 2 * pi * random.Rand(n)   # uniform in 0, 2*pi
  x = sqrt(1 - z**2) * cos(t)
  y = sqrt(1 - z**2) * sin(t)
  return x, y, z

x, y, z = Rand_sphere(200)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
plt.show()

enter image description here

再び10000ポイントで:

enter image description here

5
wim

間違っている可能性がありますが、

  1. i(a、b)=(a-b)/(| a-b |)^ 3として2点間の相互作用を設定すると、a、bは3D空間のベクトルとして脅かされます
  2. 最初の反復では、通常どおりポイントを配置します(等しい角度の距離で、水泳ポストでどのように言及されているか)
  3. アルゴリズムの各ステップで、Iの合計の勾配(1から)に対して各ポイントを移動します。ここで、Iは直接の近傍でのみ計算されます。
  4. 各ポイントの勾配が0になるまで3を繰り返します。

アルゴリズムは、必要な構成に収束します。時間のかかる作業ですが、さまざまなポイント数の結果をキャッシュできます。

2

各ポイントが同じ量の立体角で囲まれるように、球の均一なピクセル化を定義するソフトウェアがあります。チェックアウト: http://healpix.jpl.nasa.gov/ また、Fortran、C、C++、Python、mathlabなどでいくつかの便利な計算を行うためのいくつかのルーチンを提供しています...

2
Dante Paz