给定点坐标求多边形面积模板
方法:利用向量叉积求三角形面积的方法,把多边形分割成若干个三角形,然后求和得到多边形面积,计算时需要注意,给定的点的顺序必须是逆时针或者顺时针。
逆时针的方向是叉积的正方向,顺时针是叉积的负方向。
初始思路:对于上图,固定一个点 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 X P i → × X P i + 1 → 2 S=\dfrac{\sum\limits_{i=0}^{n} \overrightarrow{XP_{i}}\times \overrightarrow{XP_{i+1}}}{2} S=2i=0∑nXPi ×XPi+1
点的下标从 P 0 P_0 P0开始, P n = P 0 P_n=P_0 Pn=P0。
如图所示, S A B C = − S O A B + S O B C + S O A C S_{ABC}=-S_{OAB}+S_{OBC}+S_{OAC} SABC=−SOAB+SOBC+SOAC
上面每个三角形对应两个点的叉积除以2。
因此可以用叉积计算凸多边形的面积。
代码如下:
#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;
}