@@ -141,7 +141,10 @@ macro_rules! gen_key_points_comp {
141
141
' outer: loop {
142
142
let old_scale = scale;
143
143
for nxt in [ 2.0 , 5.0 , 10.0 ] . iter( ) {
144
- let new_left = range. 0 + scale / nxt - rem_euclid( range. 0 , scale / nxt) ;
144
+ let mut new_left = range. 0 - rem_euclid( range. 0 , scale / nxt) ;
145
+ if new_left < range. 0 {
146
+ new_left += scale / nxt;
147
+ }
145
148
let new_right = range. 1 - rem_euclid( range. 1 , scale / nxt) ;
146
149
147
150
let npoints = 1 + ( ( new_right - new_left) / old_scale * nxt) as usize ;
@@ -161,7 +164,13 @@ macro_rules! gen_key_points_comp {
161
164
// floating point error.
162
165
// In this case, we may loop forever. To avoid this, we need to use two variables to store
163
166
// the current left value. So we need keep a left_base and a left_relative.
164
- let left = range. 0 + scale - rem_euclid( range. 0 , scale) ;
167
+ let left = {
168
+ let mut value = range. 0 - rem_euclid( range. 0 , scale) ;
169
+ if value < range. 0 {
170
+ value += scale;
171
+ }
172
+ value
173
+ } ;
165
174
let left_base = ( left / value_granularity) . floor( ) * value_granularity;
166
175
let mut left_relative = left - left_base;
167
176
let right = range. 1 - rem_euclid( range. 1 , scale) ;
@@ -404,4 +413,12 @@ mod test {
404
413
let points = coord. key_points ( 500 ) ;
405
414
assert ! ( points. len( ) <= 500 ) ;
406
415
}
416
+
417
+ #[ test]
418
+ fn test_coord_follows_hint ( ) {
419
+ let coord: RangedCoordf64 = ( 1.0 ..2.0 ) . into ( ) ;
420
+ let points = coord. key_points ( 6 ) ;
421
+ assert_eq ! ( points. len( ) , 6 ) ;
422
+ assert_eq ! ( points[ 0 ] , 1.0 ) ;
423
+ }
407
424
}
0 commit comments