我希望能够在3D空间中生成一组点,这些点将从起点(在本例中为0,0)创建指定球体半径(在本例中为4)内的大多数点,0)。我也希望它能产生偶尔的异常值。
这与此类似:
但我希望能够调整一些设置。我将在C#中生成这个,并且我熟悉Random类,并且熟悉spheres。我不知道如何把它拼凑起来。
我有这个可以在球体中生成一个点,但我希望它围绕该中心点聚集:
// elsewhere in code
private static readonly Random Random = new Random();
private static double NextDouble(double minValue, double maxValue)
{
double next = Random.NextDouble();
return minValue + (next * (maxValue - minValue));
}
// generates random points in sphere
const int r = 6;
double x;
double y;
double z;
do
{
x = NextDouble(-r, 1 + r);
y = NextDouble(-r, 1 + r);
z = NextDouble(-r, 1 + r);
} while (Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2) > Math.Pow(r, 2));
答案 0 :(得分:1)
我认为在球坐标中生成随机点并将它们转换为笛卡尔坐标是最简单的。
您可以根据您选择的分布生成半径。从均匀分布中获得两个角度;一个从-pi到pi,另一个从0到pi。
答案 1 :(得分:1)
您可以查看关于球面坐标系的this article。马丁是对的,你需要
然后将它们转换为笛卡尔坐标系,您必须执行以下操作
你现在正在做的事情将导致一个立方体形状的点云。
如果您需要有关代码的进一步帮助,请告诉我们。
答案 2 :(得分:0)
好的,让我们从分发开始,这显然只取决于r 所以概率密度函数将是
PDF(x, y, z) = f(x, y, z) dx dy dz
我们知道f(x,y,z)仅取决于r=sqrt(x^2+y^2+z^2)
让我们移动到球坐标
PDF(r,theta,phi) = f(r) r^2 sin(theta) dr dtheta dphi
r^2 sin(theta)
来自雅各比派
它可以很容易地分解为
P(r) = f(r) r^2 dr
P(theta) = sin(theta) dtheta
P(phi) = dphi
好的,只有phi
分布均匀,所以
phi = 2*pi*random()
theta
它是统一的cos(theta)
,所以
cos(theta) = 2*random()-1
对于r
,您必须知道f(r)
是什么,但分发会受到r^2
字词的影响
P(r) = f(r) r^2 dr
我可能会建议将高斯用于f(r)
,但您可能需要另一种选择。当然还有
sin(theta) = sqrt(1-cos(theta)^2)
x = r * sin(theta) * cos(phi)
y = r * sin(theta) * sin(phi)
z = r * cos(theta)