d3_geo_rs/projection/builder/
precision_set.rs1use 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 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 let clip = Clipper::new(interpolator, line, self.clip.start);
61
62 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 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 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 let clip = Clipper::new(interpolator, line, self.clip.start);
130
131 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 delta2,
157 resample,
158 }
159 }
160}