如何在python中获得由三个坐标定义的平面的倾斜角度?
给定三个坐标(每个坐标都有x、y和z值),如何使用numpy和/或scipy计算生成平面的倾斜(或倾斜)如何在python中获得由三个坐标定义的平面的倾斜角度?,python,numpy,scipy,coordinates,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]) 我想使用此计算过滤屋顶段的激光雷达点云数据集。所以屋顶的角度在30到60度之间 我知道我必须旋转由三个坐标定义的平面来计算所需的角度,但我不知道如何使用numpy/sci
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])
我想使用此计算过滤屋顶段的激光雷达点云数据集。所以屋顶的角度在30到60度之间
我知道我必须旋转由三个坐标定义的平面来计算所需的角度,但我不知道如何使用numpy/scipy实现这一点。
我可能需要这样的旋转:
更新:
Paul Panzers的回答使计算平面与每个轴的角度成为可能。但是我怎样才能旋转平面,使多个三元组点集在一个轴上得到可比的角度呢?我的主要目标是:使用两个最近邻点为每个屋顶点构建三角形,并计算这些角度。例如,如果30到60度之间有50%的夹角,屋顶将被归类为山墙。以三个向量的两个差的叉积为例
n = np.cross(b-a, c-a)
这将为你的平面提供一个法向量。其与任何坐标平面的角度与平面与同一坐标平面的角度之和将为pi/2
要计算法向量和坐标平面之间的角度,只需归一化并取相应分量的弧sin
nn = n / np.linalg.norm(n)
angles = np.abs(np.arcsin(nn))
通常,您需要确定轴/角度约定,通常使用几种 提取OP措辞中的“倾斜角度”对我来说意味着找到相对于地平线或(局部)Z(向上正)的角度 但我不懂装甲车的ans 正常情况下的叉积很好 将叉积标准化也很好 然而,下一步 标准化叉积向量的
nn
分量是具有各自单位基向量的点积
使用(标准化输入向量)点积查找“夹角”涉及arccos(),返回最小角度需要考虑叉积输入向量的顺序,可能给出法线的有符号方向(向上/向外vs向下/向内)
我从positiveZ获得(假设向上/向外指向)方位角的angleZ=np.arccos(abs(nn[2])
,这是一种常见的球面坐标系约定,可能仍然需要进一步转换为OP需要的任何全局或局部坐标系,最简单的例子是使用补码np.pi-angleZ
来获得屋顶相对于水平面的“倾斜”
需要第二个角度来描述屋顶平面片的方向-相对于lat或lon、北、东的角度-我认为您需要再次检测并纠正
nn
可能的符号模糊性,并使用acrctan2()
对于全符号角度您需要更具体地说明:相对于哪个尺寸的倾斜角度?在任何情况下,都可以计算平面的法向量,然后将其投影到所需尺寸的基向量上,以确定角度。投影是通过。也许,你可以试着计算倾斜前和倾斜后法线之间的角度?你认为“中性”是什么样的旋转?围绕z轴的那些?不清楚你指的是哪个角度。你指的是屋顶瓷砖本身的角度吗?这是个好问题。我想我指的是相对于x轴或z轴的角度。通常屋顶的角度与地平面有关。我只想做一些事情,让我可以比较不同方向的不同屋顶。在经过一些睡眠之后,我认为这不足以解决我找到一个可比较的倾斜角度的问题。据我所知,这给了我平面与每个轴形成的角度。更新了我的问题。