算法竞赛:鞋带公式

鞋带公式,又称高斯面积公式。这是一种利用已知顶点的直角坐标快速计算任意简单多边形面积的数学方法。因其计算过程中交叉相乘的步骤类似于交叉穿过鞋孔的鞋带而得名。

数学表达

设多边形按顺时针或逆时针顺序排列的 nn 个顶点坐标依次为 (x1,y1),(x2,y2),,(xn,yn)(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n),令最后一个点连回起点 (xn+1,yn+1)=(x1,y1)(x_{n+1}, y_{n+1}) = (x_1, y_1),其面积 SS 计算公式为:

S=12|i=1n(xiyi+1xi+1yi)|S = \frac{1}{2} \left\vert{} \sum_{i=1}^{n} (x_i y_{i+1} – x_{i+1} y_i) \right\vert{}

展开成的矩阵交叉相乘形式为:

S=12|(x1y2+x2y3++xny1)(y1x2+y2x3++ynx1)|S = \frac{1}{2} \vert{}(x_1y_2 + x_2y_3 + \dots + x_ny_1) – (y_1x_2 + y_2x_3 + \dots + y_nx_1)\vert{}

核心特点与适用条件

  • 顶点必须有序:输入坐标必须按多边形外边界的连续顺序(纯顺时针或纯逆时针)排列,不能随机乱序。
  • 图形类型:仅适用于简单多边形(边与边不能交叉),但对凸多边形和凹多边形都有效
  • 几何本质:本质上是将多边形拆分为多个原点与相邻两点构成的三角形,利用二维向量叉积(Cross Product)求出有向面积再累加。
  • 符号含义:不加绝对值时,逆时针求出的面积值为正,顺时针为负。
  • 复杂度:时间复杂度为 O(n)O(n),只需遍历一遍顶点即可完成计算,极其高效。

代码

#include <vector>
#include <cmath>

struct Point {
    double x, y;
};

double getPolygonArea(const std::vector<Point>& p) {
    int n = p.size();
    double sum = 0;
    for (int i = 0; i < n; i++) {
        int next = (i + 1) % n; // 取模自动实现循环连回第 0 个点
        sum += (p[i].x * p[next].y - p[i].y * p[next].x);
    }
    return std::abs(sum) / 2.0;
}
本文章作者为星鸿,转载务必注明出处!请依据《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》保留本文链接,地址:https://blog.xhsr.org.cn/archives/1142
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇