我寫了這個函數,它取兩個圓的中心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
}
}
半徑不能在這裏米或英里,所以,如果你有一個circularRegion你必須把它轉換爲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")
}
我知道這是一個古老的問題,但可能有人會發現這個有用無論如何...
我真的最終迴避了這個問題,但感謝fo你的回覆。我將爲未來的項目記住這些資源。 – 2011-05-19 08:49:31