use std;
pub const PI: f64 = std::f64::consts::PI;
pub const DBLPI: f64 = std::f64::consts::TAU;
pub const HLFPI: f64 = std::f64::consts::FRAC_PI_2;
pub const TURNAS: f64 = 1296000.0;
pub const TURNS: f64 = 86400.0;
pub const DEGRAD: f64 = std::f64::consts::PI / 180.0;
pub const RADDEG: f64 = 180.0 / std::f64::consts::PI;
pub const ASECRAD: f64 = DBLPI / TURNAS;
pub const RADASEC: f64 = TURNAS / DBLPI;
pub const SECRAD: f64 = DBLPI / TURNS;
pub const RADSEC: f64 = TURNS / DBLPI;
pub fn norm_dblpi(ang: f64) -> f64 {
let out = ang % DBLPI as f64;
if out < 0.0 { out + DBLPI } else { out }
}
pub fn norm_pi(ang: f64) -> f64 {
let out = ang % DBLPI as f64;
if out.abs() >= PI {
out - out.signum() * DBLPI
} else {
out
}
}
pub fn dms_rad(sign: char, deg: f64, amin: f64, asec: f64) -> f64 {
let out = (60.0 * ((60.0 * deg) + amin) + asec) * ASECRAD;
if sign == '-' { -out } else { out }
}
pub fn hms_rad(hour: f64, min: f64, sec: f64) -> f64 {
(60.0 * ((60.0 * hour) + min) + sec) * SECRAD
}
pub fn rad_dms(angle: f64, ndp: i8) -> (char, i32, i32, i32, i32) {
let sign = if angle >= 0.0 { '+' } else { '-' };
let mut a = angle.abs() * RADASEC;
let mut nrs: i32 = 1;
if ndp < 0 {
for n in 0..-ndp {
nrs *= if (n == 0) || (n == 2) { 6 } else { 10 };
}
let rs = nrs as f64;
let w = a / rs;
a = rs * w.round();
}
if ndp > 0 {
nrs = 10_i32.pow(ndp as u32);
}
let rs = nrs as f64;
let rm = rs * 60.0;
let rd = rm * 60.0;
a = (rs * a).round();
let ad = a / rd;
a -= ad.trunc() * rd;
let am = a / rm;
a -= am.trunc() * rm;
let asc = a / rs;
let asf = a - asc.trunc() * rs;
(sign, ad as i32, am as i32, asc as i32, asf as i32)
}
pub fn rad_hms(angle: f64, ndp: i8) -> (char, i32, i32, i32, i32) {
rad_dms(angle / 15.0, ndp)
}
pub fn day_hms(dayfr: f64, ndp: i8) -> (char, i32, i32, i32, i32) {
rad_dms(dayfr * DBLPI / 15.0, ndp)
}