summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/lib.rs b/src/lib.rs
index db5d42f..218d5b4 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,5 @@
-mod lerp;
mod poly;
-use lerp::Lerp;
use poly::Poly;
use std::ffi::{CStr, CString};
@@ -18,6 +16,29 @@ pub struct Bezier {
pub dpy: Poly,
}
+pub fn to_poly(v: &Vec<f32>) -> Poly {
+ match v.len() {
+ 0 => Poly::new(vec![0.0]),
+ 1 => Poly::new(vec![v[0]]),
+ 2 => Poly::new(vec![v[0], v[1] - v[0]]),
+ _ => {
+ let mut pv = Vec::new();
+ for i in 0..v.len() - 1 {
+ pv.push(Poly::new(vec![v[i], v[i + 1] - v[i]]));
+ }
+ while pv.len() > 1 {
+ let mut npv = Vec::new();
+ for i in 0..pv.len() - 1 {
+ let c = &pv[i + 1] - &pv[i];
+ npv.push(&pv[i] + &c.shift());
+ }
+ pv = npv;
+ }
+ pv[0].clone()
+ }
+ }
+}
+
impl Bezier {
pub fn new() -> Bezier {
Bezier {
@@ -34,8 +55,8 @@ impl Bezier {
pub fn push(&mut self, x: i32, y: i32) {
self.vx.push(x as f32);
self.vy.push(y as f32);
- self.px = Lerp::new(&self.vx).to_poly();
- self.py = Lerp::new(&self.vy).to_poly();
+ self.px = to_poly(&self.vx);
+ self.py = to_poly(&self.vy);
self.dpx = self.px.deriv();
self.dpy = self.py.deriv();
self.degree += 1;
@@ -44,8 +65,8 @@ impl Bezier {
pub fn remove(&mut self, index: usize) {
self.vx.remove(index);
self.vy.remove(index);
- self.px = Lerp::new(&self.vx).to_poly();
- self.py = Lerp::new(&self.vy).to_poly();
+ self.px = to_poly(&self.vx);
+ self.py = to_poly(&self.vy);
self.dpx = self.px.deriv();
self.dpy = self.py.deriv();
self.degree -= 1;