计算几何(ComputationalGeometry).doc
計算幾何(Computational Geometry)
計算幾何,顧名思義就是用計算機來解幾何問題,而這些幾何問題一般來說只會包含一些基本的幾何元素,像是點、線段、多邊形等等。而在做這類題目時,常常需要用到一些數學的工具,所以我們就先來看一些基本的工具。
點
設兩個點和
則的長度 =,向量AB =
向量內積
設兩個向量和的夾角為θ
則內積,內積為0表示兩個向量垂直。
向量外積
設兩個向量和的夾角為θ
則外積值為
外積為0表示兩向量平行,為正代表B在A的逆時針方向,而外積的絕對值為兩向量所張成的平行四邊形面積。
有了這些工具後,我們就可以來看一些基本的問題了。
※例題1 ─ 給定一條直線的線上兩點P,Q,以及另外兩個點A,B,請你判斷A,B是否在直線的不同側?
※例題2 ─ 給你一個線段以及一個點,試判斷此點是否在線段上。
※例題3 ─ 給你兩條線段以及,請你判斷這兩條線段是否相交。
這一題自然是可以直接用解析法,就是直接將兩直線方程式列出後聯立解,然後再來判斷交點在不在線段上。但是缺點是因為要用到除法,會有浮點數誤差。所以我們希望能有一個方法,當點的座標都是整數時,可以完全不用浮點數計算的方法。
於是就有了這個方法:若在不同側且在不同側,或者若某個點在相對的另一條線段上,那麼線段相交。這樣可以只用到加減乘和比較就可以判斷兩線段有沒有交點。
多邊形
多邊形是由一些線段所組成的封閉折線。如果多邊形上的任兩條邊皆不相交,那麼此多邊形稱為單純多邊形。一個單純多邊形當中,如果任意兩點之連線線段皆全部落在多邊形內,那麼我們稱這樣的多邊形為凸多邊形。
在座標平面上計算多邊形的面積有簡單的公式可算。若一個多邊形的點按照逆時針順序為,並令。那麼此多邊形的面積為:
※例題4 ─ The Art Gallery ( ACM 10078 )
給你一個多邊形,請問它是不是一個凸多邊形?
※例題5 ─ Polygons ( ACM 634 )
給你一個多邊形和一個點,請問這個點在多邊形的外部、邊上還是內部?
掃描法
掃瞄法也是一種計算幾何上常用的手段,通常是先將所有東西依某個特定的順序排序後,按照順序處理。
※例題6 ─ 平面上有n個點,我們說一個點(a,b)是”極大的”,表示其他n-1個點中不存在滿足x≧a、y≧b的點(x,y),請找出所有極大的點。
※例題7 ─ 給你平面上的n條線段,請問這n條線段是否有兩條相交?
※例題8 ─ Birthday Cake ( ACM 10167 )
給你n個草莓的位置,草莓的座標皆為整數,請你畫一條直線過(0,0),並且讓兩邊的草莓數量相同。
※例題9 ─ 下界函數 ( TIOJ 1148 )
第一象限上有一些線段,請問躺在x軸往上看,能看到多少線段?
凸包
平面上有一些點,我們可以找到一個最小的凸多邊形,使得這些點都在這個凸多邊形的邊上或內部,我們把這個凸多邊形叫做這些點的凸包。
計算凸包的方法有很多種,底下介紹其中兩種常用的方法:
Graham’s scan
顯然,所有點中y座標最小(如果y座標相同則x座標最小)的點一定為凸包的頂點。
於是我們以這點為基準,將所有點以逆時針方式加入一個堆疊中,並且在過程中保持堆疊內的點是目前處理過的點的凸包,以下是虛擬碼:
Graham-Scan(Q)
令p0表示Q中y座標最小的點,若有許多選擇那麼選x座標最小的點。
將其他的點X依照與p0X並且與正x軸夾角的大小由小至大排序(可利用外積來比較),令為。
Push(p0, S) //將p0放進堆疊S中,一開始S為空
Push(p1, S)
Push(p2, S)
for i ← 3 to m
do while 從堆疊中第二個點經過堆疊中最上面的點轉向至pi時非左轉
do Pop(S) //將最上面的點拿出
Push(pi, S)
return S
這樣的時間複雜度為O(nlgn)。
Jarvis’s march
基本想法為以禮物包裝的方式。從底部的頂點p0開始,分成左邊和右邊處理。處理右邊時,找到一個點p1使得p0p1與x軸夾角最小,顯然p1也屬於凸包;以相同方式繼續尋找下一個點,直到找到的pk是Q中最高的點為止,左邊也用類似的方式處理即可。令h為凸包上頂點的總數,那麼這個演算法的複雜度為O(nh)。
※例題10 ─ 最遠距離點對問題
給你平面上n個點,請找出距離最遠的兩個點。
※例題11 ─ 最小外接矩形問題
給你平面上n個點,請找出能蓋住這n個點的最小矩形。
※例題12 ─ 運河 ( TIOJ 1041 )
平面上有一些紅色點和一些藍色點,請你畫兩條平行線將兩種顏色的點分開,而且平行線之間距離越大越好,請問這個距離最大是多少?
皮克定理
我們定義格子點為x和y座標都是整數的點,皮克定理告訴我
原创力文档

文档评论(0)