use num_traits::AsPrimitive;
use std::ops::{Add, Div, Mul, Sub};
pub(crate) fn spline16<
V: Copy
+ Div<Output = V>
+ Add<Output = V>
+ Sub<Output = V>
+ Mul<Output = V>
+ 'static
+ PartialOrd
+ Div<Output = V>,
>(
x: V,
) -> V
where
f64: AsPrimitive<V>,
f32: AsPrimitive<V>,
{
if x < 1.0.as_() {
((x - 9.0.as_() / 5.0.as_()) * x - 1.0.as_() / 5.0.as_()) * x + 1.0.as_()
} else {
(((-1.0).as_() / 3.0.as_() * (x - 1f32.as_()) + 4.0.as_() / 5.0.as_()) * (x - 1f32.as_())
- 7.0.as_() / 15.0.as_())
* (x - 1f32.as_())
}
}
pub(crate) fn spline36<
V: Copy
+ Div<Output = V>
+ Add<Output = V>
+ Sub<Output = V>
+ Mul<Output = V>
+ 'static
+ PartialOrd
+ Div<Output = V>,
>(
x: V,
) -> V
where
f64: AsPrimitive<V>,
f32: AsPrimitive<V>,
{
if x < 1.0.as_() {
((13.0.as_() / 11.0.as_() * x - 453.0.as_() / 209.0.as_()) * x - 3.0.as_() / 209.0.as_())
* x
+ 1.0.as_()
} else if x < 2.0.as_() {
(((-6.0).as_() / 11.0.as_() * (x - 1f32.as_()) + 270.0.as_() / 209.0.as_())
* (x - 1f32.as_())
- 156.0.as_() / 209.0.as_())
* (x - 1f32.as_())
} else {
((1.0.as_() / 11.0.as_() * (x - 2f32.as_()) - 45.0.as_() / 209.0.as_()) * (x - 2f32.as_())
+ 26.0.as_() / 209.0.as_())
* (x - 2f32.as_())
}
}
pub(crate) fn spline64<
V: Copy
+ Div<Output = V>
+ Add<Output = V>
+ Sub<Output = V>
+ Mul<Output = V>
+ 'static
+ PartialOrd
+ Div<Output = V>,
>(
x: V,
) -> V
where
f64: AsPrimitive<V>,
f32: AsPrimitive<V>,
{
if x < 1.0.as_() {
((49.0.as_() / 41.0.as_() * x - 6387.0.as_() / 2911.0.as_()) * x - 3.0.as_() / 2911.0.as_())
* x
+ 1.0.as_()
} else if x < 2.0.as_() {
(((-24.0).as_() / 41.0.as_() * (x - 1f32.as_()) + 4032.0.as_() / 2911.0.as_())
* (x - 1f32.as_())
- 2328.0.as_() / 2911.0.as_())
* (x - 1f32.as_())
} else if x < 3.0.as_() {
((6.0.as_() / 41.0.as_() * (x - 2f32.as_()) - 1008.0.as_() / 2911.0.as_())
* (x - 2f32.as_())
+ 582.0.as_() / 2911.0.as_())
* (x - 2f32.as_())
} else {
(((-1.0).as_() / 41.0.as_() * (x - 3f32.as_()) + 168.0.as_() / 2911.0.as_())
* (x - 3f32.as_())
- 97.0.as_() / 2911.0.as_())
* (x - 3f32.as_())
}
}