• 主页
  • 逆时针凸壳算法

逆时针凸壳算法

我实现了Andrew's monotone chain convex hull algorithm。

我得到了这些要点(a, a), (b, b), (c, c), (d, d)

我得到了(b, b), (d, d), (a, a), (c, c)

我需要(b, b), (c, c), (a, a), (d, d)

因此,我的结果从正确的点开始,但随后走向了错误的时钟方向。

这是我实现的示例:

function cross(a, b, o) {
   return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0])
}

/**
 * @param points An array of [X, Y] coordinates
 */
function convexHull(points) {
   points.sort(function(a, b) {
      return a[0] == b[0] ? a[1] - b[1] : a[0] - b[0];
   });

   var lower = [];
   for (var i = 0; i < points.length; i++) {
      while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], points[i]) <= 0) {
         lower.pop();
      }
      lower.push(points[i]);
   }

   var upper = [];
   for (var i = points.length - 1; i >= 0; i--) {
      while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], points[i]) <= 0) {
         upper.pop();
      }
      upper.push(points[i]);
   }

   upper.pop();
   lower.pop();
   return lower.concat(upper);
}

转载请注明出处:http://www.jxbyjx.net/article/20230505/1720199.html