2017-04-12 106 views
0

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

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

我正在使用矢量数学的GLM库。

回答

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。

+0

我将此标记为答案,因为它是正确的,但不是我正在寻找的。显然有一个更快的方法来获得边缘。查找任何名为W的矢量不与V1对齐。那么V1 x W将给E1,V1 x E1将给E2。 – user6682440

0

从矢量创建帧的一种方式是使用Householder transformations。这可能看起来很复杂,但代码很短,至少与使用交叉产品一样高效,并且不易发生舍入错误。此外,完全相同的想法在任何维度上都有效。

这个想法是,给定一个向量v,找到一个Householder变换,将v映射到(1,0,0)的倍数,然后将这个变量的反应应用于(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]; 
}