From d6341b9195553af6dfb8bfc9d94c19e6cc000247 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= <jtomas1815@gmail.com>
Date: Sun, 31 Jan 2021 02:41:18 -0300
Subject: Change the curve style

---
 src/lib.rs  | 31 +++++++++++++++++++++++++++----
 src/main.rs |  7 +++++++
 2 files changed, 34 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/lib.rs b/src/lib.rs
index 4662f08..dd28124 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -49,7 +49,30 @@ impl Bezier {
         self.degree -= 1;
     }
 
-    pub fn show_x(&self) -> String {
+    fn closer(&self, x: f32, y: f32) -> usize {
+        let mut best = 10000.0;
+        let mut best_index = 0;
+        for i in 0..self.degree {
+            let candidate = ((x - self.vx[i]).powi(2) + (y - self.vy[i]).powi(2)).sqrt();
+            if candidate < best {
+                best = candidate;
+                best_index = i;
+            }
+        }
+        best_index
+    }
+
+    pub fn grab_closer(&mut self, x: f32, y: f32) {
+        let closer = self.closer(x, y);
+        self.vx[closer] = x;
+        self.vy[closer] = y;
+        self.px = to_poly(&self.vx);
+        self.py = to_poly(&self.vy);
+        self.dpx = self.px.deriv();
+        self.dpy = self.py.deriv();
+    }
+
+    fn show_x(&self) -> String {
         let mut s = String::new();
         for i in 0..self.degree {
             s.push_str(&self.vx[i].to_string());
@@ -60,7 +83,7 @@ impl Bezier {
         s
     }
 
-    pub fn show_y(&self) -> String {
+    fn show_y(&self) -> String {
         let mut s = String::new();
         for i in 0..self.degree {
             s.push_str(&self.vy[i].to_string());
@@ -96,8 +119,8 @@ impl Bezier {
         float dpx[{dsx}] = float[{dsx}]({dpx});
         float dpy[{dsy}] = float[{dsy}]({dpy});
     
-        float thr = 32;
-        float step_size = 10;
+        float thr = 16;
+        float step_size = 5;
         float inf = 1000000;
     
         float eval_px(float t) {{
diff --git a/src/main.rs b/src/main.rs
index e6f3720..add9d00 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -63,6 +63,7 @@ fn main() {
     'running: loop {
         let x = event_pump.mouse_state().x();
         let y = event_pump.mouse_state().y();
+        let left_click = event_pump.mouse_state().left();
         for event in event_pump.poll_iter() {
             match event {
                 Event::Quit { .. }
@@ -76,6 +77,12 @@ fn main() {
                 } => {
                     curve.push(x, window_h as i32 - y);
                     curve.draw();
+                },
+                Event::MouseMotion { .. } => {
+                    if left_click {
+                        curve.grab_closer(x as f32, (window_h as i32 - y) as f32);
+                        curve.draw();
+                    }
                 }
                 _ => {}
             }
-- 
cgit v1.2.3