hdu3036改革春风吹满地(求多边形面积)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2036

开始的算法是,分割,但是wa了,因为凹多边形没办法简单分割:例如下图:

现附上求凸多边形面积的代码(海伦公式):

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;

struct point{
    int x,y;
}a[105];

double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} 

double area(double a,double b,double c)
{
    double p = (a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}

int main()
{
    int n;
    double d[105],b[105];
    while(cin>>n)
    {
        double Area=0; 
        if(n==0)
            break;
        for(int i = 1;i<=n;i++)
        {
            cin>>a[i].x>>a[i].y;
        }
        for(int i = 2;i<=n;i++)
        {
            d[i]=dis(a[1],a[i]);//第一个点到第n个点的距离 
        }    
        for(int i = 2;i<n;i++)
        {
            b[i]=dis(a[i],a[i+1]);//各底边距离 
        }
        for(int i = 2;i < n;i++)
        {
            Area+=area(b[i],d[i],d[i+1]);
        }
        printf("%.1lf\n",Area); 
    }
    return 0;
}
View Code

 

利用叉积求三角形面积:不限制凹凸:

所以三角形ABC面积:

AC代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0)
        break;
        int x1,y1,x2,y2,x3,y3;
        cin>>x1>>y1>>x2>>y2;
        double s=0;
        for(int i=3;i<=n;i++)
        {
            cin>>x3>>y3;
            s+=(x1-x2)*(y1-y3)-(y1-y2)*(x1-x3);
            x2=x3;
            y2=y3;
        }
        printf("%.1lf\n",s/2);
    }
    return 0;
}
View Code

 

 

但是还是想不懂为什么凹多边形可以这么算,第一个定点坐标一直没有变,如下图:

 

我不明白的一点是,三角形ACD面积怎么算的……,两条边中间是空的呀??

有大佬经过的话请指教一下,感谢。

 

posted @ 2018-10-04 17:12  星海violet  阅读(243)  评论(0编辑  收藏  举报