如何获得由python中三个坐标定义的平面的倾斜角度?

时间:2017-03-19 23:03:56

标签: python numpy scipy coordinates

给定三个坐标(每个坐标都有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])

我想使用此计算来过滤屋顶段的LiDAR点云数据集。所以屋顶的角度在30到60度之间。

我知道我必须旋转由三个坐标定义的平面来计算所需的角度,但我不知道如何用numpy / scipy实现这一点。 我可能需要的是像这样的轮换:

enter image description here enter image description here

更新:

Paul Panzers的答案使得可以计算每个轴的平面角度。但是我如何能够旋转平面以便在一个轴上获得多个三重点集的角度?我的主要目标:我想使用两个最近的相邻点构建每个屋顶点的三角形并计算这些角度。如果在30到60度之间有50%的角度,那么屋顶就会被分类为山墙。

2 个答案:

答案 0 :(得分:2)

取三个向量的两个差异的叉积,例如

n = np.cross(b-a, c-a)

这将为您提供飞机的法线向量。它与任何坐标平面的角度将与平面与相同坐标平面的角度相加为pi / 2。

要计算法向量和坐标平面之间的角度,只需归一化并取相应分量的弧度

nn = n / np.linalg.norm(n)
angles = np.abs(np.arcsin(nn))

答案 1 :(得分:0)

一般来说,你需要决定一个Axes / Angle约定,有几个是常用的https://en.wikipedia.org/wiki/Axes_conventions

在OP的措辞中提取“倾斜角度”意味着我找到相对于地平线或(局部) Z (向上正)的角度

但我不明白Panzer的ans

正常的交叉产品很好

将十字产品标准化,也很好

然而,下一步......

nn的分量,归一化的叉积矢量是具有各自单位基矢量的点积

在(标准化输入向量)之间找到“角度”点产品涉及 arccos(),返回最小角度需要允许交叉产品输入向量的排序可能给出(向上/向前/向下/向内)签署正常的方向

我得到angleZ = np.arccos(abs(nn[2]))(假定向上/向外指向)方位角相对于正位置 Z - 一种常见的球面坐标系统惯例,可能仍需要进一步转换为全局或OP需要的局部坐标系,最简单的例子是采用补np.pi - angleZ来获得相对于水平面的“倾斜”

需要第二个角来描述屋顶平面贴片的方向 - 相对于纬度或经度,北,东的角度 - 我认为你需要检测并纠正{{1}的可能符号模糊度并使用nn作为完整的签名角度