How to resolve the algorithm Problem of Apollonius step by step in the Swift programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Problem of Apollonius step by step in the Swift programming language

Table of Contents

Problem Statement

Implement a solution to the Problem of Apollonius   (description on Wikipedia)   which is the problem of finding the circle that is tangent to three specified circles   (colored black in the diagram below to the right). There is an   algebraic solution   which is pretty straightforward.

The solutions to the example in the code are shown in the diagram   (below and to the right). The red circle is "internally tangent" to all three black circles,   and the green circle is "externally tangent" to all three black circles.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Problem of Apollonius step by step in the Swift programming language

Source code in the swift programming language

import Foundation

struct Circle {
    let center:[Double]!
    let radius:Double!
    
    init(center:[Double], radius:Double) {
        self.center = center
        self.radius = radius
    }
    
    func toString() -> String {
        return "Circle[x=\(center[0]),y=\(center[1]),r=\(radius)]"
    }
}

func solveApollonius(c1:Circle, c2:Circle, c3:Circle,
    s1:Double, s2:Double, s3:Double) -> Circle {
    
        let x1 = c1.center[0]
        let y1 = c1.center[1]
        let r1 = c1.radius
        let x2 = c2.center[0]
        let y2 = c2.center[1]
        let r2 = c2.radius
        let x3 = c3.center[0]
        let y3 = c3.center[1]
        let r3 = c3.radius
        
        let v11 = 2*x2 - 2*x1
        let v12 = 2*y2 - 2*y1
        let v13 = x1*x1 - x2*x2 + y1*y1 - y2*y2 - r1*r1 + r2*r2
        let v14 = 2*s2*r2 - 2*s1*r1
        
        let v21 = 2*x3 - 2*x2
        let v22 = 2*y3 - 2*y2
        let v23 = x2*x2 - x3*x3 + y2*y2 - y3*y3 - r2*r2 + r3*r3
        let v24 = 2*s3*r3 - 2*s2*r2
        
        let w12 = v12/v11
        let w13 = v13/v11
        let w14 = v14/v11
        
        let w22 = v22/v21-w12
        let w23 = v23/v21-w13
        let w24 = v24/v21-w14
        
        let P = -w23/w22
        let Q = w24/w22
        let M = -w12*P-w13
        let N = w14 - w12*Q
        
        let a = N*N + Q*Q - 1
        let b = 2*M*N - 2*N*x1 + 2*P*Q - 2*Q*y1 + 2*s1*r1
        let c = x1*x1 + M*M - 2*M*x1 + P*P + y1*y1 - 2*P*y1 - r1*r1
        
        let D = b*b-4*a*c
        
        let rs = (-b - sqrt(D)) / (2*a)
        let xs = M + N * rs
        let ys = P + Q * rs
        
        return  Circle(center: [xs,ys], radius: rs)
        
}

let c1 = Circle(center: [0,0], radius: 1)
let c2 = Circle(center: [4,0], radius: 1)
let c3 = Circle(center: [2,4], radius: 2)

println(solveApollonius(c1,c2,c3,1,1,1).toString())
println(solveApollonius(c1,c2,c3,-1,-1,-1).toString())


  

You may also check:How to resolve the algorithm Bitmap/Flood fill step by step in the Go programming language
You may also check:How to resolve the algorithm Multiplication tables step by step in the Perl programming language
You may also check:How to resolve the algorithm Knapsack problem/0-1 step by step in the PHP programming language
You may also check:How to resolve the algorithm Four is magic step by step in the zkl programming language
You may also check:How to resolve the algorithm Empty string step by step in the DWScript programming language