計算幾何凸包入門詳解

2021-09-26 06:10:19 字數 1307 閱讀 2682

講這個之前,先說一下我自己的看法

求凸包網上有很多種方法,個人覺得最好用最常用的就是graham掃瞄法,本篇博文我也就只講這一種演算法求解凸包。

講這個問題之前我們必須要弄清楚何為凸包?

我來口胡一下吧,很明顯凸包這個名詞就已經給了我們乙個重要的資訊,那就是這個東西它肯定是乙個凸多邊形。那除了是凸多邊形外它還有什麼特點呢?請往下看

凸包:用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊形,它能包含點集中所有的點。

(這樣定義應該很準確了吧,它是凸的而且能包含所有的點)

接下來要討論的問題就是怎麼求凸包呢?

graham掃瞄法閃亮登場!!!

為什麼說這個演算法很優秀呢?因為它可以在o(nlogn)的複雜度內解決這個問題

個人覺得graham掃瞄法的關鍵便是極角排序

又是乙個新名詞,我們先詳細講解一下什麼是極角排序吧

口胡一下:

一、找到最左小角的點p0(毋庸置疑這個點一定在凸包上)

二、剩餘所有點都以這個點為原點按一定角度排序

實現**:

bool _cmp(point p1,point p2)
學會凸包必須掌握極角排序,我找了一道例題讓大家練習一下 本人部落格鏈結

極角排序之後,我們就可以通過乙個單調棧來模擬一下,單調棧裡記錄的點一定是以極角逐漸增大的順序記錄的。(對單調棧不熟悉的同學自己去學一下,本人部落格也有一些比較好的單調棧例題)

來個動態圖模擬一下找凸包的過程,比較直觀

**展示:

void graham(int n)

}swap(list[k],list[0]);

sort(list+1,list+n,_cmp);//極角排序

if(n==1)

if(n==2)

stack[0]=0; stack[1]=1; top=2;

for(int i=2;i1 &&sgn((list[stack[top-1]]-list[stack[top-2]])^(list[i]-list[stack[top-2]]))<=0)

top--;

stack[top++]=i;

}}

最後給出一道凸包的模板題,大家可以去練練手 本人部落格鏈結

有不好的地方,請多多指正!!!

計算幾何 凸包

有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...

計算幾何 凸包

如求凸包周長 include include include include include include using namespace std define pi 3.1415926 define eps 1e 10 class point 建立point類,裡面包含很多point的運算子 定...

計算幾何 凸包

凸多邊形 任意兩個頂點的連線都在多邊形內部,這樣的多邊形稱為凸多邊形 凸包的定義 乙個凸多邊形的頂點的集合 求凸包的一般形式 給出乙個點集,求出覆蓋所有點的最小凸多邊形 graham演算法 時間複雜度 o nlogn 極角排序耗時 先取出乙個端點,必須為凸包上的乙個點,取最下且最右的點即可 以端點進...