extern crate gunpowder_treason as gt; #[macro_use] extern crate itertools; extern crate rand; use std::collections::HashSet; use rand::Rng; fn main() { let cent = 0.393701; let (w, h) = (23.0 * cent, 30.0 * cent); let mut drawing = gt::svg(w, h); drawing.add(gt::rect((0.0, 0.0), (w, h))); let mut rng = rand::thread_rng(); let per_inch = 5.0; let mut points: HashSet<(usize, usize)> = iproduct!( per_inch as usize .. per_inch as usize * 8, per_inch as usize .. per_inch as usize * 11 ).collect(); let mut src: Vec<(usize, usize)> = points.clone().into_iter().collect(); rng.shuffle(&mut src); while let Some((ox, oy)) = src.pop() { let mut x = ox; let mut y = oy; if !points.remove(&(x, y)) { continue; } let mut total_points = 1usize; let mut line = gt::line(x as f64 / per_inch, y as f64 / per_inch); 'find_next: loop { let mut neighbors = vec![ (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1), (x, y - 1), (x, y + 1), (x, y - 1), (x, y + 1), ]; rng.shuffle(&mut neighbors); 'check_neighbors: for &(xn, yn) in neighbors.iter() { if points.remove(&(xn, yn)) { total_points += 1; line = line.to(xn as f64 / per_inch, yn as f64 / per_inch); x = xn; y = yn; continue 'find_next; } } break 'find_next; } if total_points > 3 { drawing.add(gt::circle((ox as f64 / per_inch, oy as f64 / per_inch), 0.02)); drawing.add(gt::circle((x as f64 / per_inch, y as f64 / per_inch), 0.02)); drawing.add(line); } } if let Err(e) = drawing.output("space") { eprintln!("{:?}", e); } }