演算法筆記 016 凸包問題(Java)

2021-07-26 10:55:03 字數 1915 閱讀 8204

1 問題描述

2 解決方案2.1 蠻力法

給定乙個平面上n個點的集合,它的凸包就是包含所有這些點的最小凸多邊形,求取滿足此條件的所有點。

另外,形象生動的描述:

(1)我們可以把這個問題看作如何用長度最短的柵欄把n頭熟睡的老虎圍起來。

(2)也可以這樣看:請把所討論的點想象成釘在膠合板上的釘子,膠合板代表平面。撐開一根橡皮筋圈,把所有的釘子都圍住,然後啪一聲鬆開手。凸包就是以橡皮圈為邊界的區域。具體示意如下圖1所示:

圖1  用橡皮筋來解釋凸包

使用蠻力法解決此問題比較簡單,具體思想:對於乙個n個點集合中的兩個點p1和

p2,當且僅當該集合中的其它點都位於穿過這兩點的直線的同一邊時,它們的連線就是該集合凸包邊界的一部分,簡言之,p1和

p2就是凸包問題中最小凸多邊形的頂點。對每一對點都做一遍檢驗之後,滿足條件的線段就構成了該凸包的邊界。

此時,根據上面的公式,我們只需要把每個點代入公式ax+by-c,判斷公式計算結果的符號是否全部大於等於

0或者小於等於

0,如果是則是凸包邊界上的點,否則就不是。該演算法的時間效率為0(

n^3)。具體**如下:

package

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)

}

上面定義的點point類**如下:

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...