根据给定的半径,在特定给定点周围生成一个球内的点(非0,0,0) - Python

2024-04-20 10:03:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,可以在一个特定半径的球体内创建一个均匀的随机点:

radius = 5
r = radius * ( numpy.random.random()**(1./3.) )  
phi = numpy.random.uniform(0,2*numpy.pi) 
costheta = numpy.random.uniform(-1,1) 
theta = numpy.arccos(costheta) 
x = numpy.sin(theta) * numpy.cos(phi) 
y = numpy.sin(theta) * numpy.sin(phi)
z = numpy.cos(theta)
point = numpy.array([x, y, z]) * r`

但是,我想弄清楚如何使生成的点位于空间中某个特定点周围的球体内,而不是在当前的0,0,0附近生成。我一点也不懂数学,所以我不知道该怎么做。 关于如何在一个特定半径的球体(即Generate a random point within a circle (uniformly))中生成一个随机点的例子有很多,但是我在python中没有看到任何关于如何在用户指定点周围的半径内生成随机点的例子(或者我只是误解了使用的数学…)。在

有一个问题在这里得到了询问/回答(generate a random cluster of points around a given point python),但这并没有真正的帮助,还有一些类似的问题,但它们都是用Java或C(即Randomly generate clustered points given a center coordinate in 3D)编写的。在

我放了一张简单的图画,上面画了我现在的(左边)和我正在做的事情(右边)。differentOrigin

任何帮助或例子将不胜感激!!在


Tags: numpy半径数学randomuniformsincosgenerate
1条回答
网友
1楼 · 发布于 2024-04-20 10:03:03

你真的想得太多了。用2D演示更简单,逻辑是一样的:

enter image description here

在上图中,我们有一个以(0,0)为中心的圆,一个位于(0,1)的点。在

现在,让我们将圆置于(1,1)的中心,并将该点移动到相同的相对位置:

enter image description here

圆的新中心是(1,1),点现在位于(1,2)。要实现这种转变,您需要做的就是:

1 + 0 = 1      # new_center_x + point_x
1 + 1 = 2      # new_center_y + point_y

就这么简单!在

现在,numpy内置了使这一点更简单的功能,因为您可以简单地添加numpy数组。因此,如果你有了新的中心和初始点,你可以这样计算新的点:

^{pr2}$

这很容易转化为三维曲面:

enter image description here

这里有一个以(0,0,0)为中心的球体,一个点在(0,0,10)。我们可以使用相同的逻辑将这个圆移动到(5,5,5)的中心,同时点仍然处于相同的相对位置:

new_center = np.array([5, 5, 5])
original_point = np.array([0, 0, 10])
new_center + original_point
# array([ 5,  5, 15])

enter image description here

相关问题 更多 >