1 問題描述 2 解決方案2.1 蠻力法給定乙個平面上n個點的集合,它的凸包就是包含所有這些點的最小凸多邊形,求取滿足此條件的所有點。
另外,形象生動的描述:
(1)我們可以把這個問題看作如何用長度最短的柵欄把n頭熟睡的老虎圍起來。
(2)也可以這樣看:請把所討論的點想象成釘在膠合板上的釘子,膠合板代表平面。撐開一根橡皮筋圈,把所有的釘子都圍住,然後啪一聲鬆開手。凸包就是以橡皮圈為邊界的區域。具體示意如下圖1所示:
圖1 用橡皮筋來解釋凸包
使用蠻力法解決此問題比較簡單,具體思想:對於乙個n個點集合中的兩個點p1和
p2,當且僅當該集合中的其它點都位於穿過這兩點的直線的同一邊時,它們的連線就是該集合凸包邊界的一部分,簡言之,p1和
p2就是凸包問題中最小凸多邊形的頂點。對每一對點都做一遍檢驗之後,滿足條件的線段就構成了該凸包的邊界。
此時,根據上面的公式,我們只需要把每個點代入公式ax+by-c,判斷公式計算結果的符號是否全部大於等於
0或者小於等於
0,如果是則是凸包邊界上的點,否則就不是。該演算法的時間效率為0(
n^3)。具體**如下:
package上面定義的點point類**如下:com.liuzhen.chapterthree;
public
class
convexhull
if(judgearray(judge)) }}
point result1 = new
point[len];
for(int m = 0;m < len;m++)
result1[m] =result[m];
return
result1;
}//判斷陣列中元素是否全部大於等於0或者小於等於0,如果是則返回true,否則返回false
public
static
boolean judgearray(int
array)
for(int j = 0;j < array.length;j++)
if(len1 == array.length || len2 ==array.length)
judge = true
;
return
judge;
}public
static
void
main(string args)
}
package執行結果:com.liuzhen.chapterthree;
public
class
point
point(
int x, int
y)
public
void setx(int
x)
public
intgetx()
public
void sety(int
y)
public
intgety()
}
集合a中滿足凸包的點集為:(2,0)
(0,2)
(0,-2)
(-2,0)
演算法筆記 016 凸包問題(Java)
1 問題描述 2 解決方案2.1 蠻力法 給定乙個平面上n個點的集合,它的凸包就是包含所有這些點的最小凸多邊形,求取滿足此條件的所有點。另外,形象生動的描述 1 我們可以把這個問題看作如何用長度最短的柵欄把n頭熟睡的老虎圍起來。2 也可以這樣看 請把所討論的點想象成釘在膠合板上的釘子,膠合板代表平面...
Graham演算法 凸包問題
graham演算法的思路,大概如下 對平面上的點的集合,從中找到有最小的y座標值的點p,然後根據其它點和p的連線與正x軸所成的角度將平面上的點進行排序,排序後,掃瞄從p開始的有序列表,如果所有的這些點都在凸包上,那麼每三個相繼的點,會組成乙個左旋,從另一方面說,如果相繼的三個點,p1,p2,p3,組...
凸包問題 Graham Scan演算法
平面中取一定點a,從a點出發的一條射線am,再選定乙個長度單位和角度的正方向 通常取逆時針方向 對於平面內任意一點b,都可以用有序對 這樣建立的座標系稱為極座標系,定點a稱為極點,射線am稱為極軸,若極座標系中定點a與直角座標系的原點o重合,極座標系中的極軸為直角座標系x軸正半軸,於x軸逆時針成90...