可以利用多邊形求面積公式:
s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )
其中點(x0, y0), (x1, y1), ... , (x
n, yn)為多邊形上按逆時針順序的頂點。
簡要證明:
1.我們先簡單地從三個點入手(包括原點)。
2.假設該公式對於n個頂點的多邊形成立。即:面積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邊型,可得如下猜想:
s = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )
綜上所述,得到公式: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) )
得證!此公式可引申之三維空間:
已知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的標識是逆時針,而...