#![allow(clippy::many_single_char_names)]
mod cartesian;
mod circumcenters;
mod edges;
pub mod excess;
mod find;
pub mod generate;
mod hull;
mod mesh;
mod neighbors;
mod o_midpoint;
mod polygons;
mod triangles;
mod urquhart;
use std::cell::RefCell;
use std::collections::HashMap;
use std::collections::HashSet;
use std::fmt::Debug;
use std::ops::AddAssign;
use std::rc::Rc;
use approx::AbsDiffEq;
use derivative::Derivative;
use geo::CoordFloat;
use geo_types::Coord;
use num_traits::AsPrimitive;
use num_traits::FloatConst;
use num_traits::FromPrimitive;
use circumcenters::circumcenters;
use edges::edges;
use find::find;
use generate::from_points;
use hull::hull;
use mesh::mesh;
use neighbors::neighbors;
use polygons::Polygons;
use triangles::triangles;
use urquhart::urquhart;
use d3_delaunay_rs::delaunay::Delaunay as DelaunayInner;
use d3_geo_rs::clip::circle::ClipCircleC;
use d3_geo_rs::clip::circle::ClipCircleU;
use d3_geo_rs::projection::builder::template::NoPCNC;
use d3_geo_rs::projection::builder::template::NoPCNU;
use d3_geo_rs::projection::builder::template::ResampleNoPCNC;
use d3_geo_rs::projection::builder::template::ResampleNoPCNU;
use d3_geo_rs::projection::stereographic::Stereographic;
use d3_geo_rs::stream::Stream;
type FindReturn<'a, T> = Box<dyn Fn(&Coord<T>, Option<usize>) -> Option<usize> + 'a>;
type EdgeIndex = [usize; 2];
type TriIndex = [usize; 3];
type UTransform<T> = Box<dyn Fn(&Vec<T>) -> Vec<bool>>;
#[derive(Derivative)]
#[derivative(Debug)]
pub struct Delaunay<'a, CLIPC, CLIPU, DRAIN, PCNU, PR, RC, RU, T>
where
CLIPC: Clone,
CLIPU: Clone,
T: AbsDiffEq<Epsilon = T> + AddAssign + AsPrimitive<T> + CoordFloat + FloatConst,
{
#[derivative(Debug = "ignore")]
pub delaunay: DelaunayInner<CLIPC, CLIPU, DRAIN, PCNU, PR, RC, RU, T>,
pub edges: Rc<HashSet<EdgeIndex>>,
pub triangles: Rc<Vec<[usize; 3]>>,
pub centers: Vec<Coord<T>>,
pub neighbors: Rc<RefCell<HashMap<usize, Vec<usize>>>>,
pub polygons: Vec<Vec<usize>>,
pub mesh: Vec<EdgeIndex>,
pub hull: Vec<usize>,
#[derivative(Debug = "ignore")]
pub urquhart: UTransform<T>,
#[derivative(Debug = "ignore")]
pub find: FindReturn<'a, T>,
}
impl<'a, DRAIN, T>
Delaunay<
'a,
ClipCircleC<ResampleNoPCNC<DRAIN, Stereographic<DRAIN, T>, T>, T>,
ClipCircleU<ResampleNoPCNC<DRAIN, Stereographic<DRAIN, T>, T>, T>,
DRAIN,
NoPCNU,
Stereographic<DRAIN, T>,
ResampleNoPCNC<DRAIN, Stereographic<DRAIN, T>, T>,
ResampleNoPCNU<Stereographic<DRAIN, T>, T>,
T,
>
where
DRAIN: Clone + Debug + Stream<EP = DRAIN, T = T> + Default,
T: AbsDiffEq<Epsilon = T>
+ AddAssign
+ AsPrimitive<T>
+ CoordFloat
+ Default
+ FloatConst
+ FromPrimitive,
{
#[must_use]
pub fn new(points: Rc<Vec<Coord<T>>>) -> Option<Self> {
let p = points.clone();
match from_points::<
DRAIN,
NoPCNC<DRAIN>,
NoPCNC<DRAIN>,
ResampleNoPCNC<DRAIN, Stereographic<DRAIN, T>, T>,
ResampleNoPCNU<Stereographic<DRAIN, T>, T>,
T,
>(&p)
{
Some(delaunay) => {
let tri = Rc::new(triangles(&delaunay));
let e = Rc::new(edges(&tri, &points));
let circumcenters = circumcenters(&tri, &points);
let (polys, centers) =
Polygons::default().gen(circumcenters.collect(), tri.clone(), &points);
let n = Rc::new(RefCell::new(neighbors(&tri, points.len())));
return Some(Self {
delaunay,
edges: e.clone(),
centers,
hull: hull(&tri, &points),
find: find(n.clone(), points),
neighbors: n,
mesh: mesh(&polys),
polygons: polys,
urquhart: urquhart(e, tri.clone()),
triangles: tri,
});
}
None => None,
}
}
}