Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Python 动态和/或静态直线/正交/X-Y凸包_Python_Performance_Algorithm_Convex - Fatal编程技术网

Python 动态和/或静态直线/正交/X-Y凸包

Python 动态和/或静态直线/正交/X-Y凸包,python,performance,algorithm,convex,Python,Performance,Algorithm,Convex,我正在寻找一种处理2D动态图像的有效算法 我已经编写了一个静态算法,但是虽然它在大多数情况下都能工作,但它根本不能工作,所以我也在寻找静态直线凸包的资源。维基百科上有一些关于算法的研究论文,但我无法访问。因此,寻找其他来源或帮助编写代码 任何帮助都将不胜感激,Python算法,非常感谢 当前静态代码: def stepped_hull(points, is_sorted=False, return_sections=False): # May be equivalent to the o

我正在寻找一种处理2D动态图像的有效算法

我已经编写了一个静态算法,但是虽然它在大多数情况下都能工作,但它根本不能工作,所以我也在寻找静态直线凸包的资源。维基百科上有一些关于算法的研究论文,但我无法访问。因此,寻找其他来源或帮助编写代码

任何帮助都将不胜感激,Python算法,非常感谢

当前静态代码:

def stepped_hull(points, is_sorted=False, return_sections=False):
    # May be equivalent to the orthogonal convex hull

    if not is_sorted:
        points = sorted(set(points))

    if len(points) <= 1:
        return points

    # Get extreme y points
    min_y = min(points, lambda p:p[1])
    max_y = max(points, lambda p:p[1])

    points_reversed = list(reversed(points))

    # Create upper section
    upper_left = build_stepped_upper(points, max_y)
    upper_right = build_stepped_upper(points_reversed, max_y)

    # Create lower section
    lower_left = build_stepped_lower(points, min_y)
    lower_right = build_stepped_lower(points_reversed, min_y)

    # Correct the ordering
    lower_right.reverse()
    upper_left.reverse()

    if return_sections:
        return lower_left, lower_right, upper_right, upper_left

    # Remove duplicate points
    hull = OrderedSet(lower_left + lower_right + upper_right + upper_left)
    return list(hull)

def build_stepped_upper(points, max_y):
    # Steps towards the highest y point

    section = [points[0]]

    if max_y != points[0]:
        for point in points:
            if point[1] >= section[-1][1]:
                section.append(point)

            if max_y == point:
                break
    return section

def build_stepped_lower(points, min_y):
    # Steps towards the lowest y point

    section = [points[0]]

    if min_y != points[0]:
        for point in points:
            if point[1] <= section[-1][1]:
                section.append(point)

            if min_y == point:
                break
    return section
def stepped_hull(点,已排序=False,返回部分=False):
#可以等价于正交凸包
如果未排序:
点=已排序(设置点))
如果len(点)=截面[-1][1]:
第节追加(点)
如果max_y==点:
打破
返回段
def build_stepped_lower(点,最小值):
#向最低y点移动的步骤
节=[点[0]]
如果最小!=分数[0]:
对于点到点:

如果要实现正确的算法,请参见第[1]点。对于直线凸包的动态维护,最好是寻找动态数据结构来维护集合的极大值,这是一个研究较多的课题。点集的最大元素集是直线凸包的顶点集,因此这两个问题是等价的


您可以在中找到每个操作花费$O(\log n)$时间的算法。

通过动态,您的意思是要维护一个x-y凸包,在该凸包中,它的点在程序执行过程中被修改?你是说你的静态算法可以工作,但它无法更新凸面外壳,还是在其他方面失败了?基本上,我想从一组点创建一个x-y外壳,删除一个或多个外壳点,重新计算外壳。删除一些排序点,然后重新计算,依此类推。我希望避免删除O(N logn)处的点,O(N)可能是可行的,O(logn)是理想的。我目前使用的是一个静态算法,它给出了正确的点,但是由于我编码的方式,在一个点是x和y的极值点的情况下,可能会有交叉边。这是一个相对较小的问题,但这表明该算法可能在其他方面存在缺陷。因此,如果可能的话,我会选择一个已知的“正确”算法。我承认我没有为这种凸包实现算法,但它是唯一的(考虑到单个平面的方向)吗?例如,如果您有两个点,
a
b
,在具有不同y坐标的相同x坐标中,您可以简单地将位于两个点左侧、两个点下方的点
c
链接到
a
b
之间的最上方吗?或者是否需要先将
c
连接到最底部,其中大多数先连接到最顶部?在这种情况下,连接到最顶部将创建一个凸面外壳,其面积大于通过另一种方法完成的面积。这是否取消了前者作为x-y凸包的资格?我用来检查要删除哪些点的算法依赖于正确的顺序,因此需要c-b-a,这就是为什么静态算法的小问题是有问题的。虽然,现在您已经提到了,但是获得比O(N)算法好得多的算法可能是一个问题