voronator 0.1.0

Implements the Voronoi diagram construction as a dual of the Delaunay triangulation for a set of points and the construction of a centroidal tesselation of a Delaunay triangulation.
Documentation
extern crate voronator;
extern crate plotters;
extern crate rand;

use voronator::delaunator::{triangulate_from_tuple};
use plotters::prelude::*;
use rand::prelude::*;
use rand_distr::Uniform;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut rng = rand::thread_rng();
    let range = Uniform::new(0., 1000.);
    let points: Vec<(f64, f64)> = (0..1000).map(|_| (rng.sample(&range), rng.sample(&range))).collect();
    
    let (t, ps) = triangulate_from_tuple(&points).expect("No triangulation exists for this input.");

    let root = BitMapBackend::new("plot.png", (960, 400)).into_drawing_area();
    root.fill(&WHITE)?;

    let root = root.apply_coord_spec(RangedCoord::<RangedCoordf32, RangedCoordf32>::new(
        0f32..1000f32,
        0f32..1000f32,
        (0..1000, 0..1000),
    ));

    for i in 0..t.len() {
        let i0 = t.triangles[3*i];
        let i1 = t.triangles[3*i + 1];
        let i2 = t.triangles[3*i + 2];

        let p = vec![(ps[i0].x as f32, ps[i0].y as f32), 
                     (ps[i1].x as f32, ps[i1].y as f32), 
                     (ps[i2].x as f32, ps[i2].y as f32)];
        
        let color = RGBColor{0: rng.gen(), 1: rng.gen(), 2: rng.gen()};
        let poly = Polygon::new(p.clone(), Into::<ShapeStyle>::into(&color));
        root.draw(&poly)?;
    }

    for point in &ps {
        let p = (point.x as f32, point.y as f32);
        root.draw(&Circle::new(p, 3, ShapeStyle::from(&BLACK).filled()))?;
    }   
 
    Ok(())
}