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