今天我們要涉及計算幾何中的凸包。凸包(convex hull)是乙個計算幾何(圖形學)中的概念。
凸包這個東西,我們其實並不陌生,因為在斜率優化的時候我們就需要用到凸包來進行輔助。但是今天講的是怎麼求出凸包。
在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用x內所有點(x1…xn)的凸組合來構造.
在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。
那麼首先給出凸包的正式定義:
對於乙個集合d,所有包含d的凸集之交稱為d的凸包。用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊形,它能包含點集中所有的點。
那麼我們怎麼求凸包呢?首先有的就是暴力窮舉的想法。我們今天介紹的是一種更為優秀的方法:graham掃瞄法。
在知道這種方法前,我們需要知道乙個概念:向量的叉積。
向量的叉積
向量(向量)的叉積在數學,物理(又名叉乘),資訊學中都有重要的應用。比如物理裡面的力矩,就等於f向量叉乘上r向量。向量叉積的表示式為a⃗
∗b⃗ ∗
cos(
φ)a →∗
b→∗c
os(φ
),方向用右手螺旋定則判定。而如果我們將兩個向量對應到平面極座標上,那麼若向量a為點(a,b),向量b為點(c,d),那麼a和b的叉積為(a
∗d−b
∗c) (a∗
d−b∗
c)。我們發現當向量叉積為正時,向量a的幅角小於向量b的幅角。於是我們可以用向量的叉積判斷兩個向量的角度關係。
關於精度問題
由於double型別精度上還是存在一點問題,所以我們在a==b
時要寫成fabs(a-b)
<
,>
,<=
,>=
<
,>
,<=
,>=
同理。graham掃瞄法
首先我們可以立即發現凸包乙個性質:所有點中最左下角的點一定是凸包上的點。那麼我們就按所有點與最左下角的點(後文稱為p0
p
0)構成的向量的幅角的角度排序,如下圖:
然後按照排序順序根據相鄰兩邊的拐向開始貪心。由於凸包的性質,每次拐都不能使叉積小於0。
具體實現可以利用乙個棧存下當前的凸包上的點,每次取棧頂兩個點和新的點進行拐向判斷就行了。
計算幾何 凸包
有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面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 極角排序耗時 先取出乙個端點,必須為凸包上的乙個點,取最下且最右的點即可 以端點進...