利用向量積(叉積)計算三角形的面積和多邊形的面積


利用向量積(叉積)計算三角形的面積和多邊形的面積:

向量的數量積和向量積:

(1)  向量的數量積

 

(1)  向量的向量積

兩個向量a和b的叉積(向量積)可以被定義為:

在這里θ表示兩向量之間的角夾角(0° ≤ θ ≤ 180°),它位於這兩個矢量 所定義的平面上。

向量積的(長度)可以解釋成以ab為鄰邊的平行四邊形面積求三角形ABC的面積,根據向量積的意義,得到:

a=axi+ayj+azk;

b=bxi+byj+bzk;

a×b=(aybz-azby)i+(azbx-axbz)j+(axby-aybx)k,為了幫助記憶,利用三階行列式,寫成:

計算任意多邊形的面積:(頂點按逆時針順序排列)

求多邊形面積最基礎的方法就是用剖分法來做的,就是把多邊形分成若干個三角形,然后對每個三角形求面積,求面積,在有精度要求的情況下,不要用海倫-秦九昭公式,海倫公式可能在精度損失方面會比較嚴重,而且計算量很大。

最適合解決任意多邊形面積的方法是:向量積法

頂點為Pk(k=1,2,3…n)的多邊形,其頂點坐標分別為(x1,y1),(x2,y2),(x3,y3)…(xn,yn)。

在計算幾何里,我們知道,△ABC的面積就是“向量AB”和“向量AC”兩個向量叉積的絕對值的一半。其正負表示三角形頂點是在右手系還是左手系。


 

 

hdu 2036:改革春風吹滿地(叉積求凸多邊形面積)

改革春風吹滿地

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16308    Accepted Submission(s): 8316

Problem Description
“ 改革春風吹滿地,不會AC沒關系;實在不行回老家,還有一畝三分地。謝謝!(樂隊奏樂)”話說部分學生心態極好,每天就知道游戲,這次考試如此簡單的題目,也是雲里霧里,而且,還竟然來這么幾句打油詩。好呀,老師的責任就是幫你解決問題,既然想種田,那就分你一塊。這塊田位於浙江省溫州市蒼南縣靈溪鎮林家鋪子村,多邊形形狀的一塊地,原本是linle 的,現在就准備送給你了。不過,任何事情都沒有那么簡單,你必須首先告訴我這塊地到底有多少面積,如果回答正確才能真正得到這塊地。發愁了吧?就是要讓你知道,種地也是需要AC知識的!以后還是好好練吧...
 

 

Input
輸入數據包含多個測試實例,每個測試實例占一行,每行的開始是一個整數n(3<=n<=100),它表示多邊形的邊數(當然也是頂點數),然后是按照逆時針順序給出的n個頂點的坐標(x1, y1, x2, y2... xn, yn),為了簡化問題,這里的所有坐標都用整數表示。輸入數據中所有的整數都在32位整數范圍內,n=0表示數據的結束,不做處理。
 

 

Output
對於每個測試實例,請輸出對應的多邊形面積,結果精確到小數點后一位小數。每個實例的輸出占一行。
 

 

Sample Input
  3 0 0 1 0 0 1
  4 1 0 0 1 -1 0 0 -1
  0
Sample Output
0.5
2.0
思路

s=S123+S134+S145+S156+S167+S178
 >在坐標系下,三角形面積公式如下。可按向量思路。
S=(double)(x2*y3+x1*y2+x3*y1-x3*y2-x2*y1-x1*y3)/2.0;
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,x1,x2,x3,y1,y2,y3,i;
 6     double s;
 7     int x[100];
 8     int y[100];
 9     while(scanf("%d",&n)&&n)
10     {
11         s=0;
12         for(i=0;i<n;i++)
13         {
14             scanf("%d",&x[i]);
15             scanf("%d",&y[i]);
16         }
17         x1=x[0];
18         y1=y[0];
19         for(i=1;i<n-1;i++)
20         {
21             x2=x[i];
22             y2=y[i];
23             x3=x[i+1];
24             y3=y[i+1];
25             s+=(double)(x1*y2+x2*y3+x3*y1-x3*y2-x2*y1-x1*y3)/2.0;
26         }
27         printf("%.1lf\n",s);
28     }
29     return 0;
30 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM