diff options
| author | 2022-04-27 10:30:32 -0600 | |
|---|---|---|
| committer | 2022-10-04 11:24:10 +0200 | |
| commit | 9d6834f250348b00b6bb9dea58ad4c4b58bfab7b (patch) | |
| tree | 0950fe55678f050186c773c3ee770165d5a07643 /examples/multitouch | |
| parent | fe17641d46b47f60fc2baa68bb7a0c4e137aa628 (diff) | |
| download | iced-9d6834f250348b00b6bb9dea58ad4c4b58bfab7b.tar.gz iced-9d6834f250348b00b6bb9dea58ad4c4b58bfab7b.tar.bz2 iced-9d6834f250348b00b6bb9dea58ad4c4b58bfab7b.zip  | |
vornoi experiment
Diffstat (limited to 'examples/multitouch')
| -rw-r--r-- | examples/multitouch/Cargo.toml | 1 | ||||
| -rw-r--r-- | examples/multitouch/src/main.rs | 85 | 
2 files changed, 81 insertions, 5 deletions
diff --git a/examples/multitouch/Cargo.toml b/examples/multitouch/Cargo.toml index ecd4760c..63c5af74 100644 --- a/examples/multitouch/Cargo.toml +++ b/examples/multitouch/Cargo.toml @@ -9,3 +9,4 @@ publish = false  iced = { path = "../..", features = ["canvas", "tokio", "debug"] }  tokio = { version = "1.0", features = ["sync"] }  env_logger = "0.9" +voronoi = "0.1.4" diff --git a/examples/multitouch/src/main.rs b/examples/multitouch/src/main.rs index f1d2f216..971b1b68 100644 --- a/examples/multitouch/src/main.rs +++ b/examples/multitouch/src/main.rs @@ -9,6 +9,7 @@ use iced::{  };  use std::collections::HashMap; +use voronoi;  pub fn main() -> iced::Result {      env_logger::builder().format_timestamp(None).init(); @@ -126,16 +127,77 @@ impl<'a> canvas::Program<Message> for State {          _state: &Self::State,          _theme: &Theme,          bounds: Rectangle, -        _cursor: Cursor, +        cursor: Cursor,      ) -> Vec<Geometry> {          let fingerweb = self.cache.draw(bounds.size(), |frame| { -            for finger in &self.fingers { -                dbg!(&finger); +            let mut fingers = HashMap::new(); + +            // TODO delete fake fingers +            fingers.insert(1, Point { x: 50.0, y: 50.0 }); +            fingers.insert(2, Point { x: 250.0, y: 400.0 }); +            fingers.insert(3, Point { x: 650.0, y: 120.0 }); +            fingers.insert(4, Point { x: 750.0, y: 520.0 }); + +            match cursor { +                canvas::Cursor::Available(pt) => { +                    dbg!(&pt); +                    fingers.insert(5, pt); +                } +                _ => {} +            } -                let circle = Path::new(|p| p.circle(*finger.1, 50.0)); +            // Collect tuples of (id, point); +            let mut zones: Vec<(i32, Point)> = fingers +                .iter() +                .map(|(id, pt)| (id.clone(), pt.clone())) +                .collect(); + +            // Sort by ID +            zones.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); + +            // Generate sorted list of points +            let vpoints: Vec<voronoi::Point> = zones +                .iter() +                .map(|zone| iced_point_to_voronoi_point(&zone.1)) +                .collect(); + +            let diagram = voronoi::voronoi(vpoints, 700.0); +            let polys = voronoi::make_polygons(&diagram); + +            for i in 0..polys.len() { +                let mut builder = canvas::path::Builder::new(); +                let zone = &zones[i]; +                let poly = &polys[i]; + +                for (index, pt) in poly.iter().enumerate() { +                    let pt = voronoi_point_to_iced_point(pt); + +                    match index { +                        0 => builder.move_to(pt), +                        _ => builder.line_to(pt), +                    } +                } + +                let path = builder.build(); + +                let zone = &zones[i]; + +                let color_r = (10 % zone.0) as f32 / 20.0; +                let color_g = (10 % (zone.0 + 8)) as f32 / 20.0; +                let color_b = (10 % (zone.0 + 3)) as f32 / 20.0; + +                frame.fill( +                    &path, +                    Color { +                        r: color_r, +                        g: color_g, +                        b: color_b, +                        a: 1.0, +                    }, +                );                  frame.stroke( -                    &circle, +                    &path,                      Stroke {                          color: Color::BLACK,                          width: 3.0, @@ -148,3 +210,16 @@ impl<'a> canvas::Program<Message> for State {          vec![fingerweb]      }  } + +fn iced_point_to_voronoi_point(pt: &iced::Point) -> voronoi::Point { +    voronoi::Point::new(pt.x.into(), pt.y.into()) +} + +fn voronoi_point_to_iced_point(pt: &voronoi::Point) -> iced::Point { +    let x: f64 = pt.x.into(); +    let y: f64 = pt.y.into(); +    Point { +        x: x as f32, +        y: y as f32, +    } +}  | 
