#![warn(
clippy::all,
clippy::pedantic,
clippy::nursery,
clippy::cargo,
)]
use float_ord::FloatOrd;
use plotters::prelude::*;
pub fn landscape(
landscape: Vec<Vec<(f64,f64)>>,
height: u32,
width: u32,
) -> Result<(), Box<dyn std::error::Error>> {
let to_plot: Vec<Vec<(f64, f64)>> = landscape
.into_iter()
.collect();
let (x_lower, x_upper, y_lower, y_upper) = to_plot
.iter()
.flatten()
.copied()
.flat_map(|(x, y)| [(FloatOrd(x), FloatOrd(y))])
.fold((FloatOrd(0.0), FloatOrd(0.0), FloatOrd(0.0), FloatOrd(0.0)),
|bounds, (x, y)|
(bounds.0.min(x),
bounds.1.max(x),
bounds.2.min(y),
bounds.3.max(y),
));
let root = BitMapBackend::new("output.png", (width, height)).into_drawing_area();
match root.fill(&WHITE) {
Ok(_) => (),
_ => {
unreachable!("Could not set backgrond color")
}
};
let root = root.margin(10, 10, 10, 10);
let mut chart = ChartBuilder::on(&root)
.x_label_area_size(20)
.y_label_area_size(40)
.build_cartesian_2d(x_lower.0..x_upper.0, y_lower.0..y_upper.0)?;
chart
.configure_mesh()
.x_labels(5)
.y_labels(5)
.y_label_formatter(&|x| format!("{x:.3}"))
.draw()?;
let colors = vec![&RED, &GREEN, &BLUE];
for (i, data) in to_plot.into_iter().enumerate() {
chart
.draw_series(LineSeries::new(data, colors[i % colors.len()]))?;
}
root.present()?;
Ok(())
}