2009-12-03 153 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实现。

更多细节在这些文章: