#[derive(Debug, Clone)]
pub enum FilletRadiusLaw {
Constant(f64),
Linear {
start: f64,
end: f64,
},
SCurve {
start: f64,
end: f64,
},
}
impl FilletRadiusLaw {
#[must_use]
pub fn evaluate(&self, t: f64) -> f64 {
let t = t.clamp(0.0, 1.0);
match self {
Self::Constant(r) => *r,
Self::Linear { start, end } => (end - start).mul_add(t, *start),
Self::SCurve { start, end } => {
let s = t * t * (-2.0f64).mul_add(t, 3.0);
(end - start).mul_add(s, *start)
}
}
}
}
impl From<&FilletRadiusLaw> for brepkit_blend::radius_law::RadiusLaw {
fn from(law: &FilletRadiusLaw) -> Self {
match *law {
FilletRadiusLaw::Constant(r) => Self::Constant(r),
FilletRadiusLaw::Linear { start, end } => Self::Linear { start, end },
FilletRadiusLaw::SCurve { start, end } => Self::SCurve { start, end },
}
}
}