对于一个多边形(可以为凹多边形)求其面积可以用叉积面积法,其证明过程十分简单,对于任意3个点A,B,C若其点成逆时针给出,那么三角形的面积就是,设A点是原点:(xb*yc-xc*yb)/2;这其实就是向量求面积得来的,这个结果为正,当点A,B,C顺时针给出时,其面积就会为负。我们求一个多边形面积时,我们就可以取o点(原点)来求,每求次按顺序取出多边形的连续两点,对所求结果求和即为面积。注意(最后一个点和第一个点也要算进去,故,求和次数是n次,n为多边形边数)基础题练手:http://acm.hdu.edu.cn/showproblem.php?pid=2036 多边形叉积面积法详解博客:https://blog.csdn.net/Adusts/article/details/80546770
ac代码:(自定义ak函数是给出3边求面积的海伦公式,bk是叉积函数)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<stack> 6 #include<algorithm> 7 #include<vector> 8 #include<cmath> 9 #define MAX(a,b) (((a)>(b))?(a):(b)) 10 #define MIN(a,b) (((a)>(b))?(b):(a)) 11 using namespace std; 12 typedef long long ll; 13 typedef pair<ll,ll> P; 14 const int mod=1000; 15 struct node{ 16 ll x,y; 17 }p[105]; 18 double ak(node a,node b,node c) 19 { 20 double ans=0; 21 double la,lb,lc,ls; 22 la=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 23 lb=sqrt((a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y)); 24 lc=sqrt((c.x-b.x)*(c.x-b.x)+(c.y-b.y)*(c.y-b.y)); 25 ls=(la+lb+lc)/2.0; 26 ans=sqrt(ls*(ls-la)*(ls-lb)*(ls-lc)); 27 return ans; 28 } 29 double bk(node a,node b) 30 { 31 double ans; 32 ans=(a.x*b.y-b.x*a.y)/2.0; 33 return ans; 34 } 35 int main() 36 { 37 int n; 38 while(cin>>n&&n) 39 { 40 for(int i=0;i<n;i++) 41 cin>>p[i].x>>p[i].y; 42 double ans=0; 43 for(int i=0;i<n-1;i++) 44 ans+=bk(p[i],p[i+1]); 45 ans+=bk(p[n-1],p[0]); 46 printf("%.1f ",ans); 47 } 48 return 0; 49 }