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

2021-08-15 06:12:07 字數 1953 閱讀 1702

首先看一道hdoj的演算法題:hdoj-2036-改革春風吹滿地

該題題意就是逆時針給出點的座標,求這個多邊形的面積。下面就寫一下如何用向量積法求多邊形面積。

上圖說明了如何利用向量求得三角形的面積,下面介紹一下所謂的右手法則:

如圖,2個三角形abc,唯一的區別在於上面的三角形abc的標識是逆時針,而下面的三角形標識是順時針。如果利用向量叉積,由於乘的是向量的絕對值,所以ab與ac在上或者在下是沒有區別的。但是如果不使用絕對值,而是寫成行列式的形式,就要考慮方向的問題了。所以簡單(不負責任)地說,所謂右手法則就是:當逆時針(右手大拇指朝向)方向排列點的時候組成的向量求的的結果是正數,反之是負數。(上面並不是標準解答,關於定義可參考wikipedia)那麼以上2個三角形轉化為行列式的時候就是下圖:

根據行列式的性質,我們也能知道兩者的值是相反的。

既然如此,我們在得到逆時針序的3點座標的情況下,利用行列式即可得到面積。例:

核心**為:

如上圖,任何乙個n邊形都能劃分為n-3個三角形,那麼根據上面的公式,我們逆時針獲取點,就像下圖一樣,令單個三角形的面積和累加即可得到n邊形的面積。

因為右手定則,一定要逆時針。而該題輸入要求就正好是逆時針輸入。並且可以看出:a點恆不變,另兩個點是移動狀態,那麼我們就可以寫出**:

int beginx, beginy, lastx, lasty, x, y;

double ans;

cin >> beginx >> beginy >> lastx >> lasty >> x >> y;

ans = (double)(0.5)*(beginx*lasty + lastx*y + x*beginy - x*lasty - lastx*beginy - beginx*y);

以上**可以得到第乙個三角形abc的面積,下面進入迴圈:

n -= 3;

while (n--)

最終即可得到解ans。

我們上面的例子都是凸邊形,對於凹邊形而言我們仍然可以得到正解,就是因為有右手定則。

如上圖的凹邊形,我們仍然按照逆時針順序來求解,第乙個三角形abc,得到實際上是包括虛線在內的整體面積,那麼第二個三角形acd,可以看到是順時針了,絕對值是有虛線的acd面積,那麼因為是順時針,用行列式求出的值是負數。兩個行列式值相加,正好是大三角形(包括虛線)abc面積減去小三角形acd的面積。得到的仍然是凹邊形的面積。

已ac

#includeusing namespace std;

int main()

printf("%.1lf\n", ans);

}system("pause");

return 0;

}

向量的數量積,向量積,混合積

設兩向量分別為 和 cos 為向量 和 的夾角 通過公式我們可以發現,兩個向量的數量積就是乙個數量。數量積又稱為點積或者內積。ex 在直角座標系 中,設 a1,a2,a3 b1,b2,b3 a1 i a2 j a3 k b1i b2j b3k a1 b1 a2b2 a3b3 即兩向量的數量積之和等於...

向量的外積 向量積

叉乘,也叫向量的外積 向量積。顧名思義,求下來的結果是乙個向量,記這個向量為c。向量c 向量a 向量b a b sin 向量c的方向與a,b所在的平面垂直,且方向要用 右手法則 判斷 用右手的四指先表示向量a的方向,然後手指朝著手心的方向擺動到向量b的方向,大拇指所指的方向就是向量c的方向 因此向量...

HDOJ 2036 求多邊形面積

可以利用多邊形求面積公式 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 ...