叉积又称为叉乘,外积。
叉乘的大小为:
| u x v |= |u| |v| |sinθ|
因此,如果两个向量方向相同,其叉乘结果为0(因为正弦值为0)。
叉乘的方向根据右手法则而定,因此在三维坐标系下,三个坐标系向量i(1, 0, 0)、j(0, 1, 0)、k(0, 0, 1),满足:
i x j = k,j x i = -k
j x k = i,k x j = -i
k x i = j,i x k = -j
因此:
u x v = (x1i+y1j+z1k) x (x2i+y2j+z2k)
=x1y2k(ixj)+x1z2(ixk)+y1x2(jxi)+y1z2(jxk)+z1x2(kxi)+z1y2(kxj)
=(x1y2-y1x2)(ixj)+(x1z2-z1x2)(ixk)+(y1z2-z1y2)(jxk)
=(x1y2-y1x2)k-(x1z2-z1x2)j+(y1z2-z1y2)i
=(y1z2-z1y2)i+(z1x2-z2x1)j+(x1y2-y1x2)k
在二维坐标系下,设向量u(x1, y1), v(x2, y2),则将其扩展为三维向量u1(x1, y1, 0)和v1(x2, y2, 0)
u1 x v1 = (x1i+y1j+0k)x(x2i+y2j+0k) = (x1y2-y1x2)k
不知道怎么推了...
二维向量的叉积公式为u x v = x1y2-y1x2
代码如下:
double XProduct(Vector a, Vector b)
{
return a.x*b.y - a.y*b.x;
}
根据叉乘公式:| u x v |= |u| |v| |sinθ|,以及三角形公式s = a*b*sinθ/2,可见其值为三角形面积的两倍,即下图平行四边形的面积:

而u x v的值根据右手法则有正负之分,因此u x v的几何意义即为上述平行四边形的有向面积。
另外,若已知3点坐标,p1(x1, y1), p2(x2, y2), p3(x3, y3),可以按如下求出面积:
double Area(Point a, Point b, Point c)
{
Vector v1 = b - a;
Vector v2 = c - a;
return fabs(XProduct(v1, v2)/2);
}
//测试
int main()
{
Point p1(0, 0), p2(3, 0), p3(0, 4);
printf("%.2f\n", Area(p1, p2, p3));
return 0;
}