12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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);
- }
- }
|