zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",s/2);
        }
        return 0;
    }
    View Code

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

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

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

  • 相关阅读:
    1.Python进阶 词典dict
    10.Python基础 反过头来看看
    test
    地图添加标记物 并添加点击弹出框
    百度地图里面添加覆盖物的事件显示最后一个?
    css3之animation制作闪烁文字效果 转
    ajax beforeSend中无效果
    jquery 中 $('div','li')是什么意思?
    SQL 单引号转义
    jQuery 遍历
  • 原文地址:https://www.cnblogs.com/lyqf/p/9742624.html
Copyright © 2011-2022 走看看