初学计算几何(四)——初识凸包
前言
學(xué)習(xí)過了多邊形的一些相關(guān)內(nèi)容,總算可以開始學(xué)習(xí)凸包了。
這篇博客主要介紹如何在給出的點(diǎn)集中求出凸包。
關(guān)于凸包面積可以參考初學(xué)計算幾何(三)——多邊形的簡單操作中的多邊形面積的求法。
排序
求凸包的第一步便是將點(diǎn)集按照這個方法進(jìn)行排序:
inline bool operator < (Vector A,Vector B) {return fabs(A.x-B.x)>eps?A.x<B.x:A.y<B.y;}這應(yīng)該還是比較好理解的吧,就是以\(x\)坐標(biāo)為第一關(guān)鍵字,以\(y\)坐標(biāo)為第二關(guān)鍵字進(jìn)行排序。
接下來的步驟
顯然,排完序后得到的第一個點(diǎn)和最后一個點(diǎn)肯定在凸包內(nèi)。
每次要加入一個新的點(diǎn),如果已加入點(diǎn)數(shù)大于\(1\),我們將當(dāng)前點(diǎn)\(p\)與最后加入的點(diǎn)\(S_n\)比較,如果\(\vec{S_{n-1},S_n}\)不在\(\vec{S_{n-1},p}\)左邊,我們就可以將\(S_n\)彈出。
不斷重復(fù)該過程,直到無法繼續(xù)彈出了,我們再將點(diǎn)\(p\)加入凸包中。
然后倒著執(zhí)行一遍類似的操作即可。
具體實(shí)現(xiàn)見代碼:
inline ConvexHull GetConvexHull(Polygon S) {register int i,t;register ConvexHull res;for(sort(S.p+1,S.p+S.n+1),i=1;i<=S.n;++i)//先排一遍序{while(res.n>1&&dcmp(Cro(res.p[res.n]-res.p[res.n-1],S.p[i]-res.p[res.n-1]))<=0) --res.n;//將不滿足條件的點(diǎn)彈出res.p[++res.n]=S.p[i];//將當(dāng)前點(diǎn)加入凸包中}for(t=res.n,i=S.n-1;i;--i)//倒著執(zhí)行一遍類似的操作{while(res.n>t&&dcmp(Cro(res.p[res.n]-res.p[res.n-1],S.p[i]-res.p[res.n-1]))<=0) --res.n;res.p[++res.n]=S.p[i];}return res; }后記
關(guān)于如何求凸包的內(nèi)容大致就是這些吧。
個人認(rèn)為還是比較好理解的。
這里有一道例題:【UVA10652】Board Wrapping。
轉(zhuǎn)載于:https://www.cnblogs.com/chenxiaoran666/p/ConvexHull.html
總結(jié)
以上是生活随笔為你收集整理的初学计算几何(四)——初识凸包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 河南省第十一届ACM程序设计竞赛 修路
- 下一篇: android第三次作业