給定多邊形的頂點座標(有序),讓你來求這個多邊形的面積,你會怎麼做?
我們知道,任意多邊形都可以分割為n個三角形,所以,如果以這為突破點,那麼我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最後累加就可以了,把多邊形分割為三角形的方式多種多樣,在這裡,我們按照如下圖的方法分割:
(點如果是順時針給出,有向面積為負,逆時針給出,有向面積為正)
對於圖1而言,多邊形的面積就是:
s(1->6)=s(1,2,3)+s(1,3,4)+s(1,4,5)+s(1,5,6)(對凸多邊形同樣適用)
如果我們不以多邊形的某一點為頂點來劃分三角形而是以任意一點,如下圖,這個方法也是成立的:s = s_oab + s_obc + s_ocd + s_ode + s_oea。計算的時候,當我們取o點為原點時,可以簡化計算。
當o點為原點時,根據向量的叉積計算公式,各個三角形的面積計算如下:
設a(x1,y1),b(x2,y2)
以下均為向量:
oa(x1,y1),ob(x2,y2)
oa x ob由線性代數叉積知識得:
=x1y2-x2y1
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)
點如果是順時針給出,有向面積為負,逆時針給出,有向面積為正,oab即為o>a>b,即oa向量xob向量
無需擔心點點座標為正還是負,正負只與點給出的順序有關,最終結果取絕對值即可。
題目:hdu2036
//輸入必須是將點按順序輸入,順時還是逆時程式會處理的
#includeusing namespace std;
double ans;
int n;
struct pointa[1000000];
int read()
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}int main();
for(int i=2;i<=n;i++) //取原點為輔助點
ans+=(double)(a[i].x*a[i-1].y-a[i].y*a[i-1].x)/*記得求平行四邊形面積公式嗎*
//求三角形面積。全加起來就好了,因為...面積有方向(正負性),自己會消掉的
ans+=(double)(a[1].x*a[n].y-a[1].y*a[n].x)/2.0;//第1和第n個點單獨處理
if(ans<0.0) ans=-ans;//順時針與逆時針輸入結果互為相反數
printf("%lf",ans);
return 0;
} //起點為(0.0)時
#include #include #include #include #define fre freopen("c:\\users\\dell\\desktop\\in.txt", "r", stdin);
using namespace std;
struct area;
int main()
return 0;
}
任意多邊形面積
給定多邊形的頂點座標 有序 讓你來求這個多邊形的面積,你會怎麼做?我們知道,任意多邊形都可以分割為n個三角形,所以,如果以這為突破點,那麼我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最後累加就可以了,把多邊形分割為三角形的方式多種多樣,在這裡,我們按照如下圖的方法分割 s點作為起始點...
任意多邊形的面積
給定多邊形的頂點座標 有序 讓你來求這個多邊形的面積,你會怎麼做?我們知道,任意多邊形都可以分割為n個三角形,所以,如果以這為突破點,那麼我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最後累加就可以了,把多邊形分割為三角形的方式多種多樣,在這裡,我們按照如下圖的方法分割 s點作為起始點...
任意多邊形面積計算
任意多邊形的面積可由任意一點與多邊形上依次兩點連線構成的三角形向量面積求和得出。向量面積 三角形兩邊向量的叉乘。如下圖 按定理,多邊形面積由p點與a g的各頂點連線所構成的三角形向量面積構成,假定多邊形頂點座標順序為a g,逆時針為正方向,則有如下結論 pab,pbc,pcd均為順時針,面積為負 p...