我有多个存储在二维numpy数组中的点云文件中的数百万个xyz坐标:[[x1, y1, z1], [x2, y2, z2],..., [xn, yn, zn]]。
我想过滤由4个坐标([[x1, y1], [x2, y2]]即矩形的左下角和右上角坐标)描述的特定边界框内的所有点。
我已经找到了以下代码来用numpy过滤坐标,这几乎是我想要的。唯一的区别是(如果我做对了)我的二维数组也具有z坐标。
import random
import numpy as np
points = [(random.random(), random.random()) for i in range(100)]
bx1, bx2 = sorted([random.random(), random.random()])
by1, by2 = sorted([random.random(), random.random()])
pts = np.array(points)
ll = np.array([bx1, by1]) # lower-left
ur = np.array([bx2, by2]) # upper-right
inidx = np.all(np.logical_and(ll <= pts, pts <= ur), axis=1)
inbox = pts[inidx]
outbox = pts[np.logical_not(inidx)]
Run Code Online (Sandbox Code Playgroud)
我如何修改上面的代码以使其与xyz坐标一起工作,并通过由两个xy坐标描述的边界框进行过滤?
给定三个坐标(每个坐标都有 x、y 和 z 值),如何使用 numpy 和/或 scipy 来计算结果平面的倾斜度(或倾角)?
a = np.array([32.49, -39.96,-3.86])
b = np.array([31.39, -39.28, -4.66])
c = np.array([31.14, -38.09,-4.49])
Run Code Online (Sandbox Code Playgroud)
我想使用此计算来过滤屋顶段的 LiDAR 点云数据集。所以屋顶的角度在 30 到 60 度之间。
我知道我必须旋转由三个坐标定义的平面才能计算所需的角度,但我不知道如何使用 numpy/scipy 来实现这一点。我可能需要的是这样的轮换:
更新:
Paul Panzers 的答案使得计算每个轴的平面角度成为可能。但是我如何才能旋转平面,以便获得多个三重点集在一个轴上可比较的角度呢?我的主要目标:我想使用两个最近的邻居点构建每个屋顶点的三角形并计算这些角度。例如,如果 50% 的角度在 30 度到 60 度之间,则屋顶将被归类为山墙。