Я написал эту функцию, которая принимает центр x, y и радиус для двух окружностей и возвращает область пересечения.
public func circlesIntesectionArea(x1 x1: Double, y1: Double, r1: Double, x2: Double, y2: Double, r2: Double) -> Double {
let d: Double = sqrt( pow(x1 - x2, 2) + pow(y1 - y2, 2) ) // distance between circles center
let dd: Double = pow(d, 2)
let rr1: Double = pow(r1, 2)
let rr2: Double = pow(r2, 2)
if d > r2 + r1 { return 0.0 } // no overlap
if d <= abs(r1 - r2) {
if r1 >= r2 { return M_PI * rr2 } //Circle2 inside circle1
else { return M_PI * rr1 } //Circle1 inside circle2
} else {
let phi: Double = acos((dd + rr1 - rr2) / (2 * r1 * d)) * 2; // circle1 sector angle
let area1: Double = (phi * rr1)/2 - (rr1 * sin(phi))/2; // sector1 area - triangle1 area
let theta: Double = acos((dd + rr2 - rr1) / (2 * r2 * d)) * 2; // circle2 sector center angle
let area2: Double = (theta * rr2)/2 - (rr2 * sin(theta))/2; // sector2 area - triangle2 area
let intersectionArea: Double = area1 + area2;
return isnan(intersectionArea) ? 0.0 : intersectionArea; //isnan == no overlap
}
}
Радиус не может быть здесь в метрах или милях, поэтому, если у вас есть круговой регион, вам необходимо преобразовать его в MKCoordinateRegion:
let region1 = MKCoordinateRegionMakeWithDistance(circularRegion.center, circularRegion.radius, circularRegion.radius)
Тогда:
if circlesIntesectionArea(x1: region1.center.longitude, y1: region1.center.latitude, r1: region1.span.latitudeDelta,
x2: region2.center.longitude, y2: region2.center.latitude, r2: region2.span.latitudeDelta) == 0.0 {
print("No overlapping")
} else {
print("Overlapping")
}
Я знаю, что это старый вопрос, но, может быть, кто-то найдет это полезным в любом случае ...