有向面積


首先先討論一下,對於一個三角形如何求面積:

 

很明顯,S = |b| * |c| * |sinA| / 2 = | b × c | / 2;

學過叉積的都懂,由三角形的兩個邊向量就可以求出面積, 那么對於一個多邊形呢(不規則的那種):

可以分解為S△ABC+S△ACD+S△ADE+S△AEF;

這個假如分解出來的話,單純的看面積會重復算S△ABC,所以引入有向面積的概念;

簡單點說,回到三角形的問題上,三角形的面積能夠用叉積來表示,但是這個叉積是取模的,現在順時針讀取多邊形的頂點來構造三角形,將他們的叉積相加,就能得到這個多變性的總面積了。

比如上圖,S△ABC + S△ACD + S△ADE中,△ABC的叉積是和另外兩個相反的,正好可以抵消掉,最后結果取模就是多邊形的面積。

 

 

例如HDU2036

#include<iostream> #include<cstdio> #include<string.h> #include<math.h> #include<string> #include<map> #include<set> #include<vector> #include<algorithm> #include<queue> #include<iomanip>
using namespace std; struct P{ int x; int y; }; P p[105]; double area(int a) { int b = a-1; return (p[b].x*p[a].y-p[a].x*p[b].y)-(p[0].x*p[a].y-p[a].x*p[0].y)+(p[0].x*p[b].y-p[b].x*p[0].y); } int main() { int n; while(cin >> n){ if(n==0) break; for(int i=0;i<n;i++) cin >> p[i].x >> p[i].y; double sum = 0; for(int i=2;i<n;i++){ sum += 1.0/2.0*area(i); } cout << fixed << setprecision(1) << sum << endl; } return 0; }

 


免責聲明!

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



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