【问题标题】:Counterclockwise Convex Hull Algorithm逆时针凸壳算法
【发布时间】:2020-05-15 14:40:37
【问题描述】:

我实现了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);
}

【问题讨论】:

    标签: algorithm polygon


    【解决方案1】:

    只需将数组元素的顺序从第一个索引恢复到末尾即可。例如,如果结果在数组arr[0 .. n]中:

    arr[0] | revert(arr[1 .. n])
    

    【讨论】:

    • 嗯,这是我的第一个想法,但对于更复杂的多边形却失败了。我会调查的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 2016-09-28
    • 2012-03-13
    • 2012-06-28
    • 1970-01-01
    • 2015-02-07
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多