Investigate: use a bucket sequence with more locality
Latios96 opened this issue · comments
Jan Honsbrok commented
- implement Hilbert curve (see https://github.com/jakubcerveny/gilbert)
- implement Morton curve (generate Buckets and sort them by the morton coordinate of their center) See this library to generate the morton codes
DoubleSpiralSequence (for reference)
class DoubleSpiralSequence : public BucketSequence {
public:
DoubleSpiralSequence(const Resolution &resolution, int bucketWidth);
std::vector<ImageBucket> getTiles() override;
};
DoubleSpiralSequence::DoubleSpiralSequence(const Resolution &resolution, int bucketWidth)
: BucketSequence(resolution, bucketWidth) {
}
std::vector<ImageBucket> DoubleSpiralSequence::getTiles() {
std::vector<ImageBucket> allBuckets;
SpiralSequence spiralSequence(resolution, 16);
std::vector<ImageBucket> firstSpiralBuckets = spiralSequence.getTiles();
std::vector<ImageBucket> bucketsInBucket;
for (auto &bucket : firstSpiralBuckets) {
LineByLineSequence sequenceInBucket(Resolution::deduce(bucket), 8);
bucketsInBucket = sequenceInBucket.getTiles();
for (auto &b : bucketsInBucket) {
b = ImageBucket(b.getPosition() + bucket.getPosition(), b.getWidth(), b.getHeight());
}
allBuckets.reserve(allBuckets.size() + distance(bucketsInBucket.begin(), bucketsInBucket.end()));
allBuckets.insert(allBuckets.end(), bucketsInBucket.begin(), bucketsInBucket.end());
}
return allBuckets;
}
Jan Honsbrok commented