三角形的定向(符号)面积
给定三点 p 1 p_1 p1 、 p 2 p_2 p2 和 p 3 p_3 p3 ,请计算它们所组成的三角形的定向(符号)面积。面积的符号以下列方式确定:想象你站在平面内的 p 1 p_1 p1 点,面对 p 2 p_2 p2 。你走到 p 2 p_2 p2 ,如果 p 3 p_3 p3 在你的右边(那么我们说三个向量呈 "顺时针"排列),面积的符号为负,否则为正。如果这三个点是相邻的,面积就是零。
使用这个有符号区域,我们既可以得到常规的无符号区域(作为有符号区域的绝对值),也可以确定点是按指定顺序顺时针还是逆时针排列(例如,在凸包算法中很有用)。
计算
我们可以利用如下定理:一个 2 × 2 2\times 2 2×2 矩阵的行列式等于该矩阵的列(或行)向量所跨越的平行四边形的有符号面积。这类似于二维中交叉积的定义。通过将这个面积除以 2 2 2 ,我们可以得到我们需要的三角形的面积。我们将使用 p 1 p 2 ⃗ \vec{p_1p_2} p1p2 和 p 2 p 3 ⃗ \vec{p_2p_3} p2p3 作为列向量,并计算出 2 × 2 2\times 2 2×2 的行列式。
2 S = ∣ x 2 − x 1 x 3 − x 2 y 2 − y 1 y 3 − y 2 ∣ = ( x 2 − x 1 ) ( y 3 − y 2 ) − ( x 3 − x 2 ) ( y 2 − y 1 ) 2S=\left|\begin{matrix}x_2-x_1 & x_3-x_2\\y_2-y_1 & y_3-y_2\end{matrix}\right|=(x_2-x_1)(y_3-y_2)-(x_3-x_2)(y_2-y_1) 2S=∣∣∣∣x2−x1y2−y1x3−x2y3−y2∣∣∣∣=(x2−x1)(y3−y2)−(x3−x2)(y2−y1)
实现
int signed_area_parallelogram(point2d p1, point2d p2, point2d p3) {
return cross(p2 - p1, p3 - p2);
}
double triangle_area(point2d p1, point2d p2, point2d p3) {
return abs(signed_area_parallelogram(p1, p2, p3)) / 2.0;
}
bool clockwise(point2d p1, point2d p2, point2d p3) {
return signed_area_parallelogram(p1, p2, p3) < 0;
}
bool counter_clockwise(point2d p1, point2d p2, point2d p3) {
return signed_area_parallelogram(p1, p2, p3) > 0;
}