改革春风吹满地 HDU - 2036 计算几何-----利用叉积计算多边形的面积

Posted keepz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了改革春风吹满地 HDU - 2036 计算几何-----利用叉积计算多边形的面积相关的知识,希望对你有一定的参考价值。

利用叉积计算多边形的面积

我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的多条射线,这样就可以把该多边形变为多个三角形,然后利用叉积求面积即可。
不过要注意,对于三角形可以简单的用叉积的绝对值的一半表示,但对于多边形不可随意将它分割成的几个三角形对应的叉积的绝对值相加,要有一定顺序才可。
对于三角形,有
技术图片

【该图片来源:https://www.cnblogs.com/xiexinxinlove/p/3708147.html
对于多边形,若顶点是按逆时针方向排列的则方向为最终的值为正,反之为负。这里的排列方向是指你遍历其他顶点时相对于源点的走向。下面见HDU - 2036 题解。
补充:关于凸多边形和凹多边形的的样子见下图。
技术图片

【该图片来源:https://www.cnblogs.com/xiexinxinlove/p/3708147.html

以上内容参考博文:https://www.cnblogs.com/xiexinxinlove/p/3708147.html

AC代码

该题目不用多讲,直接上代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn = 100 + 10;
struct Point

    int _x, _y;
    Point operator-(Point b)
    
        Point a;
        a._x = _x - b._x;
        a._y = _y - b._y;
        return a;
    
;
int n;
Point p[maxn];
int Cross(Point a, Point b)

    return a._x * b._y - a._y * b._x;

int Area(Point *p)

    int ans = 0;
    for(int i = 1; i < n - 1; i++)
        ans += Cross(p[i]-p[0], p[i+1]-p[0]);          //最好写成这样,清晰些,不容易出错
    return ans;     //题目说的逆时针,故ans为正值,直接返回即可

int main()

//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    while(cin >> n && n)
    
        for(int i = 0; i < n; i++)
            cin >> p[i]._x >> p[i]._y;
        int area = Area(p);
        printf("%.1lf\\n", (double)area / 2.0);
    

以上是关于改革春风吹满地 HDU - 2036 计算几何-----利用叉积计算多边形的面积的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2036 改革春风吹满地

HDU 2036 改革春风吹满地

HDU 2036 改革春风吹满地(多边形面积)

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

[HDU]2036:改革春风吹满地

hdu:2036.改革春风吹满地