ホームページ  >  に質問  >  本文

java - 求算法. 在球面上取随机N个均匀的点(或者间距不小于某距离的点)

希望能在球上获得均匀分布, 或者 每两个点之间的间距不小于某个值的N个点的坐标.
点的数量不需要太大, 在100到200之间就够用了.
球的中心点就是坐标系原点.

有看到另外一个大牛写的.
https://www.oschina.net/code/...
但是传入100个点的时候, 相邻很近的点出现几率非常大. 导致在球面上的点上放东西的时候, 就叠在一起了.

求教, 有没有什么其他算法能实现.

巴扎黑巴扎黑2741日前868

全員に返信(2)返信します

  • 阿神

    阿神2017-04-18 10:27:35

    正規分布確率変数を使用して 3 次元ベクトルを生成し、それを単位化するだけで、球上で均一なサンプリングを実現することは難しくありません。

    リーリー

    ただし、隣接する点間の要件を満たしているかどうかはわかりません。隣接するポイントが遠く離れていることを確認したい場合は、ジッタリングや層化サンプリングなどのアイデアから学ぶことができます。

    Javaバージョン

    リーリー

    さらに、保存されたsphere.txtをCloudCompareで開いて点群を表示できます。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:27:35

    質問者は球上の点間の距離をできるだけ大きくすることを意味していますが、一様ランダム分布では任意に小さい距離の2点が出現しないとは保証できませんので、この質問は球上のランダム分布とは何の関係もありません(タイトルは騙されすぎます)。

    球の一様かつランダムな分布となると長い言葉になります。以前に @lianera によって与えられた魔法のアルゴリズムに困惑しています。なぜ正規分布を使用するのでしょうか?その後、単位化からヒントを垣間見ることができました。単位化とは、実際には体積分布を球体に投影したものです。正規分布は球対称であるため、球面に投影すると均一になる必要があります。言い換えれば、本当に重要なのは分布の球対称性であり、具体的な形状は重要ではありません。 たとえば、円内の領域が一様に分布して投影される場合、円上の一様分布を取得できます。

    球状コード

    ネットで調べてみると、この問題にはかなりの起源があることが分かりました。それは Tamme の問題と呼ばれ、その問題の解決策は「球状コード」と呼ばれています。以下にいくつかの計算結果を示します。同時に、点が多い場合、最適解を見つけて証明するのは非常に難しいこともわかっています。

    したがって、質問者は次善の解決策を見つけるだけで済みます。

    質問者が与えたリンクは、実際には平均的なスタッキング戦略に基づいています。つまり、球を緯度の線で均等に複数の円に分割し、各円を等しい角度に分割しますが、高緯度では円の上の点が少なくなり、低緯度。

    最も貴重な質問

    より良い結果を得るには、さまざまな最適化ツールキットを使用して球点間の最小距離の最大値を見つけることができます。目的関数を球点間の最小距離の形で直接記述すると、関数の安定性が悪く、最適解を見つけることが困難になります。ここで、目的関数はすべての点間隔の二乗の逆和として取得され、最小値が求められます。

    $$text{最小化:} クワッド sum_{ilt{}j}frac{1}{d^2(i,j)}$$

    これにより、隣接するポイント間の距離が強調表示されるだけでなく、関数が比較的スムーズに保たれます。

    Mathematica

    が提供する

    関数を使用します。点が多いと計算に時間がかかります。たとえば、私のマシンで 160 点を計算するには 4 時間かかります。結果の描画:

    NMinimize

    返事
    0
  • キャンセル返事