求任意多边形面积-有向面积
給定多邊形的頂點坐標(有序),讓你來求這個多邊形的面積,你會怎么做?
我們知道,任意多邊形都可以分割為N個三角形,所以,如果以這為突破點,那么我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最后累加就可以了,把多邊形分割為三角形的方式多種多樣,在這里,我們按照如下圖的方法分割:
圖1
S點作為起始點(點1),a->e依次作為點2,3……。
一個三角形的面積是怎樣的呢?
根據線性代數的知識,我們有如下的三角形面積公式,稱之為有向面積(signed area):
將這個行列式以第三列展開可以得到:
這就是以點1、2、3構成的三角形的有向面積(點如果是順時針給出,有向面積為負,逆時針給出,有向面積為正),那么繼續我們的工作,通過三角形的面積公式,來得到多邊形的面積公式:
對于圖1而言,多邊形的面積就是:
S(1->6)=S(1,2,3)+S(1,3,4)+S(1,4,5)+S(1,5,6)
這里我們不免有些疑問,第一,圖1所給出的是凸多邊形,那這種算法對于非凸多邊形是否同樣適用呢?比如下面這個最簡單的凸多邊形的圖形:
圖2
用剛才的劃分方法的話,就會出現一個詭異的問題,那就是有一個三角形出現在了圖形的外面,而另外一個又超出了多邊形的范圍(劃分為了Sab,Sbc兩個圖形),那么這樣再用剛才的公式求面積,結果還是正確的么?
S(1->4)=S(1,2,3)+S(1,3,4)
先公布結論,這個式子是正確的,等等,為什么?還記得剛才我提到了那個“有向面積”的概念么?忘了的話,請回頭看看加重了的字。
請注意從圖中看,Sab點為順時針排列,Sbc點為逆時針排列,面積從數值上就是從Sab這個超過范圍的大三角形中去掉Sbc這個小三角形,最后的結果神奇的就是多邊形Sabc的面積,那么這個結論能否推廣到任意多邊形呢?
圖3
在這里不做證明,下面給出的公式,就是任意多邊形的面積公式:
題目:hdu2036???? http://acm.hdu.edu.cn/showproblem.php?pid=2036
//任意多邊形的面積計算
#include <iostream>
#include <utility>
#include <cmath>
using std::cout;
using std::cin;
using std::endl;
typedef std::pair<double ,double> point;
#pragma warning(disable:4244)
double det(point p0,point p1,point p2)
{
?return (p1.first-p0.first)*(p2.second-p0.second)-(p1.second-p0.second)*(p2.first-p0.first);
}
double ploygon_area(int n,point p[])?
{
?double s=0.0f;
?int i=1;
?for(;i < n-1;i++)
??s += det(p[0],p[i],p[i+1]);
?return 0.5*fabs(s);
}
int main(int argc, char *argv[])
{
?int i,n;
?double s;
?point *points = NULL;
?cout<<"Enter the number of edges of the polygon <n>:";
?cin>>n;
?if(n < 2){
??exit(1);
?}
?points = (point *)malloc(n*sizeof(point));
?for(i=0; i<n; i++){
??cout<<endl<<"points["<<i<<"]=";
??cin>>points[i].first>>points[i].second;
?}
?s=ploygon_area(n, points);
?cout<<"The area is:"<<s<<std::endl;
?if(points)
??free(points);
?return 1;
}
代碼大家可以自行修改,主要看公式
總結
以上是生活随笔為你收集整理的求任意多边形面积-有向面积的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jita
- 下一篇: The Bucket List 题解