1. 程式人生 > >【改革春風吹滿地 HDU - 2036 】【計算幾何-----利用叉積計算多邊形的面積】

【改革春風吹滿地 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);
    }
}