HDOJ 2036 求多邊形面積

2021-07-05 13:42:45 字數 1905 閱讀 3598

可以利用多邊形求面積公式:

s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )

其中點(x0, y0), (x1, y1), ... , (x

n, yn)為多邊形上按逆時針順序的頂點。

簡要證明:

1.我們先簡單地從三個點入手(包括原點)。

面積s△oab = sabcd - s△oad - s△obc

·sabcd = (y0 + y1) × (x0 - x1) ÷ 2

·s△oad = x0 × y0 ÷ 2

·s△obc = (-x1) × y1 ÷ 2

s△oab = (x0 × y0 + x0 × y1 - x1 × y0 - x1 × y1 - x0 × y0 + x1 × y1) ÷ 2

= (x0 × y1 - x1 × y0) ÷ 2

公式成立。同理你可以算出其他情況也能符合這個公式。

此處注意:由上面的公式可猜想:任意三角形abc(座標逆時針排序)的面積為1/2*(x0*y1-x1*y2+x1*y2-x2*y1+x2*y0-x0*y2)

設a(x1,y1),b(x2,y2),c(x3,y3) 

由a-->b-->c-->a 按逆時針方向轉。(行列式書寫要求)

設三角形的面積為s

則s=(1/2)*(下面行列式)

|x1 y1 1|

|x2 y2 1|

|x3 y3 1|

s=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1)

即用三角形的三個頂點座標求其面積的公式為:

s=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)

由此可推廣至n邊型,可得如下猜想:

2.假設該公式對於n個頂點的多邊形成立。即:

s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )

再加如第n+1點後,面積s' = s + s△a0anan+1

·s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )

·s△a0anan+1

= 0.5 * ( (x0*yn-xn*y0) + (xn*yn+1-xn+1*yn) + (xn+1*y0-x0*yn+1) )

∴s' = s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*yn+1-xn+1*yn) + (xn+1*y0-x0*yn+1) )

綜上所述,得到公式:s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )

得證!此公式可引申之三維空間:

已知abc三點座標為(x1,y1,z1)(x2,y2,z2),(x3,y3,z3)

則空間sabc=    |x1,y1,z1|  *1/2

|x2,y2,z2|

|x3,y3,z3|

**:

#include #include int main(void)

sum += x[0]*y[2] - x[2]*y[0];

printf("%.1f\n", sum / 2.0);

}return 0;

}

hdu2036 求多邊形面積

已知多邊形的n個頂點座標求其面積。可以選其任意一頂點與其他的頂點連線,把多邊形分割成很多的小三角形。在計算幾何中我們知道,三角形面積可以用其邊向量的叉乘來求,向量的叉乘即是它們座標的行列式。將這個行列式展開就可以得到以三角行頂點座標為引數的面積公式。將所有的小三角形面積都用頂點座標的行列式表示,再展...

hdu 2036 求多邊形面積

hdu2036 向量叉乘 input 輸入資料報含多個測試例項,每個測試例項佔一行,每行的開始是乙個整數n 3 n 100 它表示多邊形的邊數 當然也是頂點數 然後是按照逆時針順序給出的n個頂點的座標 x1,y1,x2,y2.xn,yn 為了簡化問題,這裡的所有座標都用整數表示。輸入資料中所有的整數...

hdoj 2036題解 向量積法求任意多邊形面積

首先看一道hdoj的演算法題 hdoj 2036 改革春風吹滿地 該題題意就是逆時針給出點的座標,求這個多邊形的面積。下面就寫一下如何用向量積法求多邊形面積。上圖說明了如何利用向量求得三角形的面積,下面介紹一下所謂的右手法則 如圖,2個三角形abc,唯一的區別在於上面的三角形abc的標識是逆時針,而...