我正在开发一个iOS应用程序(使用Swift),用于记录用户的位置历史记录。作为搜索算法的一部分,我想检查两个CLCircularRegions
是否相交,但我似乎无法找到核心位置方法或函数来完成它。 CLCircularRegion
有containsCoordinate
方法,但这并不是我需要的方法。我也知道Map Kit包含检查交叉MKMapRects
的函数,但由于我实际上并没有使用地图,所以这些解决方案看起来并不理想。
我希望我遗漏了一些明显的东西,但我似乎无法弄明白。如何检查两个CLCircularRegions
是否相交?
答案 0 :(得分:4)
如果您不介意小的不准确性,您可以假设这些区域足够小,以至于地球的曲率可以忽略不计,因此可以将这些区域视为平面。
在这种情况下,只需检查两个中心点的距离是否小于半径之和。当且仅当它们的中心比它们的半径之和更接近时,两个圆相交。
CLCircularRegion r1, r2;
const double meanEarthRad = 6371009;
const double metersPerDegree = 2 * M_PI * meanEarthRad / 360;
double dLat = r2.center.latitude - r1.center.latitude;
double dLon = r2.center.longitude - r1.center.longitude;
double actCenterDist = hypot(dLat, dLon) * metersPerDegree;
double minCenterDist = r1.radius + r2.radius;
if (actCenterDist < minCenterDist) {
// the regions intersect
}
答案 1 :(得分:0)
Swift 4.2 版本
extension CLCircularRegion {
func intersects(_ r2: CLCircularRegion) -> Bool {
let r1 = self
let meanEarthRad: Double = 6371009
let metersPerDegree = 2 * Double.pi * meanEarthRad / 360
let dLat = r2.center.latitude - r1.center.latitude
let dLon = r2.center.longitude - r1.center.longitude
let actCenterDist = hypot(dLat, dLon) * metersPerDegree
let minCenterDist = r1.radius + r2.radius
return actCenterDist < minCenterDist
}
}