【发布时间】:2016-07-14 13:23:52
【问题描述】:
我采用了安德森的单调链算法来寻找凸包,但在这样做之后我发现结果点是 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 坐标第二低的点,以此类推。
【问题讨论】:
-
如何在没有一些既定的“轴”的情况下定义旋转木马顺序?
-
普通的格雷厄姆扫描可以做到这一点。它以 X 坐标顺序给出船体的“底部”和“顶部”部分,因此只需反转一个或另一个并连接。
-
如果有兴趣,这里有一个java实现:sourceforge.net/p/wpbdc/wpbd/ci/master/tree/src/bridgedesigner/…
-
@user2864740 凸多边形的美妙之处在于任何内部点都可以。我想 OP 只是说顺时针或逆时针(多边形)顺序。
-
有没有人尝试运行他的代码?!它以旋转木马的顺序给船体。 -__-
标签: algorithm convex-hull