在特定半径的球体内生成一个点,该点围绕特定的给定点(而不是0,0,0)-Python

时间:2018-06-25 20:04:16

标签: python math geometry

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

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

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

1 个答案:

答案 0 :(得分:2)

您确实对此事有过多的思考。用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数组。因此,如果您有新的中心和初始点,则可以这样计算新点:

new_center = np.array([1, 1])
original_point = np.array([0, 1])
new_center + original_point
# array([1, 2])

这可以轻松转换为3D表面:

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