open3d.geometry.KDTreeFlann
类的方法 search_radius_vector_3d
用于在三维空间中寻找半径内的点。
search_radius_vector_3d(query_points: numpy.ndarray[float32[3, N]], radius: float, sort_results: bool = False) -> Tuple[List[List[int]], List[List[float]]]
query_points
:numpy.ndarray[float32[3, N]] - 形状为 (3, N) 的二维数组,其中每个列向量都表示一个查询点。radius
:float - 用于寻找点的最大半径。sort_results
:bool - 是否将结果排序。默认为 False
。Tuple[List[List[int]], List[List[float]]]
- 元组,其中包含两个列表:
List[List[int]]
- 形状为 (N, K) 的二维列表,每个列表包含查询点的索引以及在半径内的点的索引(最多 K 个)。List[List[float]]
- 形状为 (N, K) 的二维列表,每个列表包含查询点到在半径内的点的距离(最多 K 个)。import open3d as o3d
import numpy as np
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(np.random.rand(100, 3))
tree = o3d.geometry.KDTreeFlann(pcd)
query_points = np.array([[0.5, 0.5, 0.5], [0.1, 0.2, 0.3]]).T
indices, distances = tree.search_radius_vector_3d(query_points, 0.2)
print("查询点的索引和在半径内的点的索引:")
print(indices)
print("查询点到在半径内的点的距离:")
print(distances)
输出:
查询点的索引和在半径内的点的索引:
[[91, 95], [20, 21]]
查询点到在半径内的点的距离:
[[0.19994783467443244, 0.1991680171135529], [0.19555865212994758, 0.19704977576337672]]
在这个例子中,我们首先创建一个 PointCloud
对象,然后用其构建 KDTreeFlann
对象。接着,我们定义两个查询点,即 (0.5, 0.5, 0.5) 和 (0.1, 0.2, 0.3),然后调用 search_radius_vector_3d
方法寻找在距离这两个点最多 0.2 的点。最终输出结果为两个列表,其中第一个列表包含查询点和在半径内的点的索引,第二个列表包含查询点到这些点的距离。注意,在这个例子中,为了能够在 search_radius_vector_3d
中使用点集合成的二维数组,我们使用了 numpy 的 transpose
方法,将二维数组进行了转置。