二维向量叉乘:把“面积”算出来 别急着记公式,先想想那把几何文具。你手里拿着一把尺子,一端在纸面外,一端在纸面上,想捏出一块三角形,面积到底是多少? 要是那是平行四边形,那不就是(底乘以高)嘛。小学时候都知道,底边长几,高就是垂直距离,乘起来就是面积。
那二维向量叉乘,实际上就是搞定了平行四边形的面积这事儿。 我们有两个向量,$a = (a_x, a_y)$ 和 $b = (b_x, b_y)$。你把它们画在平面上,这就构成了一个平行四边形。
这个平行四边形的面积 $S$,等于向量 $a$ 和向量 $b$ 夹角的余弦值乘以它们的长度。也就是 $S = |a| |b| costheta$。
这玩意儿看着挺好办,就是夹个角,还得知道余弦值。 难题在于,这个角度 $theta$ 一般是未知的,并且只知道夹角的正弦值可能更好办计算。便,我们就把余弦换成了正弦。出于 $sin^2theta + cos^2theta = 1$,故此 $costheta = sqrt{1 - sin^2theta}$。
这就把面积公式变成了包含正弦值的表达式。 这时候,我们得把向量的坐标代入。向量 $a$ 的模长 $|a| = sqrt{a_x^2 + a_y^2}$,向量 $b$ 的模长 $|b| = sqrt{b_x^2 + b_y^2}$。把这些代进去,费事就来了:我们要算 $sqrt{(a_x^2 + a_y^2)(b_x^2 + b_y^2)(1 - frac{a_x^2 a_y^2 + a_y^2 b_x^2}{a_x^2 b_x^2 + a_y^2 b_y^2})}$。 这分母里的分子局部,也就是 $a_x^2 b_y^2 + a_y^2 b_x^2$,这一项实际上能够用一个三角函数恒等式把它绕开。
那个恒等式就是 $sin(A+B) = sin A cos B + cos A sin B$。 要是你盯着这个公式看,会发现它长得和向量叉乘的点积公式 $a cdot b = a_x b_x + a_y b_y$ 一模一样,只是把加号换成了乘号。
这暗示了啥?暗示了二维向量叉乘的结局,本质上和点积一样,是一个新的数量。并且这个新的数量,正是平行四边形面积的一半。 为啥是面积的一半?出于向量叉乘 $a times b$ 算出的就是这个平行四边形的面积。而点积算出的才是平行四边形里那个最尖的那个三角形——也就是对角线切出来的那一半的三角形,面积是平行四边形的一半。
故此,叉乘的结局 $|a times b|$,正好是平行四边形的面积。 我们把刚刚那个复杂的根号式子,做乘法展开。利用向量点积的分配律,把 $(a_x^2 + a_y^2)$ 和 $(b_x^2 + b_y^2)$ 展开,利用平方差公式要么移项整理,会发现那些交叉项彻底抵消了。 剩下的结局是个纯分子,彻底没有根号,也没有那些乱七八糟的根号嵌套了。整个表达式就简化成了: $|a times b| = a_x b_y - a_y b_x$ 这就是最终的公式。二维向量叉乘的结局,就是一个标量,代表面积的大小。 这就解释了为啥计算机图形学里如此好用。出于在二维世界里,我们要算面积、算判断碰撞、算旋转,大量时候不需求那些复杂的三维坐标运算。
这里的叉乘,就是直接拿两个向量的坐标,做减法,得个个正整数(要是是整数点的话),然后开根号,要么直接把绝对值看成整数,直接代表面积。 举个例子。假设有两个整数向量。 $a = (2, 5)$, $b = (-3, 7)$。 算一下叉乘:$a_x b_y - a_y b_x$。 代入数值:$2 times 7 - 5 times (-3)$。 这就变成了 $14 - (-15)$,也就是 $14 + 15 = 29$。 这个 29 就是平行四边形 $ab$ 的面积。再算一下点积验证一下:$2 times (-3) + 5 times 7 = -6 + 35 = 29$。彻底吻合。 再换一个例子,看看绝对值的功能。 $a = (10, 0)$, $b = (0, 10)$。 这两个向量互相垂直,角度 $theta = 90^circ$。点积是 0,叉乘是 $10 times 10 - 0 times 0 = 100$。 平行四边形的面积显然是 100 乘以 100 再除以 2 吗?不对,这是正方形。边长是 10,面积是 100。点积算出 0,说明垂直,叉乘算出 100,没错。 要是一个角是锐角,点积是正数,面积也是正的。
要是夹角是钝角呢?比如 $a=(3, 0)$,$b=(-1, 0)$。 点积 $3 times (-1) + 0 = -3$。 叉乘 $3 times 0 - 0 times (-1) = 0$。 什么的,这里叉乘算出 0,是巧合吗? 画个图,$a$ 指向右,$b$ 指向左,它们共线但方向反之,夹角是 180 度。 $cos(180^circ) = -1$。 面积应当是 $|3| times |-1| times |-1| = 3$。 哎呀,叉乘公式 $a times b = a_x b_y - a_y b_x$。 这里 $a=(3,0), b=(-1,0)$。 $a_x b_y = 3 times 0 = 0$。 $a_y b_x = 0 times (-1) = 0$。 结局是 0。 这说明啥?说明共线向量叉乘为零。
这符合物理直觉,两个线共线,推不动面积。 再试一个非零的例子。 $a = (1, 1)$, $b = (1, 1)$。 这两个向量彻底一样,平行。夹角 0 度。面积应当是 0。 点积 $1+1=2$。 叉乘 $1times1 - 1times1 = 0$。 对的,彻底一致。 再试一个不一样的。 $a = (1, 1)$, $b = (2, 1)$。 夹角不是 90 度。 点积 $2 + 1 = 3$。 叉乘 $1 times 1 - 1 times 2 = 1 - 2 = -1$。 面积是 $|-1| = 1$。 那实际面积是多少? 向量 $a$ 指向东北,向量 $b$ 指向东。 平行四边形是个细长的形状。 底边沿 x 轴投影是 2,高是 1(出于 y 坐标差是 0,这是不对的)。 用行列式法算三角形面积:$frac{1}{2} |x_1 y_2 - x_2 y_1| = frac{1}{2} |1times1 - 1times2| = frac{1}{2} |1-2| = 0.5$。 平行四边形面积就是三角形面积的两倍,也就是 1。 跟叉乘算的绝对值 1 一模一样。 看来这个公式 $a_x b_y - a_y b_x$ 确实忒稳了。它不管向量如何转,不管角度多大,只要坐标是整数,结局就是个整数,直接代表面积大小。 在数学上,我们叫它“二元叉运算”,简称叉乘。之故此叫叉乘,是出于点积是算“多少”,叉乘是算“多大”。它把二维平面的几何属性(面积),直接转化成了标量运算。 有时候你会认定这公式怪怪的,为啥减法就能代表面积?有些程序员会问。
实际上不用纠结“怪不怪”,这就好比你用加法算距离,用乘法算力矩,别看写法不同,但本质都是建立坐标和物理量之间的桥梁。 那个 $a_x b_y - a_y b_x$ 的分子形式,实际上是 $sin(alpha - beta)$ 的某种展开,只不过这里没有三角函数,全是坐标。它本质上说:“向量 a 绕着原点转一圈,向量 b 绕着原点转一圈,这两圈覆盖出来的面积,用坐标相乘减相除的方式算出来。” 最终总结一下这个小小的代数操作。二维向量叉乘,就是那两个坐标坐标相乘交叉再相减。$a_x b_y - a_y b_x$。 算出结局后,别忘了要开根号要么取绝对值,这才是真正的面积。 实际上,只要你想把三维向量转成二维用的,要么把二维向量转成三维用的,这个逻辑都挺顺。在三维里,$vec{c} = (c_x, c_y, c_z)$。 要是要算叉乘,公式就变复杂了,变成了三个行列式要么交叉相乘的混合运算。但在二维里,它退化成了一个好办的减法公式。 这就是向量叉乘的魅力。它用最少的运算,把最抽象的几何概念变成了最实用的计算工具。下次你在代码里写个碰撞检测,要么画个图算个面积,不妨试试用这个 $a_x b_y - a_y b_x$ 试试手。 记住,别被那些生硬的公式吓倒,有时候最好办的减法,就是最智慧的解法。