use crate::consts::DPI;
pub fn gc2gde(a: f64, f: f64, xyz: [f64; 3]) -> Result<(f64, f64, f64), i32> {
if f < 0.0 || f >= 1.0 {
return Err(-1);
}
if a <= 0.0 {
return Err(-2);
}
let aeps2 = a * a * 1e-32;
let e2 = (2.0 - f) * f;
let e4t = e2 * e2 * 1.5;
let ec2 = 1.0 - e2;
if ec2 <= 0.0 {
return Err(-1);
}
let ec = ec2.sqrt();
let b = a * ec;
let x = xyz[0];
let y = xyz[1];
let z = xyz[2];
let p2 = x * x + y * y;
let elong = if p2 > 0.0 { y.atan2(x) } else { 0.0 };
let absz = z.abs();
let (mut phi, height);
if p2 > aeps2 {
let p = p2.sqrt();
let s0 = absz / a;
let pn = p / a;
let zc = ec * s0;
let c0 = ec * pn;
let c02 = c0 * c0;
let c03 = c02 * c0;
let s02 = s0 * s0;
let s03 = s02 * s0;
let a02 = c02 + s02;
let a0 = a02.sqrt();
let a03 = a02 * a0;
let d0 = zc * a03 + e2 * s03;
let f0 = pn * a03 - e2 * c03;
let b0 = e4t * s02 * c02 * pn * (a0 - ec);
let s1 = d0 * f0 - b0 * s0;
let cc = ec * (f0 * f0 - b0 * c0);
phi = s1.atan2(cc);
let s12 = s1 * s1;
let cc2 = cc * cc;
height = (p * cc + absz * s1 - a * (ec2 * s12 + cc2).sqrt()) / (s12 + cc2).sqrt();
} else {
phi = DPI / 2.0;
height = absz - b;
}
if z < 0.0 {
phi = -phi;
}
Ok((elong, phi, height))
}