|
叉乘的集合意义是已知道N维空间中的N-1个基向,可以求出与这N-1个基向量正交的另一个基向量吧.
有的书上说叉乘只在3维上有定义,就是vec1和vec2相乘得:
(vec1.y * vec2.z - vec1.z * vec2.y,
vec1.z * vec2.x - vec1.x * vec2.z,
vec1.x * vec2.y - vec1.y * vec2.x )
其实(我觉得)如果是2维的话那就是一个向量,求它的垂直向量就是叉乘了.
4维向量的叉乘应该是3个向量相乘.按照某些网上的说法来说是这样定义的:
V1 x V2 x V3 =
¦i. j. k. l. ¦
¦x1 y1 z1 w1 ¦
¦x2 y2 z2 w2 ¦
¦x3 y3 z3 w3 ¦
其中i,j,k,l是4维空间中的4个基向量.
但我通过程序代码实现后发现测试不对.叉乘我是这么写的:
inline Vector4 Vector_Util::cross_product(const Vector4& vec1, const Vector4& vec2, const Vector4& vec3)
{
/*
V1 x V2 x V3 =
¦i. j. k. l. ¦
¦x1 y1 z1 w1 ¦
¦x2 y2 z2 w2 ¦
¦x3 y3 z3 w3 ¦
*/
Real a = vec1.x*vec2.y - vec1.y*vec2.x;
Real b = vec1.x*vec2.z - vec1.z*vec2.x;
Real c = vec1.x*vec2.w - vec1.w*vec2.x;
Real d = vec1.y*vec2.z - vec1.z*vec2.y;
Real e = vec1.y*vec2.w - vec1.w*vec2.y;
Real f = vec1.z*vec2.w - vec1.w*vec2.z;
return Vector4( f*vec3.y - e*vec3.z + d*vec3.w,
f*vec3.x + c*vec3.z - b*vec3.w,
e*vec3.x - c*vec3.y + a*vec3.w,
d*vec3.x + b*vec3.y - a*vec3.z);
}
测试是随便找了3个不共面的向量比如:
(1,2,3,4)(-4,-2,3,1)(10,-8,6,5)
应该叉乘得到的向量始终是和这3个向量垂直的,也就是说和它们分别做点乘应该都是得到0.但为什么算出来老是不对么?
(1,2,3,4)(-4,-2,3,1)(10,-8,6,5)这3个做叉集算出来是
72,-63,266,-36
这个,着实不知道怎么回事了
|
|