Files
Astronome/backend/src/astronomy/coords.rs
T
2026-04-09 23:37:10 +02:00

45 lines
1.2 KiB
Rust

/// Convert RA/Dec to Altitude/Azimuth.
/// All inputs and outputs in degrees.
pub fn radec_to_altaz(
ra_deg: f64,
dec_deg: f64,
lst_deg: f64,
lat_deg: f64,
) -> (f64, f64) {
let ha = (lst_deg - ra_deg).rem_euclid(360.0);
let ha_rad = ha.to_radians();
let dec_rad = dec_deg.to_radians();
let lat_rad = lat_deg.to_radians();
let sin_alt = dec_rad.sin() * lat_rad.sin()
+ dec_rad.cos() * lat_rad.cos() * ha_rad.cos();
let alt_rad = sin_alt.asin();
let cos_az = (dec_rad.sin() - lat_rad.sin() * sin_alt)
/ (lat_rad.cos() * alt_rad.cos());
let cos_az = cos_az.clamp(-1.0, 1.0);
let az_rad = cos_az.acos();
let az_deg = if ha_rad.sin() < 0.0 {
az_rad.to_degrees()
} else {
360.0 - az_rad.to_degrees()
};
(alt_rad.to_degrees(), az_deg)
}
/// Rozenberg airmass formula — valid to horizon.
pub fn airmass(alt_deg: f64) -> f64 {
if alt_deg <= 0.0 {
return 40.0; // clamp at horizon
}
let z_rad = (90.0 - alt_deg).to_radians();
1.0 / (z_rad.cos() + 0.025 * (-11.0 * z_rad.cos()).exp())
}
/// Extinction in magnitudes. k = 0.20 mag/airmass (Bortle 5 site).
pub fn extinction_mag(alt_deg: f64) -> f64 {
airmass(alt_deg) * 0.20
}