什麼是凸包呢?
凸包(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...