如何使用Python从三维椭球体生成点的随机样本?

如何使用Python从三维椭球体生成点的随机样本?,python,math,random,geometry,ellipse,Python,Math,Random,Geometry,Ellipse,我试图从一个三维椭球体上均匀地采集大约1000个点。是否有某种方法来编码,这样我们就可以从椭球体的方程开始得到点 我想要椭球面上的点。考虑使用蒙特卡罗模拟:生成一个随机的3D点;检查该点是否在椭球体内部;如果是,就留着吧。重复,直到你得到1000分 另外,由于OP改变了他们的问题,这个答案不再有效。J.F.Williamson,“曲面上分布点的随机选择”,《医学与生物学物理学》32(10),1987,描述了在参数曲面上选择均匀随机点的一般方法。它是一种接受/拒绝方法,根据每个候选点的拉伸系数(梯

我试图从一个三维椭球体上均匀地采集大约1000个点。是否有某种方法来编码,这样我们就可以从椭球体的方程开始得到点


我想要椭球面上的点。

考虑使用蒙特卡罗模拟:生成一个随机的3D点;检查该点是否在椭球体内部;如果是,就留着吧。重复,直到你得到1000分

另外,由于OP改变了他们的问题,这个答案不再有效。

J.F.Williamson,“曲面上分布点的随机选择”,《医学与生物学物理学》32(10),1987,描述了在参数曲面上选择均匀随机点的一般方法。它是一种接受/拒绝方法,根据每个候选点的拉伸系数(梯度范数)接受或拒绝每个候选点。要对参数化曲面使用此方法,必须了解曲面的以下几点:-

  • x(u,v)
    y(u,v)
    z(u,v)
    ,它们是从二维坐标
    u
    v
    生成三维坐标的函数

  • u
    v
    的范围

  • g(点)
    ,曲面上每个点的梯度范数(“拉伸因子”),以及

  • gmax
    ,整个表面的最大值
    g

然后,算法是:

  • 在曲面上生成点,
    xyz
  • 如果
    g(xyz)>=RNDU01()*gmax
    ,其中
    RNDU01()
    是[0,1]中的统一随机数,则接受该点。否则,重复此过程

Chen和Glotzer(2007)在“拉长病毒衣壳形成唯象模型的模拟研究”中,将该方法应用于长椭球(一种椭球形式)的表面,arXiv:cond mat/0701125[cond mat.soft].

这是一个通用函数,用于在球体、球体或任何具有a、b和c参数的三轴椭球体的表面上拾取一个随机点。请注意,直接生成角度不会提供均匀分布,并会导致沿z方向的点过多。相反,phi是作为随机生成的c的倒数获得的os(phi)


此函数是从这篇文章中采用的:

相关:请澄清您希望点位于椭球内部还是椭球表面上。内部可能很容易,但在表面上要困难得多。假设内部,这本质上是一个复制。这是关于在球体内部采样,但任何椭球都只是图像在仿射变换下球体的e,并且该仿射变换将保持均匀性。同意@RoryDaulton的观点,即在曲面上均匀采样是一个非常困难的问题。请澄清您的需求!另外,请您给出一个示例,说明“椭球方程”的含义对于这个特殊的问题?通常有许多不同的方法来指定椭球体。所谓“椭球体方程”,您的意思是
Ax²+Bxy+Cy²+Dx+Ey+F=0
    import numpy as np
    def random_point_ellipsoid(a,b,c):
        u = np.random.rand()
        v = np.random.rand()
        theta = u * 2.0 * np.pi
        phi = np.arccos(2.0 * v - 1.0)
        sinTheta = np.sin(theta);
        cosTheta = np.cos(theta);
        sinPhi = np.sin(phi);
        cosPhi = np.cos(phi);
        rx = a * sinPhi * cosTheta;
        ry = b * sinPhi * sinTheta;
        rz = c * cosPhi;
        return rx, ry, rz