凸包問題求解

2021-09-24 17:17:30 字數 2190 閱讀 9391

什麼是凸包呢?

凸包(convex hull)是乙個計算幾何(圖形學)中的概念。

在乙個實數

向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用x內所有點(x1,...xn)的凸組合來構造.

在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。

用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊形,它能包含點集中所有的點。

我們的任務就是在這一系列點當中找到那樣乙個點集,就是凸包問題的解

做法如下:

先對所有給的點集進行排序,先按照x座標排序,如果x相同再按照y排序,找出最左下的點,利用之前寫好的乙個函式:calculatebearingtopoint,然後找到所有點中跟這個點夾角最小的點,一直到最右面的乙個點,然後此時判斷條件需要特殊加一項:夾角需要大於180度,直到又回到最初的點,便可以獲得凸包集合。

具體**如下:

calculatebearingtopoint:

public static double calculatebearingtopoint(double currentbearing, int currentx, int currenty,

int targetx, int targety)

else if(currentbearing <= 90)

}else if(headx < 0)

else if(currentbearing <= 270) }}

angle = (math.atan((double)headx/heady))*180/math.pi;

if(angle > 0)

else if(headx<0)

}else if(angle == 0)

else

}else else

}if(currentbearing <= angle)

else

}catch(exception e)

}

凸包問題主演算法convexhull:

public static setconvexhull(setpoints) 

point poi = new point[length];

int i = 0;

while(it.hasnext())

for (int j = 0; j < length - 1; j++) }}

double max = poi[length-1].x();

int j = 0;

while(true)

j++;

}point tmp = poi[j];

poi[j] = poi[0];

poi[0] = tmp;

point end = poi[0];

conhull.add(poi[0]);

int flag = 0;

int flag2 = 0;

while(true)

else if(angle == calculatebearingtopoint(0.0, (int)poi[0].x(), (int)poi[0].y(), (int)poi[k].x(), (int)poi[k].y()))

}}else if(flag2 == 1)

else if(((calculatebearingtopoint(0.0, (int)poi[0].x(), (int)poi[0].y(), (int)poi[k].x(), (int)poi[k].y()) >= 180.0)&&angle == calculatebearingtopoint(0.0, (int)poi[0].x(), (int)poi[0].y(), (int)poi[k].x(), (int)poi[k].y()))) }}

}if(poi[flag].x() == max)flag2 = 1;

if(poi[flag] == end)break;

conhull.add(poi[flag]);

tmp = poi[flag];

poi[flag] = poi[0];

poi[0] = tmp;

}return conhull;

}catch(exception e)

}

按照上述程式執行即可求得凸包。

尋找最遠點對(凸包求解)

td走廊裡有一關 勇闖梅花樁 水面上稀稀落落地立著幾根柱子。nova君自認為輕功不錯,覺得可以在任意兩根柱子之間跳躍,現在他想挑戰一次跨越距離最遠的兩根柱子。請問,最遠距離是多少?由於木樁以橫縱座標形式給出,為了計算方便,避免求平方根,答案只需給出距離的平方即可 多組測試資料 組數不超過10 對於每...

凸包問題 Graham Scan

graham scan 概述 對於凸多邊形的定義不在這裡做詳細敘述,這裡給出演算法的實現原理。step 1 找出x值最小的點的集合,從其中找出y值最小的點作為初始點 step 2 獲得新序列後,p n p 1 step 3 把p 0 p 1 p 2 放入乙個棧,從i 3迴圈到i n 1,取棧頂兩個元...

二維凸包求解(Andrew演算法 )

andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積為負值 就刪除一些點,使得又能夠維持凸的形態。這時就會發現,處理各個點需要按照x從左往右的順序,排序即可 當然,這只是處理了下凸的乙個凸殼,倒過來再刷一次,就得到了整個凸包 include...