10

ペットのレイトレーサーのランダムな値を生成するアルゴリズムを使用して説明する必要があります。
一点から光線を放射します。そして、私はこれらの光線の分布に問題があります。分布を均一にする必要がありますが、そうではありません...

私が今直面している問題は、結果の空間を歪めた後、最初は均一である分布が均一ではないということです。

したがって、たとえば、極座標系の場合、r角度とt角度を生成します。分布は均一ではなく、均一にすることもできません。各極に近い空間は、たとえば赤道に近い空間よりもはるかに密度の高い結果になります。その理由はかなり明白です。私は均一に分布した点を円筒形の空間から球形に変換します。そして、私は結果を歪めます。同じ問題は、立方体でランダムに生成されたポイントを正規化する場合です。

今の私の考えはこれです:四面体を作成し、その頂点を正規化し、各面(三角形)を中央の点で分割し、正規化し、十分な点が得られるまで再帰的に繰り返します。次に、これらのポイントを少し「歪め」ます。次に、それらを再度正規化します。それでおしまい。

私は、最後のステップを除いてどのステップでもランダム分布を使用しないため、この方法自体が純粋数学のモンテカルロ法ではないことを理解しています。そして、私はこの複雑さのためにこのソリューションが好きではありません。

誰もがもっとシンプルでありながらまだ何かを提案できますか

  • ランダム
  • ユニフォーム
  • 速い
  • 単純

ありがとう!

編集:
正しい方法だけでなく、高速な方法が必要です。だから私はモンテカルロについて尋ねています。提供された回答は正しいですが、速くはありません。四面体を使用する方法は高速ですが、それほど「ランダム」ではありません=>正しくありません。
もっと適切なものが本当に必要です。

4

5 に答える 5

10

これは、単位球上にランダムに分布するポイントを生成できるアルゴリズムです。

于 2009-12-03T16:29:57.670 に答える
5

これが私が過去に使用したJava実装です:

public static double[] randomPointOnSphere(Random rnd)
{
    double x, y, z, d2;
    do {
        x = rnd.nextGaussian();
        y = rnd.nextGaussian();
        z = rnd.nextGaussian();
        d2 = x*x + y*y + z*z;
    } while (d2 <= Double.MIN_NORMAL);
    double s = Math.sqrt(1.0 / d2);
    return new double[] {x*s, y*s, z*s};
}
于 2011-01-24T16:33:34.580 に答える
4

本当にランダムな分布または球全体の均一な分布が必要ですか?

次に、ZCW角度を提案します。これは、球全体に均等に分散されており、計算が高速です。他の方法は、TheSydneyOperaHouse(SOPHE)とRepulsionです。(repulsion.cを検索します)反発法は非常に優れていますが、時間がかかります。球全体に点を均等に反復的に分散します。幸いなことに、それは一度だけ行う必要があります。

これは結晶学とNMRで使用されます。これは、粉末パターンの場合、ランダム分布よりも均一分布を使用する方が高速であるためです(必要なポイントが少なくて済みます)。

これがZCWのPython実装です。

これらの論文の詳細:

于 2011-10-31T10:04:11.267 に答える
2

球形のセクションの場合は、phi(極角)とcos(theta)(シータの場合は方位角)の範囲内で均一に角度を生成します。

擬似コードの場合:

phi = phi_low_limit        + rand()*(phi_high_limit       - phi_low_limit)
ct = cos(theta_high_limit) + rand()*(cos(theta_low_limit) - cos(theta_high_limit))
// The order is inverted here because cos heads down for increasing theta
theta = arccos(ct)

これは、 Jacobianを反転し、それらの座標のその空間で均一に生成するというルールの特殊なケースです。

注:DavidNormanラインのphiとthetaには反対の規則を使用していることに注意してください。

注:これは実際には最速の方法ではなく、一般的な原則を説明する方法です。

于 2009-12-03T17:33:00.407 に答える
2

些細なシーンのみをレイトレーシングしない限り、レンダリング時間は実際にサンプルピッキング時間によって支配されますか?そうでない場合は、おそらくまだ最適化する価値はありませんが、他の回答に示されている均一なサンプリング手法を読んで理解する価値はあります。

また、サンプリングしている関数の適切な推定値を生成するために、サンプルが非常にランダムである必要はありません。ハルトン列などの準ランダムな数列を使用して調査することをお勧めします。あなたの四面体細分割のアイデアは悪くありません。状況によっては恐ろしいアーティファクトが発生する可能性がありますが、ほとんどのシーンで均一な疑似ランダムサンプルよりも優れた、適切に分散されたポイントが得られるはずです。

とにかく本当にあなたはompf.orgのフォーラムを参照する必要があります。あそこにいくつかの超ハードコアレイトレーシングオタクを手に入れました。

于 2009-12-05T08:52:36.533 に答える