Python 动态和/或静态直线/正交/X-Y凸包
我正在寻找一种处理2D动态图像的有效算法 我已经编写了一个静态算法,但是虽然它在大多数情况下都能工作,但它根本不能工作,所以我也在寻找静态直线凸包的资源。维基百科上有一些关于算法的研究论文,但我无法访问。因此,寻找其他来源或帮助编写代码 任何帮助都将不胜感激,Python算法,非常感谢 当前静态代码: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
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)算法好得多的算法可能是一个问题