Javascript 如何确定两个凹凸形状是否处于特定距离?

Javascript 如何确定两个凹凸形状是否处于特定距离?,javascript,algorithm,math,geometry,polygon,Javascript,Algorithm,Math,Geometry,Polygon,我必须确定两个凹/凸形状之间的距离是否为d。我知道分离轴定理在确定距离时可能很有用,但它在O(n2)时间内运行,我正在寻找任何形状的O(n)或O(nlogn)算法。我想用javascript实现任意两个SVG,这是一个广泛而艰巨的问题 要处理最困难的情况(如椭圆/贝塞尔距离),您需要以某种方式展平轮廓,因此我建议在所有情况下展平,并仅解决两个多边形的问题 令人惊讶的是,你在网上几乎找不到关于两个多边形之间距离的资料 假设您处理的是形状的内部(而不仅仅是轮廓),则首先必须检查多边形是否存在空洞相交

我必须确定两个凹/凸形状之间的距离是否为d。我知道分离轴定理在确定距离时可能很有用,但它在O(n2)时间内运行,我正在寻找任何形状的O(n)或O(nlogn)算法。我想用javascript实现任意两个SVG,这是一个广泛而艰巨的问题

要处理最困难的情况(如椭圆/贝塞尔距离),您需要以某种方式展平轮廓,因此我建议在所有情况下展平,并仅解决两个多边形的问题

令人惊讶的是,你在网上几乎找不到关于两个多边形之间距离的资料

假设您处理的是形状的内部(而不仅仅是轮廓),则首先必须检查多边形是否存在空洞相交(否则距离为0)。我想这可以在时间O(N.Log(N))内完成

然后,如果我是对的,两个多边形之间的最近距离是所有顶点到另一个多边形的最近距离中的最短距离。如果您构造两个多边形的Voronoi图(这在时间O(N.Log(N))中是可行的),您将获得两个平面细分,其中您可以在每个点的时间Log(N)中解决点位置问题


所有这些放在一起应该得到一个O(N.Log(N))解决方案。您需要一个专门的计算几何库来实现这一点。

使用任何代码都会更容易。“在O(N²)中运行”:什么是N???请列出要支持的确切形状类型。我一直在关注,N基本上是顶点的数量。支持的形状基本上是具有圆形边的多边形,或多边形-圆-椭圆-双曲线的混合。但是,最近的距离可以是顶点到边的距离,因此需要根据Voronoi贴图测试线段,我认为这在理论上可以达到N²,但仅在真正人为的情况下(就像所有的边都与细分树的几乎所有节点相交一样)@AntonKnyazyev:我不这么认为。因为两个多边形都经过处理,所以找到多边形元素(顶点或边)就足够了最接近另一个多边形的每个顶点。因此只有一种查询类型:点/多边形距离。正确,但我的意思是,如何找到a的边最接近B的顶点(反之亦然)?一条边可以跨越多个Voronoicells@AntonKnyazyev:您没有理解我的观点。多边形P和Q之间的最近距离可能出现在a)P的顶点和Q的顶点之间,或b)P的顶点和Q的边之间,或c)P的边和Q的顶点之间。但是P的边和Q的顶点之间的距离也是Q的顶点和P的边之间的距离。因此(c)被(b)覆盖在交换P和Q的角色时,您仍然需要检查P边-Q顶点和Q边-P顶点的边到顶点距离,那么如何根据顶点检查边?