avp*_*avp 9 random 3d montecarlo
我需要为我的宠物射线追踪器生成随机值的算法进行澄清.
我从一个点发射光线.我有这些光线分布的问题:我需要分布均匀,但它不是......
我现在面临的问题是,在我对结果空间的扭曲之后,最初的均匀分布是不均匀的.
因此,例如,如果极坐标系我生成r和t角.分布不均匀且不均匀:靠近每个极点的空间比靠近赤道的结果密度大得多.原因很清楚:我将均匀分布的点从圆柱空间转换为球形.而且我扭曲了结果.同样的问题是如果我规范化立方体中随机生成的点.
我现在的想法是这样的:我想创建一个四面体,对其顶点进行标准化,将每个面(三角形)与中间的点分开,对其进行标准化并递归重复,直到我有足够的点.然后我稍微"扭曲"这些点.然后我再次将它们标准化.而已.
据我所知,这种方法本身并不是纯粹的数学蒙特卡罗方法,因为除了最后一步之外,我不会在任何步骤中使用随机分布.我不喜欢这种复杂性的解决方案.
任何人都可以建议更简单但仍然
谢谢!
编辑:
我需要一个快速的方法,而不仅仅是正确的方法.这就是我问蒙特卡罗的原因.提供的答案是正确的,但不是很快.四面体的方法很快,但不是很"随机"=>不正确.
我真的需要一些更合适的东西.
这是我过去使用的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};
}
Run Code Online (Sandbox Code Playgroud)