1. ホーム
  2. python

[解決済み] 球面上のn点の均等配置

2022-04-25 19:26:20

質問

N点(おそらく20点以下)に対して、球の周りの位置を漠然と与えてくれるアルゴリズムが必要です。完璧である必要はありませんが、束にならないようにする必要があります。

  • この質問 は良いコードを提供してくれましたが、これは100%ランダムに見えるので、これを均一にする方法は見つかりませんでした。
  • このブログの記事 では、球面上の点数を入力する方法が2つありましたが、そのうちの1つである SaffとKuijlaars アルゴリズムは、まさに私が書き写すことのできるpsuedocodeであり、そして コード例 私が見つけたのは、"node[k]"を含むもので、説明が見られず、その可能性を台無しにしました。2つ目のブログの例は、黄金律螺旋で、一定の半径を定義する明確な方法がなく、奇妙な、束縛された結果が得られました。
  • このアルゴリズム から この質問 しかし、そのページにあるものをpsuedocodeか何かに組み立てることはできません。

私が遭遇した他のいくつかの質問スレッドでは、ランダムな一様分布について話していましたが、これは私が懸念していないレベルの複雑さを追加するものです。このような愚かな質問で申し訳ありませんが、私は本当によく調べて、まだ不足していることを示したかったのです。

そこで、私が探しているのは、単位球の周りにN個の点を均等に分配する簡単な疑似コードで、球座標またはデカルト座標で返すものです。さらに、少しランダム化して分布させることができれば最高です(星の周りの惑星を考えてみてください、適度に分散していますが、余裕があります)。

解決方法は?

このサンプルコード node[k] はちょうどk番目のノードです。あなたは配列N点を生成しており node[k] はk番目(0からN-1まで)です。これだけで混乱するようなら、これで使えるようになるといいですね。

(言い換えれば k は,コードの断片が始まる前に定義され,点のリストを含むサイズNの配列である).

あるいは ここで他の答えを構築する(そしてPythonを使用する)。

> cat ll.py
from math import asin
nx = 4; ny = 5
for x in range(nx):
    lon = 360 * ((x+0.5) / nx)
    for y in range(ny):                                                         
        midpt = (y+0.5) / ny                                                    
        lat = 180 * asin(2*((y+0.5)/ny-0.5))                                    
        print lon,lat                                                           
> python2.7 ll.py                                                      
45.0 -166.91313924                                                              
45.0 -74.0730322921                                                             
45.0 0.0                                                                        
45.0 74.0730322921                                                              
45.0 166.91313924                                                               
135.0 -166.91313924                                                             
135.0 -74.0730322921                                                            
135.0 0.0                                                                       
135.0 74.0730322921                                                             
135.0 166.91313924                                                              
225.0 -166.91313924                                                             
225.0 -74.0730322921                                                            
225.0 0.0                                                                       
225.0 74.0730322921                                                             
225.0 166.91313924
315.0 -166.91313924
315.0 -74.0730322921
315.0 0.0
315.0 74.0730322921
315.0 166.91313924

これをプロットすると、極付近では垂直方向の間隔が大きくなり、各ポイントがほぼ同じ合計位置にあることがわかります。 面積 のスペース(極付近では水平方向のスペースが少ないので、垂直方向のスペースが多くなる)。

これは、すべての点が隣接する点との距離をほぼ同じにすることとは違いますが(リンク先が言っているのはこれだと思います)、あなたが望むものには十分かもしれませんし、単に緯度/経度を均一にするよりも改善されます。