Open5

HMDのレンズの歪み補正

藤城藤城

多分Secant法よりNewton法の方が収束が早い気がする
0<x<=1だし単調増加だし

let k1: Double = 0.34
let k2: Double = 0.55
let rd = newton(y: r) { x in
    x + k1 * pow(x, 3) + k2 * pow(x, 5)
} derivative: { x in
    1 + 3 * k1 * pow(x, 2) + 5 * k2 * pow(x, 4)
}
func newton(y: Double,
            function f: (_ x: Double) -> Double,
            derivative df: (_ x: Double) -> Double,
            initialGuess: Double = 0.1,
            tolerance: Double = 1e-10,
            maxIterations: Int = 1000) -> Double? {
    var x = initialGuess
    for _ in 0..<maxIterations {
        let f = f(x) - y
        let df = df(x)

        let deltaX = f / df
        x -= deltaX

        if abs(deltaX) < tolerance {
            return x
        }
    }
    return nil
}