求任意多边形面积
其實求多邊形面積有許多的方法,這里介紹一個計算幾何的方法,比較神奇,只有O(n)的復雜度。
說道計算幾何中的神奇方法,就不得不說到向量(又叫矢量,不過這個名詞有歧義)。
向量(大佬跳過)
其實,像這種概念問題,大家都可以去問一下我度娘,還挺詳細的。
簡介
數學中的向量只有兩個值,一個方向,一個大小,于是不論怎么平移,它不會有任何改變。不過,這樣子表示向量的話,它的用處就太小了。但是,當我們讓向量都從一點出發的話,它的意義就很多了,能夠做一些奇奇怪怪的事情。所以在計算機算法里,其中有這樣一個表示向量的方法:一般都默認一個向量是從原點出發的,把它另一個端點的坐標記下來。
向量有幾個基本運算:加、減、點積、叉積。關于其數學計算方法(計算機中次要)以及幾何意義(非常重要),大家請自行去百度吧。
接下來會簡單介紹一下以上述記錄向量的方法進行基本運算
加減法
加減其實特簡單,了解一下基本性質之后(或者百度向量后,看一下加減法的圖示,這里就懶一點,不搬運了),特別好推,絕對秒出公式。
點積
兩個向量的叉積只會返回一個值,而不是一個向量。其幾何意義差不多是下面這樣 ,有一個向量 a?\vec{a}a 為BC,還有一個向量 b?\vec{b}b為BC。那么,a?\vec{a}a與點積b?\vec{b}b為SΔABCDS\Delta ABCDSΔABCD ,就是Ax?By?Ay?BxAx\cdot By-Ay\cdot BxAx?By?Ay?Bx,(注意,不符合交換律)
叉積
叉積返回值是一個向量,大小為點積,方向符合右手螺旋定理,垂直于另外兩向量,也就是說叉積運算是三維中的概念(不符合交換律)
計算面積
思路
比如下面這個:
相信一些眼尖的讀者已經發現了,這個多邊形上的點都連了一條到原點的線段,相鄰兩點間的連線與兩點和原點的連線構成了8個三角形(多邊形共八條線段),如果把其中一些三角形的面積加起來,再減掉另一些三角形的面積,就是所求多邊形的面積!而且與原點位置什么都無關!
所以我們只要判斷哪些三角形加上,哪些三角形減去即可!至于怎么判斷,相信我,向量會自動幫你做這件事。
下面上代碼
代碼
先上個C++的吧
//輸入必須是將點按順序輸入,順時還是逆時程序會處理的 #include<cstdio> using namespace std; double ans; int n; struct Point{int x,y; }a[1000000]; int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();return ret*f; } int main(){n=read();//共n個點 for(int i=1;i<=n;i++) a[i]=(Point){read(),read()};for(int i=2;i<=n;i++)ans+=(double)(a[i].x*a[i-1].y-a[i].y*a[i-1].x)/*記得求平行四邊形面積公式嗎*//2.0;//求三角形面積。全加起來就好了,因為...面積有方向(正負性),自己會消掉的 ans+=(double)(a[1].x*a[n].y-a[1].y*a[n].x)/2.0;//第1和第n個點單獨處理 if(ans<0.0) ans=-ans;//順時針與逆時針輸入結果互為相反數 printf("%lf",ans);return 0; }好長時間沒寫Python了,幾乎忘光了,沒事干就寫了一個Python版的代碼(可能非常啰嗦),就不掛注釋了。
x=[1] y=[1] ans=0 n=0 n=input() for i in range(1,n+1):x.append(0)y.append(0)x[i],y[i] = [int(j) for j in raw_input().split()] for i in range(2,n+1):ans=ans+(float)(x[i]*y[i-1]-x[i-1]*y[i])/2.0 ans=ans+(float)(x[1]*y[n]-x[n]*y[1])/2.0 if ans<0:ans=-ans print ans總結
- 上一篇: 鸿蒙对象关系映射数据库
- 下一篇: 舒亦梵:4.24非农周大数据即将来临,黄