三角形的定向(符号)面积

三角形的定向(符号)面积

给定三点 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=x2x1y2y1x3x2y3y2=(x2x1)(y3y2)(x3x2)(y2y1)


实现

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真的不是cjc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值