计算三角形面积

这个问题是今天在做 https://leetcode-cn.com/problems/largest-triangle-area/ 题目时候遇到的。我隐约地记得,两个向量的叉乘,是这两个向量围成的面积。所以如果三角形的两个向量进行叉乘的话,其结果绝对值的1/2就是三角形的面积。

这与叉乘的正负号,可以通过右手定则确定:a x b, 当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。如果c方向是向上的话,那么是正好,否则是符号。

如果有三个点v1(x1, y1), v2(x2, y2), v3(x3, y3),a向量是v1->v2, b向量是v2->v3的话,我们还可以根据叉乘的正负号,判断是顺时针还是逆时针转动:如果a x b是正号的话,那么是逆时针,否则是顺时针。

关于多维度叉乘的计算可以参考如下 公式

i j k
ax ay az
bx by bz

结果是 (ay*az-az*by)i - (ax*bz-az*bx)j + (ax*ay-ay*bx)k.

如果知道三条边的长度的话,还可以使用 海伦公式 来计算面设计:p=0.5(a+b+c), area = sqrt(p*(p-a)*(p-b)*(p-c)).

另外还有一个 鞋带公式 来计算多边形面积。我粗看了一下这个公式的形式,应该就是把n凸多边形分解成为n-2个三角形,然后分别计算这些三角形的面积。但是如果遍历的点按照顺时针或者是逆时针排序的话,那么前后两项就可以抵消,变成形式上非常优美的鞋带公式。

shoelace-formula.jpg