#[derive(Debug, Clone, PartialEq)]
pub struct HeightProfile {
pub samples_m: Vec<f64>,
}
impl HeightProfile {
pub fn new(samples_m: Vec<f64>) -> Self {
Self { samples_m }
}
pub fn min_max(&self) -> (f64, f64) {
let min = self.samples_m.iter().copied().fold(f64::INFINITY, f64::min);
let max = self
.samples_m
.iter()
.copied()
.fold(f64::NEG_INFINITY, f64::max);
(min, max)
}
pub fn roughness_index(&self) -> f64 {
if self.samples_m.len() < 2 {
return 0.0;
}
let total: f64 = self.samples_m.windows(2).map(|p| (p[1] - p[0]).abs()).sum();
total / (self.samples_m.len() - 1) as f64
}
}
pub fn crater_shadow_fraction(solar_elevation_deg: f64, rim_slope_deg: f64) -> f64 {
((rim_slope_deg - solar_elevation_deg) / rim_slope_deg.max(1.0)).clamp(0.0, 1.0)
}