【計算幾何】多邊形面積 pascal 解…

【計算幾何】多邊形面積

Time Limit:1000MS  Memory Limit:65536K
Total Submit:4 Accepted:1

Description

多邊形面積(area.pas/c/cpp)

【問題描述】

中學生傑利陶醉於數學研究,他思考的問題對專家而言可能太過簡單,但作爲一個15歲的中學生來說,他做得非常棒。他太熱衷於思考數學問題,以至於輕易就會嘗試用數學方法來解決碰到的問題。一天,他看到桌上的一張紙。他四歲的妹妹瑪麗在上面畫了一些線。那些線恰好構成一個凹多邊形,如圖1所示。

【計算幾何】多邊形面積 <wbr>pascal <wbr>解題報告

“棒極了!”他想,“這些多邊形看起來是規則的。我曾經學過怎樣計算三解形、矩形和圓的面積。我一定能找到計算這些圖形面積的方法。”他確實做到了。首先,他標記多邊形頂點的座標,如圖2所示。隨後,他豪不費力的求得結果----0.75 。

【計算幾何】多邊形面積 <wbr>pascal <wbr>解題報告

當然,他不會滿足於解決這麼簡單的問題。“嗯,如果紙上面的是一個任意的多邊形,我應該怎麼計算它的面積呢?”他問自己。可他一直都沒有找到計算任意多邊形面積的通用方法。他清楚地明白以他的能力無法找到問題的答案。所以他向你請教。他會很感激你好心的幫助。

Input

輸入數據的第一行是一個整數n,代表圖形的頂點個數(1=
接下來的N行,每行是一對實數,代表圖形的頂點的座標(xi,yi)。每個圖形由第一個頂點連接第二個頂點,第二個頂點連接第三個頂點,…,最後第N個頂點連接第一個頂點形成封閉的多邊形。

Output

輸出圖形的面積或字符串“Impossible”。
如果圖形是一個多邊形,計算它的面積(精確到小數後兩位)。如果輸入的頂點不能構成一個多邊形(也就是說,一條邊和另一條不相連的邊相交,例如,四條線段的圖形,第一條線和第三條線段相交),就輸出“Impossible”,指出圖形不可能是多邊形。如果頂點的數量不足以構成一個封閉的多邊形,也輸出“Impossible”。

Sample Input


Sample Output


Source

 

叉乘的幾何意義就是以這兩條向量爲邊的平行四邊形的面積。

兩條向量叉積的一半就表示這兩條向量構成的三角形的面積。

這個面積是分正負的(我也不是很懂爲什麼)。

【計算幾何】多邊形面積 <wbr>pascal <wbr>解題報告
對於凸多邊形,很容易理解面積公式。

對於凹多邊形,△p1p4p5的面積是負的,其與 △p1p3p4和△p1p5p6 的重疊面積相抵消,也減去了△p1p5p6包括的不再多變形內的面積,所以符合面積公式。

 

 

 

var

 tot:real;

 n:longint;

 a:array[1..1001,1..2]of real;

 

procedure init;

var

 i:longint;

begin

 read(n);

 if n<3  then begin writeln('Impossible');  halt; end;

 for i:=1 to n do

  read(a[i,1],a[i,2]);

end;

 

function cj(x,y,z:longint):real;

var

 i:real;

begin

 i:=(a[x,1]-a[z,1])*(a[y,2]-a[z,2])-

    (a[x,2]-a[z,2])*(a[y,1]-a[z,1]);

 exit(i);

end;

 

procedure main;

var

 i,j:longint;

begin

 for i:=2 to n-2 do

  for j:=i+2 to n do

   if (cj(j,i,i-1)*cj(j-1,i,i-1)<0)and(cj(i,j,j-1)*cj(i-1,j,j-1)<0) then begin writeln('Impossible');  exit; end;

 

 for i:=2 to n-1 do

  tot:=tot+cj(i,i+1,1)/2;

 writeln(abs(tot):0:2)

end;

 

begin

 init;

 main;

end.

發佈了64 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章