diff options
| author | Juan Manuel Tomás <jtomas1815@gmail.com> | 2021-01-31 02:41:18 -0300 | 
|---|---|---|
| committer | Juan Manuel Tomás <jtomas1815@gmail.com> | 2021-01-31 02:41:18 -0300 | 
| commit | d6341b9195553af6dfb8bfc9d94c19e6cc000247 (patch) | |
| tree | 546b204d15714993689c85136a3ffcaac04087f2 /src | |
| parent | c0089dd0567b8d6538360a21f042cbb0913fff99 (diff) | |
| download | bezier-d6341b9195553af6dfb8bfc9d94c19e6cc000247.tar.gz bezier-d6341b9195553af6dfb8bfc9d94c19e6cc000247.zip | |
Change the curve style
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 31 | ||||
| -rw-r--r-- | src/main.rs | 7 | 
2 files changed, 34 insertions, 4 deletions
| @@ -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(); +                    }                  }                  _ => {}              } | 
