use interpolation::Spatial;
use num::Float;
pub trait Point<X, Y>: Copy + Clone where
Y: Spatial,
Y::Scalar: Float,
{
fn x_to_scalar(x: X) -> Y::Scalar;
fn x(&self) -> X;
fn y(&self) -> Y;
#[inline]
fn interpolate(x: X, start: &Self, end: &Self) -> Y where
Y: PartialEq,
X: PartialEq,
{
if start.y() == end.y() || start.x() == x {
return start.y();
} else if end.x() == x {
return end.y();
}
let x = Self::x_to_scalar(x);
let start_x = Self::x_to_scalar(start.x());
let end_x = Self::x_to_scalar(end.x());
let scalar = (x - start_x) / (end_x - start_x);
let interpolated_difference = end.y().sub(&start.y()).scale(&scalar);
start.y().add(&interpolated_difference)
}
}