我在3D空间中有一组数据点,显然都落在特定的平面上.我使用PCA来计算平面参数. PCA的第3个分量给出了平面的法向量(最弱的分量).
我接下来要做的是将所有点转换到所述平面上并在2D中查看它.
我的想法是做以下事情:
>找到飞机上的中心点(平均点)
>从所有数据点中提取它以将它们排列在原点周围
>旋转法线使其变为(0,-1)
>将此旋转应用于所有数据点
>使用正交投影(基本上,跳过z轴)
现在我坚持找到正确的旋转操作.我尝试使用acos或atan并设置两个旋转矩阵.似乎两种方法(使用acos,使用atan)给我错误的结果.也许你可以帮帮我吧!
Matlab代码如下:
@H_301_16@b = atan(n(1) / n(2)); rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1]; n2 = n * rotb; a = atan(n(1) / n(3)); rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)]; n3 = n2 * rotaows:我希望n2的y分量为零.然而,对于向量(-0.6367,0.77697,0.0467)已经失败了.
解决方法
如果你有一架飞机,你有一个法线向量和一个原点.我根本不会做任何“轮换”.你的答案只是一些矢量操作.
>让我们将你的飞机的法线向量称为新的z轴.
>您可以通过将旧的x轴与新的z轴(平面的法线)相交来生成新的y轴.
>通过将新z与新y交叉来生成新的x轴.
>将所有新轴向量转换为单位向量(长度为1).
>对于您拥有的每个点,创建一个从新原点到点的矢量(点的矢量减法 – plane_origin).只需点击新的x和新y单位向量,你就得到一对(x,y)你可以绘制!
如果您已经有交叉和点积函数,那么这只是几行代码.我知道它有效,因为我写的大多数3D电子游戏都是这样的.
技巧:
>注意向量指向的方向.如果他们指出错误的方式,则否定结果向量或更改叉积的顺序.>如果飞机的法线与原始x轴完全相同,则会遇到问题.