如何实现四叉树批量插入坐标的z顺序排序-C++

How to implement z-order sort for coordinates for Quad-Tree bulk insertion - C++

本文关键字:坐标 插入 顺序 -C++ 排序 何实现 实现 四叉树      更新时间:2023-10-16

根据改进的四叉树批量加载算法,在插入之前按z顺序排序坐标将加速四叉树的批量插入。

我需要在C++中实现z顺序。我有两个double的x,y坐标。维基百科中Z顺序曲线的解决方案我有点不清楚。

编辑-假设我的坐标是谷歌坐标,是浮点数。在我们目前开发的系统中,我们假设要插入的任何批量(批)都适合RAM。我们预计不需要在磁盘和内存之间进行交换的外部排序操作。

编辑2关于Z阶只适用于整数的事实,我认为诀窍是乘以10的倍数,直到所有数据都是整数。一旦我知道了,对点执行z顺序的方法是什么?

这是未经测试的代码,您应该仔细检查它是否有效。

此外,该代码几乎肯定是不可移植的,甚至可能是未定义的行为。至少这肯定是实现定义的行为,但可能没有具体说明。。。我必须更仔细地阅读有关reinterpret_cast往返char*的规则才能确定。

#include <cstdint>
#include <vector>
uint64_t reinterpretDoubleAsUInt(double d) {
  int const doubleSize = sizeof(double);
  char* array = reinterpret_cast<char*>(&d);
  uint64_t result = 0;
  for (auto i = 0; i < doubleSize; ++i) {
    result += (uint64_t)array[i] << (8*i);
  }
  return result;
}
bool lessThanZOrderDouble(std::vector<double> const& a, std::vector<double> const& b) {
  uint64_t j = 0;
  uint64_t x = 0;
  if (a.size() != b.size() || a.size() == 0) {
    throw std::exception();
  }
  int dimensions = a.size();
  for (auto i = 0; i < dimensions; ++i) {
    auto y = reinterpretDoubleAsUInt(a[i]) ^ reinterpretDoubleAsUInt(b[i]);
    if (x < y && x < (x ^ y)) {
      j = i;
      x = y;
    }
  }
  return (a[j] - b[j]) > 0;
}
int main() {
  // blank for compilation's sake
}