日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求任意多边形面积

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求任意多边形面积 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

其實求多邊形面積有許多的方法,這里介紹一個計算幾何的方法,比較神奇,只有O(n)的復雜度。
說道計算幾何中的神奇方法,就不得不說到向量(又叫矢量,不過這個名詞有歧義)。

向量(大佬跳過)


其實,像這種概念問題,大家都可以去問一下我度娘,還挺詳細的。

簡介

數學中的向量只有兩個值,一個方向,一個大小,于是不論怎么平移,它不會有任何改變。不過,這樣子表示向量的話,它的用處就太小了。但是,當我們讓向量都從一點出發的話,它的意義就很多了,能夠做一些奇奇怪怪的事情。所以在計算機算法里,其中有這樣一個表示向量的方法:一般都默認一個向量是從原點出發的,把它另一個端點的坐標記下來。

向量有幾個基本運算:加、減、點積、叉積。關于其數學計算方法(計算機中次要)以及幾何意義(非常重要),大家請自行去百度吧。

接下來會簡單介紹一下以上述記錄向量的方法進行基本運算

加減法

加減其實特簡單,了解一下基本性質之后(或者百度向量后,看一下加減法的圖示,這里就懶一點,不搬運了),特別好推,絕對秒出公式。

點積

兩個向量的叉積只會返回一個值,而不是一個向量。其幾何意義差不多是下面這樣 ,有一個向量 a?\vec{a}a 為BC,還有一個向量 b?\vec{b}b為BC。那么,a?\vec{a}a與點積b?\vec{b}bSΔ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

總結

以上是生活随笔為你收集整理的求任意多边形面积的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。