我正在尝试使用一组坐标的外边界来构建MKPolygon。
据我所知,在Xcode
中没有实现此功能(MKPolygon方法将使用所有点来构建多边形,包括内部点)。
这采用外部拉索并在两者之间画一条线。从那里,您将基于该线的点分成两个子集,并处理外层之间的距离,以开始构建三角形并消除内部点,直到您留下外边界。
我可以通过查看min / max lat找到外部点,并且可以在两者之间画一条线(MKPolyline
) - 但是我如何确定一个点是在一侧还是另一侧MKPolyline?
跟进问题是是否存在命中测试以确定点是否属于MKPolygon。
谢谢!
答案 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 最后,你留下一个构成你的凸包的点列表。