Python 凸多边形之间的Hausdorff距离

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

我感兴趣的是计算由顶点定义的两个多边形(特别是几乎是矩形的四边形)之间的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感兴趣,并愿意接受任何预先编程的解决方案。

对于凸多边形,
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是的。我更新了这篇文章,用了一张草图,证明它可以在任何尺寸下工作,即使形状相交。