summaryrefslogtreecommitdiff
path: root/src/lerp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lerp.rs')
-rw-r--r--src/lerp.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/lerp.rs b/src/lerp.rs
new file mode 100644
index 0000000..7c4994c
--- /dev/null
+++ b/src/lerp.rs
@@ -0,0 +1,33 @@
+use crate::poly::{self, Number, Poly};
+
+pub enum Lerp {
+ Node(Box<Lerp>, Box<Lerp>),
+ Leaf(Number, Number)
+}
+
+impl Lerp {
+ pub fn new(v: Vec<Number>) -> Box<Lerp> {
+ Lerp::new_s(&v[..])
+ }
+
+ fn new_s(v: &[Number]) -> Box<Lerp> {
+ match v.len() {
+ 0 => Box::new(Lerp::Leaf(0.0, 0.0)),
+ 1 => Box::new(Lerp::Leaf(v[0], v[0])),
+ 2 => Box::new(Lerp::Leaf(v[0], v[1])),
+ _ => Box::new(Lerp::Node(Lerp::new_s(&v[0..v.len() - 1]), Lerp::new_s(&v[1..v.len()])))
+ }
+ }
+}
+
+pub fn lp(l: Box<Lerp>) -> Poly {
+ match *l {
+ Lerp::Leaf(a, b) => vec![a, b - a],
+ Lerp::Node(a, b) => {
+ let a = lp(a);
+ let b = lp(b);
+ let c = poly::sub(&b, &a);
+ poly::skewed_sum(a, c)
+ }
+ }
+}