|
1 | | -use super::numeric::RangedCoordusize; |
2 | 1 | use super::{AsRangedCoord, DiscreteRanged, KeyPointHint, Ranged, ValueFormatter}; |
3 | 2 | use std::ops::Range; |
4 | 3 |
|
@@ -64,11 +63,35 @@ impl<T: DiscreteRanged> Ranged for GroupBy<T> { |
64 | 63 | } |
65 | 64 | // TODO: See issue issue #88 |
66 | 65 | fn key_points<HintType: KeyPointHint>(&self, hint: HintType) -> Vec<T::ValueType> { |
67 | | - let range = 0..(self.0.size() + self.1 - 1) / self.1; |
68 | | - let logic_range: RangedCoordusize = range.into(); |
| 66 | + let range = 0..(self.0.size() + self.1) / self.1; |
| 67 | + //let logic_range: RangedCoordusize = range.into(); |
69 | 68 |
|
70 | | - logic_range |
71 | | - .key_points(hint) |
| 69 | + let interval = |
| 70 | + ((range.end - range.start + hint.bold_points() - 1) / hint.bold_points()).max(1); |
| 71 | + let count = (range.end - range.start) / interval; |
| 72 | + |
| 73 | + let idx_iter = (0..hint.bold_points()).map(|x| x * interval); |
| 74 | + |
| 75 | + if hint.weight().allow_light_points() && count < hint.bold_points() * 2 { |
| 76 | + let outter_ticks = idx_iter; |
| 77 | + let outter_tick_size = interval * self.1; |
| 78 | + let inner_ticks_per_group = hint.max_num_points() / outter_ticks.len(); |
| 79 | + let inner_ticks = |
| 80 | + (outter_tick_size + inner_ticks_per_group - 1) / inner_ticks_per_group; |
| 81 | + let inner_ticks: Vec<_> = (0..(outter_tick_size / inner_ticks)) |
| 82 | + .map(move |x| x * inner_ticks) |
| 83 | + .collect(); |
| 84 | + let size = self.0.size(); |
| 85 | + return outter_ticks |
| 86 | + .into_iter() |
| 87 | + .map(|base| inner_ticks.iter().map(move |&ofs| base * self.1 + ofs)) |
| 88 | + .flatten() |
| 89 | + .take_while(|&idx| idx < size) |
| 90 | + .map(|x| self.0.from_index(x).unwrap()) |
| 91 | + .collect(); |
| 92 | + } |
| 93 | + |
| 94 | + idx_iter |
72 | 95 | .into_iter() |
73 | 96 | .map(|x| self.0.from_index(x * self.1).unwrap()) |
74 | 97 | .collect() |
|
0 commit comments