求能夠完全包含平面上n個給定點的凸多邊形。這個問題一般使用快包演算法。
快包思想:
1)將n個點按照x左邊進行排序,找到p1和pn,直線p1->pn將平面上的點分為兩部分s1和s2,成為上包和下包,遞迴的求解這兩部分。
2)如何求s1和s2,這兩部分演算法一樣,以s1為例。如果s1為空,上包就是一p1和pn為端點的線段。如果s1不為空,找到s1中的頂點pmax,它是距離直線p1pn最遠的點。然後該演算法找出s1中所有在直線p1pmax左邊的點,這些點和p1,pmax構成集合s1,1。同理,直線pmaxpn左邊的點和pmax,pn構成集合s1,2。這樣一直遞迴下去,最終就能得到整個集合的上包。
如何求pamx?任何平面上的三個點,p1(x1,y1),p2(x2,y2),p3(x3,y3),那麼三角形的面積等於下面行列式絕對值的二分之一:
|x1 y1 1|
|x2 y2 1| = x1y2 + x3y1 + x2y3 - x3y2 - x2y1 - x1y3
|x3 y3 1|
pmax是面積最大的點。
如何求直線左側的點?當且僅當點p3(x3,y3)位於直線左側時,上面的計算結果為正。使用這個計算公式,可以在固定時間內判斷乙個點是否位於直線的左側。
Graham演算法 凸包問題
graham演算法的思路,大概如下 對平面上的點的集合,從中找到有最小的y座標值的點p,然後根據其它點和p的連線與正x軸所成的角度將平面上的點進行排序,排序後,掃瞄從p開始的有序列表,如果所有的這些點都在凸包上,那麼每三個相繼的點,會組成乙個左旋,從另一方面說,如果相繼的三個點,p1,p2,p3,組...
凸包問題 Graham Scan演算法
平面中取一定點a,從a點出發的一條射線am,再選定乙個長度單位和角度的正方向 通常取逆時針方向 對於平面內任意一點b,都可以用有序對 這樣建立的座標系稱為極座標系,定點a稱為極點,射線am稱為極軸,若極座標系中定點a與直角座標系的原點o重合,極座標系中的極軸為直角座標系x軸正半軸,於x軸逆時針成90...
凸包問題 (用分治演算法)
問題描述 在平面上有n個點,其中任何三個點都不在一條直線上,問如何尋找乙個點集,使得這些點構成的多邊形剛好能把所有點都包進。基本思想 我們採用分治演算法。首先算出這n個點的橫座標中位數,記為x0,畫出直線x x0,將整個平面分成兩部分。我們要做的就是分別求兩部分的凸包,最後再合併即可。利用分治和遞迴...