KeepZ

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

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

【该图片来源: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);
    }
}

分类:

技术点:

相关文章: