我改編了Anderson的單調鏈算法來尋找一個凸包,但是這樣做之後我發現結果點是按x順序的,而不是按照旋轉木馬的順序。是否有一個凸包算法可以按照旋轉木馬的順序生成點,這意味着圍繞船體的外圍排列?在快樂循環順序中生成點的凸殼算法?
這是我的單調鏈實現不滿足我的問題:
// monotone chain
public static ComparablePoint[] convex_hull(ComparablePoint[] points){
if(points.length > 1){
int ctPoints = points.length;
int k = 0;
ComparablePoint[] hull = new ComparablePoint[ 2 * ctPoints ];
java.util.Arrays.sort(points);
// Build lower hull
for (int i = 0; i < ctPoints; ++i) {
while (k >= 2 && crossProduct(hull[k - 2], hull[k - 1], points[i]) <= 0)
k--;
hull[k++] = points[i];
}
// Build upper hull
for (int i = ctPoints - 2, t = k + 1; i >= 0; i--) {
while (k >= t && crossProduct(hull[k - 2], hull[k - 1], points[i]) <= 0)
k--;
hull[k++] = points[i];
}
if (k > 1) {
hull = java.util.Arrays.copyOfRange(hull, 0, k - 1); // remove non-hull vertices after k; remove k - 1 which is a duplicate
}
return hull;
} else if(points.length <= 1){
return points;
} else{
return null;
}
}
要弄清楚我的意思是旋轉木馬輪順序:上凸包的點是在一個周長是一個凸多邊形。當你繞過多邊形的邊界時,我需要這些點。
上面顯示的單調鏈算法不會這樣做,它會按照它們的x座標順序返回點。具有最低x座標的點是第一個,然後是具有第二個最低x的點,依此類推。
如何在沒有建立「軸」的情況下定義旋轉木馬的順序? – user2864740
正常的格雷厄姆掃描可以做到這一點。它以X座標順序給出船體的「底部」和「頂部」部分,所以只需反轉一個或另一個並連接即可。 – Gene
如果感興趣,下面是一個java實現:https://sourceforge.net/p/wpbdc/wpbd/ci/master/tree/src/bridgedesigner/ConvexHullFactory.java – Gene