use geo::{centroid::Centroid, Rotate};
use std::path::Path;
use aoer_plotty_rs::prelude::{Arrangement, ToSvg};
use geo::translate::Translate;
use geo_types::{coord, LineString, MultiLineString, Polygon, Rect};
use rand::prelude::{Rng, SeedableRng, SmallRng};
fn main() {
let square_size: i32 = 25;
let square_count: i32 = 9;
let rotate_mul = 30.0;
let displace_mul = f64::from(square_size / 2);
let mut rng = SmallRng::seed_from_u64(12345);
let viewbox = Rect::new(
coord! {
x:0f64,
y:0f64},
coord! {
x: f64::from((square_size*square_count) as i32),
y: f64::from((square_size*square_count) as i32)},
);
let mut boxes: Vec<Polygon<f64>> = vec![];
for y in 0..square_count {
for x in 0..square_count {
let rotate_amt = (f64::from(y) / f64::from(square_count))
* ((2.0 * rng.gen::<f64>()) - 1.0)
* rotate_mul; let translate_amt = (f64::from(y) / f64::from(square_count))
* ((2.0 * rng.gen::<f64>()) - 1.0)
* displace_mul;
let r = Rect::new(
coord! {
x: f64::from(x * square_size),
y: f64::from(y * square_size)},
coord! {
x: f64::from((x * square_size) + square_size),
y: f64::from((y * square_size) + square_size)
},
)
.to_polygon();
let r = r.rotate_around_point(rotate_amt, r.centroid().unwrap());
let r = r.translate(translate_amt, 0.0);
boxes.push(r);
}
}
let box_lines: Vec<LineString<f64>> = boxes.iter().map(|b| b.exterior().clone()).collect();
let box_lines = MultiLineString::new(box_lines);
let arrangement = Arrangement::FitCenterMargin(10.0, viewbox, false);
let svg = arrangement.create_svg_document().unwrap().add(
box_lines
.to_path(&arrangement)
.set("fill", "none")
.set("stroke", "black")
.set("stroke-width", 1)
.set("stroke-linejoin", "square")
.set("stroke-linecap", "square"),
);
let fname = Path::new(file!()).file_stem().unwrap().to_str().unwrap();
svg::save(format!("images/{}.svg", fname), &svg).unwrap();
}