( 算法樹之幾何 )【 計算任意多邊形的面積 】

計算任意多邊形的面積

原文:https://www.cnblogs.com/TenosDoIt/p/4047211.html

對於凸多邊形,很容易計算,如下圖,以多邊形的某一點爲頂點,將其劃分成幾個三角形,計算這些三角形的面積,然後加起來即可。已知三角形頂點座標,三角形面積可以利用向量的叉乘來計算。

image

 

對於凹多邊形,如果還是按照上述方法劃分成三角形,如下圖,多邊形的面積 = S_ABC + S_ACD + S_ADE, 這個面積明顯超過多邊形的面積。

image

 

我們根據二維向量叉乘求三角形ABC面積時,利用的是

image

這樣求出來的面積都是正數,但是向量叉乘是有方向的,即image 是有正負的,如果把上面第三個公式中的絕對值符號去掉,即image ,那麼面積也是有正負的。反應在上面第二個圖中,S = S_ABC + S_ACD + S_ADE,如果S_ABC和S_ADE是正的,那麼S_ACD是負的,這樣加起來剛好就是多邊形的面積。對於凸多邊形,所有三角形的面積都是同正或者同負。

 

如果我們不以多邊形的某一點爲頂點來劃分三角形而是以任意一點,如下圖,這個方法也是成立的:S = S_OAB + S_OBC + S_OCD + S_ODE + S_OEA。計算的時候,當我們取O點爲原點時,可以簡化計算。

image

當O點爲原點時,根據向量的叉積計算公式,各個三角形的面積計算如下:

 

S_OAB = 0.5*(A_x*B_y - A_y*B_x)   【(A_x,A_y)爲A點的座標】

S_OBC = 0.5*(B_x*C_y - B_y*C_x)

S_OCD = 0.5*(C_x*D_y - C_y*D_x)

S_ODE = 0.5*(D_x*E_y - D_y*E_x)

S_OEA = 0.5*(E_x*A_y - E_y*A_x)

 

代碼:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
ll x[55],y[55];
ll n,k;

int main()
{
    ll ans = 0;
    cin >> k;
    for ( ll i=0; i<k; i++ ) {
        cin>>x[i]>>y[i];
    }
    x[k] = x[0];
    y[k] = y[0];
    for ( ll i=0; i<k; i++ ) {
        ans += (x[i]*y[i+1]-x[i+1]*y[i]);
    }
    if ( are<0 ) ans = -ans;
    cout << (ll)floor(0.5*ans) << endl; // 輸出小於答案的最大整數

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章