如何从向量计算正交平面

时间:2017-04-12 10:11:10

标签: linear-algebra glm-math

我在太空中有一个名为X1的位置。 X1的速度称为V1。我需要构造一个垂直于速度矢量的正交平面。飞机的起源是X1。

我需要将平面的两条边变成两个矢量,E1和E2。边缘连接在原点。所以三个向量形成一个轴。

我使用GLM库进行矢量数学。

2 个答案:

答案 0 :(得分:0)

通常,您可以使用四个数字在3D中定义平面,例如Ax + By + Cz = D.您可以将数字(A,B,C)的三倍视为垂直于平面伸出的向量(称为法向量)。

法向量n =(A,B,C)仅定义平面的方向,因此根据常数D的选择,您可以获得距离原点不同距离的平面。

如果我正确理解你的问题,你正在寻找的平面有法向量(A,B,C)= V1,使用点积得到常数D:D =(A,B,C )。 X1,即D = A X1.x + B X1.y + C * X1.z。

注意,您也可以使用平面n的几何方程获得相同的结果。 ((x,y,z) - p0)= 0,其中p0是平面上的某个点,在您的情况下是V1。 ((x,y,z) - X1)= 0。

答案 1 :(得分:0)

从向量创建框架的一种方法是使用Householder transformations。这可能看起来很复杂,但代码很短,至少与使用交叉产品一样有效,并且不易出现舍入错误。此外,完全相同的想法适用于任何数量的维度。

给出一个向量v的想法,找到一个将V映射到(1,0,0)的倍数的Householder变换,然后将其反转应用于(0,1,0)和(0, 0,1)获取其他帧向量。由于Householder转换是它自己的逆转,并且因为它们易于应用,所以得到的代码是相当有效的。下面是我使用的C代码:

static  void    make_frame( const double* v, double* f)
{
double  lv = hypot( hypot( v[0], v[1]), v[2]);  // length of v
double  s = v[0] > 0.0 ? -1.0 : 1.0;
double  h[3] = { v[0] - s*lv, v[1], v[2]};  // householder vector for Q
double  a = 1.0/(lv*(lv + fabs( v[0])));    // == 2/(h'*h)
double  b;
    // first frame vector is v normalised
    b = 1.0/lv;
    f[3*0+0] = b*v[0]; f[3*0+1] = b*v[1];   f[3*0+2] = b*v[2];

    // compute other frame vectors by applying Q to (0,1,0) and (0,0,1)
    b = -v[1]*a;
    f[3*1+0] = b*h[0]; f[3*1+1] = 1.0 + b*h[1]; f[3*1+2] = b*h[2];

    b = -v[2]*a;
    f[3*2+0] = h[0]*b; f[3*2+1] = b*h[1];       f[3*2+2] = 1.0 + b*h[2];
}