给定点坐标求多边形面积模板

it2023-02-23  79

给定点坐标求多边形面积模板


方法:利用向量叉积求三角形面积的方法,把多边形分割成若干个三角形,然后求和得到多边形面积,计算时需要注意,给定的点的顺序必须是逆时针或者顺时针。 逆时针的方向是叉积的正方向,顺时针是叉积的负方向。

初始思路:对于上图,固定一个点 A A A,剩下 4 4 4个点组成 3 3 3个三角形 A B C , A C D , A D E ABC,ACD,ADE ABC,ACD,ADE,叉积求和即可。

进一步:我们可以通过叉积公式化简,比如 A B → × B C → \overrightarrow{AB}\times \overrightarrow{BC} AB ×BC ,我们可以将 A B → \overrightarrow{AB} AB 拆成 A X → + X B → \overrightarrow{AX}+\overrightarrow{XB} AX +XB X X X可为坐标系上任意一点,一般我们以原点 O O O作为 X X X在计算时最为方便。 最后我们可以化简得到: S = ∑ i = 0 n P i X → × X P i + 1 → 2 S=\dfrac{\sum\limits_{i=0}^{n} \overrightarrow{P_{i}X}\times \overrightarrow{XP_{i+1}}}{2} S=2i=0nPiX ×XPi+1 点的下标从 P 0 P_0 P0开始, P n = P 0 P_n=P_0 Pn=P0


代码如下:

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; #define mst(a,b) memset(a,b,sizeof a) struct P{ double x,y; }a[N]; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%lf%lf",&a[i].x,&a[i].y); } a[n].x=a[0].x,a[n].y=a[0].y; double s=0; for(int i=0;i<n;i++) s+=(a[i].x*a[i+1].y-a[i+1].x*a[i].y); s/=2; //如果点是顺时针读入就 加上绝对值 s=fabs(s); printf("Area=%.1f\n",s); return 0; }
最新回复(0)