Python 凸多边形之间的Hausdorff距离
我感兴趣的是计算由顶点定义的两个多边形(特别是几乎是矩形的四边形)之间的Hausdorff距离。它们可能重叠 回想一下$d_H(A,B)=\max(d(A,B),d(B,A))$,其中$d$是Hausdorff半度量 $d(A,B)=\sup{A\ in A}\inf{B\ in B}d(A,B)$ 如果给定一个有限的不相交覆盖$a$,${a_i}$,$d(a,B)=\max{d(a_i,B)}$,这是真的吗?其推论是$d(A,B)=d(A\set减去B,B)$Python 凸多边形之间的Hausdorff距离,python,algorithm,computational-geometry,Python,Algorithm,Computational Geometry,我感兴趣的是计算由顶点定义的两个多边形(特别是几乎是矩形的四边形)之间的Hausdorff距离。它们可能重叠 回想一下$d_H(A,B)=\max(d(A,B),d(B,A))$,其中$d$是Hausdorff半度量 $d(A,B)=\sup{A\ in A}\inf{B\ in B}d(A,B)$ 如果给定一个有限的不相交覆盖$a$,${a_i}$,$d(a,B)=\max{d(a_i,B)}$,这是真的吗?其推论是$d(A,B)=d(A\set减去B,B)$ 我找到了阿塔拉的一篇论文。我对P
我找到了阿塔拉的一篇论文。我对Python感兴趣,并愿意接受任何预先编程的解决方案。对于凸多边形,
d(A,B)
是从A
的顶点到B
中任何点的最大距离。因此,如果可以计算从任意点到凸多边形的距离,那么Hausdorff距离就不太难计算
要计算从一个点到凸多边形的距离,首先必须测试该点是否在多边形内部(如果是,则距离为0),然后如果不在多边形内部,则找到到任何边界线段的最小距离
另一个查询的答案是否。例如,让A和B都是以原点为中心的相同2x2正方形。将A划分为4个1x1正方形。从每个Ai到B的Hausdorff距离是sqrt(2)
,但从A到B的距离是0
更新:关于顶点的说法并不明显,因此我将给出一个在任何有限数量的维度上都很好的证明。我试图证明的结果是,在计算同时具有多边形和凸的d(A,B)
时,只要找到A
到B
的顶点之间的距离就足够了。(B
中最近的点可能不是顶点,但a
中最远的点之一必须是顶点。)
因为两者都是有限的闭合形状,所以它们是紧凑的。从紧凑性来看,在a
中必须存在一个点p
,该点尽可能远离B
。从紧凑性来看,在B
中必须存在一个尽可能接近a
的点q
只有当A
和B
是同一个多边形时,该距离才为0,在这种情况下,很明显,我们在A
的顶点处达到该距离。因此,在不丧失一般性的情况下,我们可以假设从p
到q
之间存在正距离
绘制与p
至q
直线垂直的平面(在更高的维度中,某种超平面)。B
中的任何点都能穿过此平面吗?如果有一个,比如说r
,那么从q
到r
的线段上的每个点都必须在B
中,因为B
是凸的。但是很容易证明,这条线段上一定有一个点比q
更接近p
,这与q
的定义相矛盾。因此B
不能穿过此平面
显然,p
不能是一个内部点,因为如果它是,那么沿着光线从q
继续到p
,你会发现A
中的点距离B
后面的平面更远,这与p
的定义相矛盾。如果p
是a
的一个顶点,那么结果就非常正确。因此,唯一有趣的情况是p
位于a
的边界上,但不是顶点
如果是这样,则p
位于曲面上。如果该曲面与我们构建的平面不平行,则很容易沿着该曲面移动,远离我们后面的B
平面,并找到距离B
比p
更远的点。因此,该表面必须平行于该平面。由于A
是有限的,因此该曲面必须在某个顶点处终止。这些顶点与该平面的距离与p
相同,因此与B
的距离至少与p
的距离相同。因此,A
至少存在一个顶点,该顶点尽可能远离B
这就是为什么找到多边形顶点到另一个多边形的最大距离就足够了
(我把构造一对带有
q
而不是顶点的多边形作为一个有趣的练习留给读者。)你可能会在数学课上获得更好的运气(尤其是证明部分)。SEI也在那里发布了,但是这里没有太多算法方面的东西。删除latex-like格式…几年后,标准Shapely库有了一个很好的实现,请参见这里的答案:如果两个形状相交,最大距离是否一定是一个顶点?@AlexChamberlain是的。我更新了这篇文章,用了一张草图,证明它可以在任何尺寸下工作,即使形状相交。