如何实现四叉树批量插入坐标的z顺序排序-C++
How to implement z-order sort for coordinates for Quad-Tree bulk insertion - C++
根据改进的四叉树批量加载算法,在插入之前按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
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 插入或删除时获取usb的dos_name
- 叮叮当当在修复时插入多个"覆盖"说明符
- 链表c++插入,所有情况都已检查,但没有任何工作
- 将重物插入std::map
- 用于插入 std::unordered_set 的 3D 间坐标的唯一键