使用一组坐标的外边界构建MKPolygon - 如何分割位于线两侧的坐标?

时间:2012-10-24 23:27:04

标签: objective-c xcode hittest mapkit convex-hull

我正在尝试使用一组坐标的外边界来构建MKPolygon。

据我所知,在Xcode中没有实现此功能(MKPolygon方法将使用所有点来构建多边形,包括内部点)。

经过一些研究,我发现凸壳解决了这个问题。 在研究了各种算法之后,我最好能够实现的是QuickHull。

这采用外部拉索并在两者之间画一条线。从那里,您将基于该线的点分成两个子集,并处理外层之间的距离,以开始构建三角形并消除内部点,直到您留下外边界。

我可以通过查看min / max lat找到外部点,并且可以在两者之间画一条线(MKPolyline) - 但是我如何确定一个点是在一侧还是另一侧MKPolyline?

跟进问题是是否存在命中测试以确定点是否属于MKPolygon。

谢谢!

1 个答案:

答案 0 :(得分:0)

我最终使用了礼品包装算法的变体。当然不是一项微不足道的任务。

在完整代码的格式化方面遇到问题所以我必须完成我的步骤(可能更好,因为我有一些清理工作!)

我开始使用MKPointAnnotations数组

1)我得到了最左边的最低点。为此,我循环遍历所有点并比较lat / lng以获得最低点。这一点肯定会在凸包中,所以将它添加到一个NSMutableArray中,它将存储我们的凸壳点(cvp)

2)获取最低点左侧的所有点并循环通过它们,计算cvp与左侧剩余点的角度。无论哪个角度最大,都需要添加到阵列中 atan(cos(lat1)sin(lat2)-sin(lat1)* cos(lat2)* cos(lon2-lon1),sin(lon2-lon1)* cos(lat2))

  • 对于找到的每个点,创建一个三角形(通过使用新点的lat和前一点的长点)并创建一个多边形。我使用此代码对我的多边形进行了命中测试: BOOL mapCoordinateIsInPolygon = CGPathContainsPoint(polygonView.path,NULL,polygonViewPoint,NO); 如果在命中测试中发现任何东西,则将其从比较数组中移除(原始数组左侧的所有数据减去船体点)

  • 一旦你的cvp数组中至少有3个点,用数组中的所有cvp构建另一个多边形,并使用命中测试删除任何内容。

3)完成所有左侧点后,创建一个尚未消除或添加到船体的剩余点的新比较数组

4)使用相同的计算和多边形测试来移除点并添加找到的cvp 最后,你留下一个构成你的凸包的点列表。