2009-12-03 152 views
8

我需要澄清一下算法,爲我的寵物射線跟蹤儀生成隨機值。
我從一個點發射射線。我有這些射線分佈的問題:我需要的分佈是統一的,但它不是...單位球體上的統一隨機(蒙特卡洛)分佈

我現在面臨的問題是,最初統一的分佈是不統一後,我的扭曲結果的空間。

因此,例如,如果極座標系統生成r和t角度。分佈不均勻,並且不均勻:靠近每個極點的空間比靠近赤道的結果密度要大得多。原因很明顯:我將均勻分佈的點從圓柱空間轉換爲球形空間。我扭曲了結果。同樣的問題是,如果我規範化多維數據集中隨機生成的點。

我的想法現在是這樣的:我想創建一個四面體,規範其頂點,用中間的點分割每個面(三角形),歸一化它並遞歸地重複,直到我有足夠的點。然後我「扭曲」這些點。然後我再次正常化它們。而已。

我知道這種方法不是純粹的數學蒙特卡洛方法本身,因爲除了最後一個步驟外,我沒有在任何步驟中使用隨機分佈。我不喜歡這種複雜性的解決方案。

任何人都可以提出什麼更簡單,但仍

  • 隨機
  • 均勻
  • 快速
  • 簡單

謝謝!

編輯:
我需要一個快速的方法,而不是正確的。這就是爲什麼我要問蒙特卡洛。提供的答案是正確的,但不是很快。四面體的方法很快,但不是很「隨機」=>不正確。
我真的需要更適合的東西。

回答

9

Here's的算法,使您可以生成隨機分佈在單位球面上的點。

0

對於球面部分,在極限之間的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並在那些座標是空間均勻地產生規則的特例。

注意:請注意,我使用的是來自David Norman line的phi和theta的相反約定。

另請注意:這實際上並不是最快的方法,而是一個說明總體原則的方法。

1

除非你是光線跟蹤只有微不足道的場景,你的渲染時間是否真的被採樣時間控制?如果不是,那麼可能不值得優化,但值得閱讀和理解其他答案中給出的統一抽樣技術。另外,您的樣本不需要非常隨機,可以很好地估計您要採樣的任何功能。您可能需要使用quasirandom編號序列進行調查,如Halton sequence。你的四面體細分思想並不差。對於大多數場景來說,它應該導致分佈良好的點應該比統一的僞隨機樣本更好,但在某些情況下可能會導致可怕的僞像。

無論如何,你真的應該參考ompf.org上的論壇。那邊有一些超級硬核射線追蹤的書呆子。

+0

嘿,真的很好鏈接! – avp 2009-12-07 13:08:58

+0

我的意思是,ompf.org =) – avp 2009-12-07 13:09:31

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}; 
} 
+0

@DouglasZare如果'd2 finnw 2014-07-25 17:36:46

+0

糟糕,我的錯誤。 – 2014-07-25 18:36:52

3

你真的需要隨機分佈或者甚至超過球體分佈?

然後我會建議ZCW角度,這些角度均勻地分佈在整個球體上並且快速計算。其他方法是TheSydneyOperaHouse(SOPHE)和Repulsion。 (搜索repulsion.c) 排斥方法相當不錯,但速度很慢:它在一個球體上均勻迭代地分佈點。幸運的是,它只能做一次。

這是用於晶體學和核磁共振,因爲對於粉末模式,使用均勻分佈與隨機分佈(您需要更少的點)更快。

Here是ZCW的Python實現。

更多細節在這些文章: