計算任意多邊形的面積
對於凸多邊形,很容易計算,如下圖,以多邊形的某一點爲頂點,將其劃分成幾個三角形,計算這些三角形的面積,然後加起來即可。已知三角形頂點座標,三角形面積可以利用向量的叉乘來計算。
對於凹多邊形,如果還是按照上述方法劃分成三角形,如下圖,多邊形的面積 = S_ABC + S_ACD + S_ADE, 這個面積明顯超過多邊形的面積。
我們根據二維向量叉乘求三角形ABC面積時,利用的是
這樣求出來的面積都是正數,但是向量叉乘是有方向的,即 是有正負的,如果把上面第三個公式中的絕對值符號去掉,即 ,那麼面積也是有正負的。反應在上面第二個圖中,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點爲原點時,可以簡化計算。
當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;
}