給定多邊形的頂點座標(有序),讓你來求這個多邊形的面積,你會怎麼做?
我們知道,任意多邊形都可以分割為n個三角形,所以,如果以這為突破點,那麼我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最後累加就可以了,把多邊形分割為三角形的方式多種多樣,在這裡,我們按照如下圖的方法分割:
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所給出的是凸多邊形,那這種演算法對於非凸多邊形是否同樣適用呢?比如下面這個最簡單的凸多邊形的圖形:
用剛才的劃分方法的話,就會出現乙個詭異的問題,那就是有乙個三角形出現在了圖形的外面,而另外乙個又超出了多邊形的範圍(劃分為了sab,sbc兩個圖形),那麼這樣再用剛才的公式求面積,結果還是正確的麼?
s(1->4)=s(1,2,3)+s(1,3,4)
先公布結論,這個式子是正確的,等等,為什麼?還記得剛才我提到了那個「有向面積」的概念麼?忘了的話,請回頭看看加重了的字。
請注意從圖中看,sab點為順時針排列,sbc點為逆時針排列,面積從數值上就是從sab這個超過範圍的大三角形中去掉sbc這個小三角形,最後的結果神奇的就是多邊形sabc的面積,那麼這個結論能否推廣到任意多邊形呢?
在這裡不做證明,下面給出的公式,就是任意多邊形的面積公式:
有了以上公式我們就可以計算任意多邊形的面積了;
下面看一道題。
description
「 改革春風吹滿地,
不會ac沒關係;
實在不行回老家,
還有一畝三分地。
謝謝!(樂隊奏樂)」
話說部分學生心態極好,每天就知道遊戲,這次考試如此簡單的題目,也是雲裡霧裡,而且,還竟然來這麼幾句打油詩。
好呀,老師的責任就是幫你解決問題,既然想種田,那就分你一塊。
這塊田位於浙江省溫州市蒼南縣靈溪鎮林家鋪子村,多邊形形狀的一塊地,原本是linle 的,現在就準備送給你了。不過,任何事情都沒有那麼簡單,你必須首先告訴我這塊地到底有多少面積,如果回答正確才能真正得到這塊地。
發愁了吧?就是要讓你知道,種地也是需要ac知識的!以後還是好好練吧...
input
輸入資料報含多個測試例項,每個測試例項佔一行,每行的開始是乙個整數n(3<=n<=100),它表示多邊形的邊數(當然也是頂點數),然後是按照逆時針順序給出的n個頂點的座標(x1, y1, x2, y2... xn, yn),為了簡化問題,這裡的所有座標都用整數表示。
輸入資料中所有的整數都在32位整數範圍內,n=0表示資料的結束,不做處理。
output
對於每個測試例項,請輸出對應的多邊形面積,結果精確到小數點後一位小數。
每個例項的輸出佔一行。
sample input
3 0 0 1 0 0 1sample output4 1 0 0 1 -1 0 0 -1
0
0.5**如下:2.0
#include#include#includeusing namespace std;
int x[105],y[105];
int s(double x1,double y1,double x2,double y2)
int main()
x[a]=x[0];
y[a]=y[0];
for(int i=0;i
cout<
return 0;
}
任意多邊形的面積
給定多邊形的頂點座標 有序 讓你來求這個多邊形的面積,你會怎麼做?我們知道,任意多邊形都可以分割為n個三角形,所以,如果以這為突破點,那麼我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最後累加就可以了,把多邊形分割為三角形的方式多種多樣,在這裡,我們按照如下圖的方法分割 s點作為起始點...
任意多邊形面積計算
任意多邊形的面積可由任意一點與多邊形上依次兩點連線構成的三角形向量面積求和得出。向量面積 三角形兩邊向量的叉乘。如下圖 按定理,多邊形面積由p點與a g的各頂點連線所構成的三角形向量面積構成,假定多邊形頂點座標順序為a g,逆時針為正方向,則有如下結論 pab,pbc,pcd均為順時針,面積為負 p...
求任意多邊形面積
首先宣告乙個概念 三角形外積 把向量外積定義為 a b a b sin a,b 方向根據右手法則確定,就是手掌立在a b所在平面的向量a上,掌心向b,那麼大拇指方向就是垂直於該平面的方向,被規定為外積 的方向。又根據三角形的面積公式 s 0.5 a b sin s 0.5 a b 上書中給出定理 任...