多边形叉积求面积法

对于一个多边形(可以为凹多边形)求其面积可以用叉积面积法,其证明过程十分简单,对于任意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\n",ans);
47     }
48     return 0;
49 }

 

posted @ 2019-08-01 15:39  超人不穿内裤  阅读(589)  评论(0编辑  收藏  举报