C# 在给定三维中心坐标的情况下随机生成聚集点

C# 在给定三维中心坐标的情况下随机生成聚集点,c#,random,3d,C#,Random,3d,我希望能够在3D空间中生成一组点,这些点将从起点(在本例中为0,0,0)创建指定球体半径(在本例中为4)内的大多数点。我也希望它能偶尔生成异常值 这与此类似: 但我希望能够调整一些设置。我将在C#中生成这个,我熟悉Random类,并且对球体有一些了解。我不知道怎样才能把它拼凑起来 我有一个可以在球体中生成一个点,但我希望它围绕中心点聚集: // elsewhere in code private static readonly Random Random = new Random(); pr

我希望能够在3D空间中生成一组点,这些点将从起点(在本例中为0,0,0)创建指定球体半径(在本例中为4)内的大多数点。我也希望它能偶尔生成异常值

这与此类似:

但我希望能够调整一些设置。我将在C#中生成这个,我熟悉Random类,并且对球体有一些了解。我不知道怎样才能把它拼凑起来

我有一个可以在球体中生成一个点,但我希望它围绕中心点聚集:

// 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));

我认为在球坐标系中生成随机点并将其转换为笛卡尔坐标系是最容易的

您可以根据选择的分布生成半径。从均匀分布得到两个角度;一个从-pi到pi,另一个从0到pi

您可以查看球面坐标系。马丁是对的,你需要

  • 从0到r的随机数,设为r
  • 从0到pi的随机数,设为θ
  • 从0到2*pi的随机数,设置为φ
然后,要将它们转换为笛卡尔坐标系,必须执行以下操作

  • x=r sin(θ)cos(φ)
  • y=r sin(θ)sin(φ)
  • x=r cos(θ)
您现在所做的将生成一个立方体形状的点云


如果您需要有关代码的进一步帮助,请告诉。

好的,让我们从分发开始,这显然只取决于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^2sin(θ)
来自雅可比矩阵 它可以很容易地分解为

P(r)     = f(r) r^2 dr
P(theta) = sin(theta) dtheta
P(phi)   = dphi
好的,只有φ是均匀分布的

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)

我觉得我已经接近我当前的代码了,我想我只是缺少了一些让它集群的概念。如果你觉得你快到了,你可以简单地将你想要的坐标作为你的中心添加到你生成的x,y,z坐标中。这是错误的。从0到\pi统一生成
theta
是行不通的为什么?你有什么建议?请看我的答案。你关于θ采样的建议是错误的,它在角度上是不均匀的。我明白了,你的答案是基于分布的均匀性,而我所要做的只是向他指出,他正在创建一个立方形,从中他排除了不在球体内的点。