d3_geo_rs/projection/builder/
precision_set.rs

1use core::marker::PhantomData;
2
3use geo::CoordFloat;
4use num_traits::FloatConst;
5
6use crate::clip::antimeridian::interpolate::Interpolate as InterpolateAntimeridian;
7use crate::clip::antimeridian::line::Line as LineAntimeridian;
8use crate::clip::antimeridian::ClipAntimeridianU;
9use crate::clip::circle::interpolate::Interpolate as InterpolateCircle;
10use crate::clip::circle::line::Line as LineCircle;
11use crate::clip::circle::ClipCircleU;
12use crate::clip::clipper::Clipper;
13use crate::projection::resampler::none::None;
14use crate::projection::resampler::resample::Connected as ConnectedResample;
15use crate::projection::resampler::resample::Resample;
16use crate::projection::PrecisionSet;
17use crate::stream::Connected;
18use crate::stream::Unconnected;
19use crate::Transform;
20
21use super::template::ResampleNonePCNC;
22use super::template::ResamplePCNC;
23use super::Builder;
24
25impl<DRAIN, PR, PCNC, PCNU, T> PrecisionSet
26    for Builder<
27        ClipAntimeridianU<None<PR, Connected<PCNC>, T>, T>,
28        DRAIN,
29        PCNU,
30        PR,
31        None<PR, Unconnected, T>,
32        T,
33    >
34where
35    PCNU: Clone,
36    PR: Clone + Transform<T = T>,
37    T: 'static + CoordFloat + Default + FloatConst,
38{
39    type Output = Builder<
40        ClipAntimeridianU<Resample<PR, ConnectedResample<PCNC, T>, T>, T>,
41        DRAIN,
42        PCNU,
43        PR,
44        Resample<PR, Unconnected, T>,
45        T,
46    >;
47    type T = T;
48
49    /// Set the projection builder precision
50    ///
51    /// delta is related to clip angle.
52    fn precision_set(&self, delta: &T) -> Self::Output {
53        let interpolator = InterpolateAntimeridian::default();
54        let line = LineAntimeridian::default();
55        let delta2 = *delta * *delta;
56        let resample = Resample::new(self.project_transform.clone(), delta2);
57        // Architecture Discussion:
58        // CLIP is generic over <.. RC, RU,..>,
59        // So a change in the resample type causes rebuilding of clip.
60        let clip = Clipper::new(interpolator, line, self.clip.start);
61
62        // Copy - Mutate.
63        Self::Output {
64            p_d: PhantomData::<DRAIN>,
65            sx: self.sx,
66            sy: self.sy,
67            x: self.x,
68            y: self.y,
69            t360: self.t360,
70            theta: self.theta,
71            rotate: self.rotate.clone(),
72            rotator: self.rotator.clone(),
73            project_transform: self.project_transform.clone(),
74            project_rotate_transform: self.project_rotate_transform.clone(),
75            postclip: self.postclip.clone(),
76            alpha: self.alpha,
77            lambda: self.lambda,
78            phi: self.phi,
79            projection_raw: self.projection_raw.clone(),
80            k: self.k,
81            delta_lambda: self.delta_lambda,
82            delta_phi: self.delta_phi,
83            delta_gamma: self.delta_gamma,
84            clip,
85
86            // Mutate section.
87            delta2,
88            resample,
89        }
90    }
91}
92
93impl<DRAIN, PR, PCNU, T> PrecisionSet
94    for Builder<
95        ClipCircleU<ResampleNonePCNC<DRAIN, PR, T>, T>,
96        DRAIN,
97        PCNU,
98        PR,
99        None<PR, Unconnected, T>,
100        T,
101    >
102where
103    PCNU: Clone,
104    PR: Clone + Transform<T = T>,
105    T: 'static + CoordFloat + FloatConst,
106{
107    type Output = Builder<
108        ClipCircleU<ResamplePCNC<DRAIN, PR, T>, T>,
109        DRAIN,
110        PCNU,
111        PR,
112        Resample<PR, Unconnected, T>,
113        T,
114    >;
115    type T = T;
116
117    /// Set the projection builder precision
118    ///
119    /// delta is related to clip angle.
120    fn precision_set(&self, delta: &T) -> Self::Output {
121        let radius = self.clip.interpolator.radius;
122        let interpolator = InterpolateCircle::new(radius);
123        let line = LineCircle::default();
124        let delta2 = *delta * *delta;
125        let resample = Resample::new(self.project_transform.clone(), delta2);
126        // Architecture Discussion:
127        // CLIP is generic over <.. RC, RU,..>,
128        // So a change in the resample type causes rebuilding of clip.
129        let clip = Clipper::new(interpolator, line, self.clip.start);
130
131        // Copy - Mutate.
132        Self::Output {
133            p_d: PhantomData::<DRAIN>,
134            sx: self.sx,
135            sy: self.sy,
136            x: self.x,
137            y: self.y,
138            t360: self.t360,
139            theta: self.theta,
140            rotate: self.rotate.clone(),
141            rotator: self.rotator.clone(),
142            project_transform: self.project_transform.clone(),
143            project_rotate_transform: self.project_rotate_transform.clone(),
144            postclip: self.postclip.clone(),
145            alpha: self.alpha,
146            lambda: self.lambda,
147            phi: self.phi,
148            projection_raw: self.projection_raw.clone(),
149            k: self.k,
150            delta_lambda: self.delta_lambda,
151            delta_phi: self.delta_phi,
152            delta_gamma: self.delta_gamma,
153            clip,
154
155            // Mutate section.
156            delta2,
157            resample,
158        }
159    }
160}