题目大意

眼下出现在 HansBug 蒟蒻面前的是一个奇怪的磁场,形状为多边形,可以描述为 N 个点构成的序列,这些点即依次为该磁场的各个顶点。于是现在蒟蒻 HansBug 想要知道该磁场的磁通量为多少。可是他脑细胞和 RP 已经消耗殆尽,所以这个高端的任务就交给你们啦。

这是一道神奇的题目……

我看了半天,发现有这样一句话:

磁通量 = 磁感应强度 × 磁场区域面积。

反正就是求一个多边形的面积,再乘上一个数即可。

思路

如果是凸多边形的话,我们可以将其分成许多个三角形计算。

我们知道三角形的面积等于向量外积的绝对值的一半

这是因为平行四边形的面积在数值上等于两边的向量的外积。

但是还有凹多边形的情况,我们想想后会发现,有的外积是正的,有的是负的,它们正好可以把多余的部分抵消!

代码

一不小心写长了……

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct point{double x,y;}p[100005];
int n;
double ans,b;
inline double cj(point a1,point a2,point b1,point b2){
    return (a2.x-a1.x)*(b2.y-b1.y)-(b2.x-b1.x)*(a2.y-a1.y);
}//外积
int main(){
    scanf("%d%lf",&n,&b);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&p[i].x,&p[i].y);//输入
    for(int i=2;i<=n-1;i++)
        ans+=cj(p[1],p[i],p[1],p[i%n+1]);
    printf("%.4lf\n",fabs(ans*b/2.));//最后再求绝对值
    return 0;
}