【问题标题】:How to determine if two concave/convex shapes are at particular distance?如何确定两个凹/凸形状是否处于特定距离?
【发布时间】:2016-03-25 10:00:47
【问题描述】:

我必须确定两个凹/凸形状之间的距离是否为 d 。我知道分离轴定理在确定距离时可能会派上用场,但它在 O(n2) 时间内运行,我正在寻找任何形状的 O(n) 或 O(nlogn) 算法。我想为 javascript 中的任何两个 SVG 实现它

【问题讨论】:

  • 帮助您处理任何代码会更容易。
  • “以 O(N²) 运行”:什么是 N ???
  • 请列出要支持的确切形状类型。
  • 我在关注这个dyn4j.org/2010/01/sat/#sat-curve,这里的N基本上是顶点数。支持的形状基本上是带有圆边的多边形,或多边形圆椭圆双曲线的混合

标签: javascript algorithm math geometry polygon


【解决方案1】:

这是一个广泛而艰巨的问题。

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

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

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

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

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

【讨论】:

  • 虽然最近的距离可以是顶点到边,所以需要根据 Voronoi 地图测试线段,我认为理论上可以达到 N²,但仅在真正人为的情况下(比如当所有边几乎都穿过细分树的所有节点)
  • @AntonKnyazyev:我不这么认为。当两个多边形都被处理时,找到最接近另一个多边形的每个顶点的多边形元素(顶点或边)就足够了。因此只有一种查询类型:点/多边形距离。
  • 是的,但我的意思是你怎么能找到最接近 B 顶点的 A 边(反之亦然)?一条边可以穿过许多 Voronoi 单元
  • @AntonKnyazyev:你没有明白我的意思。多边形 P 和 Q 之间的最近距离可以出现在 a) P 的顶点和 Q 的顶点之间,或 b) P 的顶点和 Q 的边,或 c) P 的边和 Q 的顶点。但是P的一条边到Q的一个顶点的距离也是Q的一个顶点到P的一条边的距离。所以(c)在交换P和Q的角色时被(b)覆盖了。
  • 但是您仍然需要检查 P 边 - Q 顶点和 Q 边 - P 顶点的边到顶点距离,那么如何检查边与顶点的距离?
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2021-09-22
  • 2011-10-05
  • 1970-01-01
相关资源
最近更新 更多