平面凸包 學習筆記

2021-08-19 19:12:17 字數 1746 閱讀 7184

什麼是平面凸包?

平面凸包(以下簡稱「凸包」)是指覆蓋平面上n個點的最小凸多邊形。形象來說就是把n個點看成n根柱子,用橡皮筋去緊框住這n根柱子,最後形成的拉緊的多邊形就是要求的凸包。

怎麼求平面凸包?

1.jarvis演算法

首先我們需要了解凸包的數學構造法:找一條直線l過其中一點(記為a)並且其他所有點都在l的同側,則a必為凸包上的一點。那麼我們以a為起點,讓直線以a為中心繞著同乙個方向旋轉,碰到的第乙個點也在應凸包上(記為b),如果同時碰到多個點,則取距離a最遠的那個,然後開始以b為中心繼續繞同乙個方向旋轉,重複此過程直到再次碰到a點,就求出了凸包。而因為計算機無法模擬旋轉的過程,每次旋轉我們實際上需要對所有點用向量進行檢驗,時間複雜度為o(

n)o (n

),一共要進行凸包上點數次旋轉(假設點數為m),所以總時間複雜度為o(

nm) o(n

m)

,顯然這個時間複雜度不夠優秀,在極端情況下甚至會達到o(

n2) o(n

2)

。所以這種方法僅作為乙個鋪墊,我們主要掌握後面一種方法。

2.graham演算法

首先我們按jarvis的思路找到凸包上的乙個點(這裡取按第一關鍵字為x,第二關鍵字為y從小到大排序得到的第乙個點),然後對剩下的點進行排序,設定乙個候選點的堆疊s,依次掃瞄每個點,當棧中第二個元素需要逆時針旋轉或者不旋轉才能從棧頂到達這個點時,棧頂一定不在凸包上(我們取一直旋轉的方向為順時針),彈出棧頂,重複此過程知道不滿足條件,最後將這個點入棧即可。這樣每個點只會被操作一次,時間複雜度為o(

n)o (n

),排序時間複雜度為o(

nlog

n)o (n

logn

),所以總時間複雜度為o(

nlog

n)o (n

logn

),比jarvis要優秀不少。

例題:

洛谷p2742 [usaco5.1]圈奶牛fencing the cows

這是一道模板題。

**:

#include 

using

namespace

std;

const

int maxn=10100;

struct point

; }

}p[maxn];

int sta[maxn];

int n,top;

double

operator*(point a,point b)

double dist2(point a,point b)

bool judgeonleft(point p0,point p1,point p2)

bool cmp(point a,point b)

int main()

top--;

double ans=0;

for(int i=1;i<=top;i++)

printf("%.2lf\n",ans);

return

0;

}

平面凸包的應用:

平面凸包可以說是求解計算幾何問題的準備工作,很多問題都要在凸包上進行操作,而有些計算幾何的演算法也是建立在凸包的基礎上的。具體的內容會在之後的學習筆記和題解中講解。

平面凸包 Jarvis

覆蓋平面上n個點的最小凸多邊形 形象來講就是平面上有n個柱子,把一根封閉的彈性繩套上這些柱子,繩子繃緊以後形成的多邊形就是我們要求的凸包.1.斜率逼近法,不好寫而且很慢,不予介紹。2.jarvis演算法 3.graham演算法 第三個是基於對第二個的優化。本文主要介紹jarvis演算法,graham...

凸包學習筆記

凸包 凸包 convex hull 是乙個計算幾何 圖形學 中的概念。在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用x內所有點 x1,xn 的線性組合來構造.在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。用不嚴謹的話來講,給定二維平面上...

學習筆記 凸包

想學斜率優化,先把先決條件凸包給肝了。然後完全不懂,於是就咕了。順便看了一下線代 其實並不會 講真這東西耗了我半個暑假 20210305更新 po學了向量回來了發現這寫的什麼玩意,已更新完畢,您可從更新部分跳至凸包部分。同時,原 前置知識 叉積 部分已棄用並放置於最後。目錄更新 以下內容大部分在人教...