【計算幾何】多邊形面積
Time Limit:1000MS Memory
Limit:65536K
Total Submit:4 Accepted:1
Description
多邊形面積(area.pas/c/cpp)
【問題描述】
中學生傑利陶醉於數學研究,他思考的問題對專家而言可能太過簡單,但作爲一個15歲的中學生來說,他做得非常棒。他太熱衷於思考數學問題,以至於輕易就會嘗試用數學方法來解決碰到的問題。一天,他看到桌上的一張紙。他四歲的妹妹瑪麗在上面畫了一些線。那些線恰好構成一個凹多邊形,如圖1所示。
“棒極了!”他想,“這些多邊形看起來是規則的。我曾經學過怎樣計算三解形、矩形和圓的面積。我一定能找到計算這些圖形面積的方法。”他確實做到了。首先,他標記多邊形頂點的座標,如圖2所示。隨後,他豪不費力的求得結果----0.75 。
當然,他不會滿足於解決這麼簡單的問題。“嗯,如果紙上面的是一個任意的多邊形,我應該怎麼計算它的面積呢?”他問自己。可他一直都沒有找到計算任意多邊形面積的通用方法。他清楚地明白以他的能力無法找到問題的答案。所以他向你請教。他會很感激你好心的幫助。
Input
輸入數據的第一行是一個整數n,代表圖形的頂點個數(1=
接下來的N行,每行是一對實數,代表圖形的頂點的座標(xi,yi)。每個圖形由第一個頂點連接第二個頂點,第二個頂點連接第三個頂點,…,最後第N個頂點連接第一個頂點形成封閉的多邊形。
Output
輸出圖形的面積或字符串“Impossible”。
如果圖形是一個多邊形,計算它的面積(精確到小數後兩位)。如果輸入的頂點不能構成一個多邊形(也就是說,一條邊和另一條不相連的邊相交,例如,四條線段的圖形,第一條線和第三條線段相交),就輸出“Impossible”,指出圖形不可能是多邊形。如果頂點的數量不足以構成一個封閉的多邊形,也輸出“Impossible”。
Sample Input
Sample Output
Source
叉乘的幾何意義就是以這兩條向量爲邊的平行四邊形的面積。
兩條向量叉積的一半就表示這兩條向量構成的三角形的面積。
這個面積是分正負的(我也不是很懂爲什麼)。
對於凹多邊形,△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.