在3D坐标中找到球体中的每个点

时间:2019-11-18 18:26:44

标签: numpy numpy-ndarray

我正在尝试解决此算法。 给定一个半径和一个点。 在3d坐标系中找到以给定点为中心的半径范围内的每个点,并将它们存储在列表中。

1 个答案:

答案 0 :(得分:0)

您可以在下面用numpy做到这一点。

请注意,此处的代码将为您提供相对于以所选点为中心,半径选定的球体的坐标。您需要确保设置下面的“ dim”输入尺寸,以便首先将球体完全包含在该体积中。它也仅适用于肯定指标。如果您的点有任何负坐标,请使用正坐标,然后在输出中翻转该轴的符号以自己坐标。

import numpy as np

dim = 15

# get 3 arrays representing indicies along each axis
xx, yy, zz = np.ogrid[:dim, :dim, :dim]

# set you center point and radius you want
center = [7, 7, 7]
radius = 3

# create 3d array with values that are the distance from the
# center squared
d2 = (xx-center[0])**2 + (yy-center[1])**2 + (zz-center[2])**2

# create a logical true/false array based on whether the values in d2
# above are less than radius squared
#
# so this is what you want - all the values within "radius" of the center
# are now set to True
mask = d2 <= radius**2

# calculate distance squared and compare to radius squared to avoid having to use
# slow sqrt()

# now you want to get the indicies from the mask array where the value of the
# array is True.  numpy.nonzero does that, and gives you 3 numpy 1d arrays of
# indicies along each axis
s, t, u = np.nonzero(mask)

# finally, to get what you want, which is all those indicies in a list, zip them together:
coords = list(zip(s, t, u))

print(coords)
>>>
[(2, 5, 6),
 (3, 4, 5),
 (3, 4, 6),
 (3, 4, 7),
 (3, 5, 5),
 (3, 5, 6),
 (3, 5, 7),
 (3, 6, 5),
 (3, 6, 6),
 (3, 6, 7),
 (4, 3, 6),
 (4, 4, 5),
 (4, 4, 6),
 (4, 4, 7),
 (4, 5, 4),
 (4, 5, 5),
 (4, 5, 6),
 (4, 5, 7),
 (4, 5, 8),
 (4, 6, 5),
 (4, 6, 6),
 (4, 6, 7),
 (4, 7, 6),
 (5, 4, 5),
 (5, 4, 6),
 (5, 4, 7),
 (5, 5, 5),
 (5, 5, 6),
 (5, 5, 7),
 (5, 6, 5),
 (5, 6, 6),
 (5, 6, 7),
 (6, 5, 6)]