首先看一道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 ...