检测多边形是否有交叉线(领结)

时间:2014-02-16 16:53:28

标签: ios algorithm google-maps math polygon

我正在寻找一种检测一组点/坐标是否有任何相交线的方法。

一点设置,我在地图的叠加层上使用UIBezierPath绘制多边形。这一切都有效。我能够使用点减少算法减少地图点,并且我留下了一个简单的多边形,可以在我的地图上渲染。 FWIW,我正在使用谷歌地图SDK。

我的问题是,用户可以使用自相交线绘制多边形(这对我正在做的事情来说是一个问题)。我需要做三件事之一。

  • 删除数组中的交叉点。 (剪下领结件)
  • 检测我的分数是否有这个领结(我只是告诉他们重绘一个新的多边形)
  • 如果可能(我认为不是这样),请防止路径首先拉开领结。

当多边形自我关闭并且终点略微重叠起点时,我主要看到领结。因此,当多边形关闭并渲染到地图上的地图坐标时,我会得到一个与内部API混淆的小蝴蝶结。

那里有什么可以使用地图坐标吗?我已经看到了常规CGPoints的一些修复,但没有什么会采用地图坐标。我更喜欢在我的多边形经过我的多边形之后检查它,因为它留下了更少的点来检查。性能是一个问题,并且不希望直接从UIBezierPath迭代数百个点。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我不了解Google Maps SDK或UIBezierPath。我假设您在2D平面中给出了一个多边形,并且您希望自动检测多边形与自身相交的位置(如果有)。

也许最简单的方法是检查所有对边是否相交。你可以在O(n 2 )时间检查这一点,其中n是边数,因为有n *(n-1)/ 2对边。对于给定的一对边,这里有详细说明:

没什么特别的,但细节需要注意。

更复杂的算法是平面扫描算法: