Based on on a circles[MKCircle], find the coordinate(CLLocationCoordinate2D). Swift

28 Views Asked by At

I have circles and based on circle intersect i need to find center of intersect and display pin. I wrote the code, but it works not as i expected, something works wrong, but i cant understand where is incorrect part.

This is how works with 3 circles enter image description here

Another example with 3 circles

enter image description here

Example with 4 circles

enter image description here

My code:

let c1 = createCircleArea(center: CLLocationCoordinate2D(latitude: lat1, longitude: lon1), radius: distance1)
    let c2 = createCircleArea(center: CLLocationCoordinate2D(latitude: lat2, longitude: lon2), radius: distance2)
    let c3 = createCircleArea(center: CLLocationCoordinate2D(latitude: lat3, longitude: lon3), radius: distance3)

Generation location based on intersect

let loc = getIntersectionPoint(for: [c1, c2, c3])

The main method which determinate location

func getIntersectionPoint(for circles: [MKCircle]) -> CLLocationCoordinate2D? {
    var intersectionPoints = [CLLocationCoordinate2D]()

    for i in 0..<circles.count {
        for j in (i+1)..<circles.count {
            let circle1 = circles[i]
            let circle2 = circles[j]

            let center1 = circle1.coordinate
            let center2 = circle2.coordinate
            let radius1 = circle1.radius
            let radius2 = circle2.radius

            let distance = center1.distance(to: center2)

            if distance < radius1 + radius2 {
                // Circles intersect, find intersection points
                let a = (radius1*radius1 - radius2*radius2 + distance*distance)/(2*distance)
                let h = sqrt(radius1*radius1 - a*a)

                let p2x = center1.longitude + a*(center2.longitude - center1.longitude)/distance
                let p2y = center1.latitude + a*(center2.latitude - center1.latitude)/distance

                let intersectionPoint1 = CLLocationCoordinate2D(latitude: p2y + h*(center2.longitude - center1.longitude)/distance,
                                                                 longitude: p2x - h*(center2.latitude - center1.latitude)/distance)
                let intersectionPoint2 = CLLocationCoordinate2D(latitude: p2y - h*(center2.longitude - center1.longitude)/distance,
                                                                 longitude: p2x + h*(center2.latitude - center1.latitude)/distance)

                intersectionPoints.append(intersectionPoint1)
                intersectionPoints.append(intersectionPoint2)
            }
        }
    }

    if intersectionPoints.count == 0 {
        return nil // No intersection points found
    } else if intersectionPoints.count == 1 {
        return intersectionPoints[0] // Only one intersection point found
    } else {
        // Calculate centroid of all intersection points
        var centroid = CLLocationCoordinate2D(latitude: 0, longitude: 0)
        for point in intersectionPoints {
            centroid.latitude += point.latitude
            centroid.longitude += point.longitude
        }
        centroid.latitude /= Double(intersectionPoints.count)
        centroid.longitude /= Double(intersectionPoints.count)

        return centroid
    }
}
0

There are 0 best solutions below