如何检查CLCircularRegions是否相交

时间:2015-10-27 15:27:10

标签: ios core-location

我正在开发一个iOS应用程序(使用Swift),用于记录用户的位置历史记录。作为搜索算法的一部分,我想检查两个CLCircularRegions是否相交,但我似乎无法找到核心位置方法或函数来完成它。 CLCircularRegioncontainsCoordinate方法,但这并不是我需要的方法。我也知道Map Kit包含检查交叉MKMapRects的函数,但由于我实际上并没有使用地图,所以这些解决方案看起来并不理想。

我希望我遗漏了一些明显的东西,但我似乎无法弄明白。如何检查两个CLCircularRegions是否相交?

2 个答案:

答案 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
    }
}