Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 正交壳算法_Algorithm_Convex Hull_Orthogonal - Fatal编程技术网

Algorithm 正交壳算法

Algorithm 正交壳算法,algorithm,convex-hull,orthogonal,Algorithm,Convex Hull,Orthogonal,我正试图找到一种方法,从一组整数点(由下图中的红点指示)来确定温度。下图显示了我想要实现的目标: 一, 我只需要定义直线多边形边界的最小点集。我能找到的大多数赫尔算法都不满足这个问题的正交性,例如,产生以下结果(这不是我想要的) 二, 如何获得定义图1所示边界的点集 更新: 图1。不再被认为是凸的。根据,创建快速算法相当容易 从最左边的点开始构建上部外壳(如果有很多,则是其中最上面的)。将此点添加到列表中 找到下一个点:在两个坐标严格大于当前点的所有点中,选择x坐标最小的点。将此点添加到列表

我正试图找到一种方法,从一组整数点(由下图中的红点指示)来确定温度。下图显示了我想要实现的目标:

一,

我只需要定义直线多边形边界的最小点集。我能找到的大多数赫尔算法都不满足这个问题的正交性,例如,产生以下结果(这不是我想要的)

二,

如何获得定义图1所示边界的点集

更新:

图1。不再被认为是凸的。

根据,创建快速算法相当容易

  • 从最左边的点开始构建上部外壳(如果有很多,则是其中最上面的)。将此点添加到列表中
  • 找到下一个点:在两个坐标严格大于当前点的所有点中,选择x坐标最小的点。将此点添加到列表中并继续
  • 尽可能继续在步骤2中添加点
  • 从最右边的点(其中最上面的点)重复相同的步骤,但要向左。也就是说,每次选择下一个y大x小的点,x的差值必须最小
  • 合并步骤3和步骤4中得到的两个列表,就得到了上外壳
  • 类似地,对下部壳体执行相同的步骤1-5
  • 合并在步骤5和6中找到的上外壳和下外壳
  • 为了快速找到下一个点,只需按x坐标对点进行排序。例如,在构建第一个右上链时,按x递增进行排序。然后迭代所有点。对于每个点,检查其y坐标是否大于当前值。如果是,请将该点添加到列表中并使其成为当前点

    排序的总体复杂度为O(N logn)

    编辑:上面的描述仅显示如何跟踪外壳的主要顶点。如果希望有一个完整的直线多边形(连续点之间有线段),则每次找到下一个点时,都必须向链中添加一个附加点。例如,在构建右向上链时,如果从当前点(x1,y1)找到一个点(x2,y2),则必须将(x2,y1)和(x2,y2)添加到当前链列表中(按此顺序)。

    遵循,创建快速算法相当容易

  • 从最左边的点开始构建上部外壳(如果有很多,则是其中最上面的)。将此点添加到列表中
  • 找到下一个点:在两个坐标严格大于当前点的所有点中,选择x坐标最小的点。将此点添加到列表中并继续
  • 尽可能继续在步骤2中添加点
  • 从最右边的点(其中最上面的点)重复相同的步骤,但要向左。也就是说,每次选择下一个y大x小的点,x的差值必须最小
  • 合并步骤3和步骤4中得到的两个列表,就得到了上外壳
  • 类似地,对下部壳体执行相同的步骤1-5
  • 合并在步骤5和6中找到的上外壳和下外壳
  • 为了快速找到下一个点,只需按x坐标对点进行排序。例如,在构建第一个右上链时,按x递增进行排序。然后迭代所有点。对于每个点,检查其y坐标是否大于当前值。如果是,请将该点添加到列表中并使其成为当前点

    排序的总体复杂度为O(N logn)

    编辑:上面的描述仅显示如何跟踪外壳的主要顶点。如果希望有一个完整的直线多边形(连续点之间有线段),则每次找到下一个点时,都必须向链中添加一个附加点。例如,在构建右向上链时,如果从当前点(x1,y1)找到一个点(x2,y2),则必须将(x2,y1)和(x2,y2)添加到当前链列表中(按此顺序)。

    遵循,创建快速算法相当容易

  • 从最左边的点开始构建上部外壳(如果有很多,则是其中最上面的)。将此点添加到列表中
  • 找到下一个点:在两个坐标严格大于当前点的所有点中,选择x坐标最小的点。将此点添加到列表中并继续
  • 尽可能继续在步骤2中添加点
  • 从最右边的点(其中最上面的点)重复相同的步骤,但要向左。也就是说,每次选择下一个y大x小的点,x的差值必须最小
  • 合并步骤3和步骤4中得到的两个列表,就得到了上外壳
  • 类似地,对下部壳体执行相同的步骤1-5
  • 合并在步骤5和6中找到的上外壳和下外壳
  • 为了快速找到下一个点,只需按x坐标对点进行排序。例如,在构建第一个右上链时,按x递增进行排序。然后迭代所有点。对于每个点,检查其y坐标是否大于当前值。如果是,请将该点添加到列表中并使其成为当前点

    排序的总体复杂度为O(N logn)

    编辑:上面的描述仅显示如何跟踪外壳的主要顶点。如果希望有一个完整的直线多边形(连续点之间有线段),则每次找到下一个点时,都必须向链中添加一个附加点。例如,在构建右向上链时,如果从当前点(x1,y1)找到一个点(x2,y2),则必须将(x2,y1)和(x2,y2)添加到当前链列表中(按此顺序)。

    遵循,创建快速算法相当容易

  • 从最左边的点开始构建上部外壳(如果有很多,则是其中最上面的)。添加此点