use std::fmt::Debug;
use std::fmt::Display;
use std::ops::AddAssign;
use approx::AbsDiffEq;
use float_next_after::NextAfter;
use geo::Coord;
use geo::CoordFloat;
use geo::HasKernel;
use num_traits::AsPrimitive;
use num_traits::Bounded;
use num_traits::FloatConst;
use num_traits::FromPrimitive;
use num_traits::Signed;
use d3_geo_rs::clip::circle::ClipCircleC;
use d3_geo_rs::clip::circle::ClipCircleU;
use d3_geo_rs::distance::distance;
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;
use super::Voronoi;
impl<'a, DRAIN, T>
Voronoi<
'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>
+ Bounded
+ CoordFloat
+ Display
+ Default
+ FloatConst
+ FromPrimitive
+ HasKernel
+ Signed
+ NextAfter,
{
pub fn find(&mut self, p: &Coord<T>, radius: Option<T>) -> Option<usize> {
match &self.delaunay {
None => None,
Some(delaunay_return) => {
self.found = (delaunay_return.find)(p, self.found);
match radius {
Some(radius) => match self.found {
Some(found) => {
if distance(p, &self.points[found]) < radius {
Some(found)
} else {
None
}
}
None => None,
},
None => self.found,
}
}
}
}
}