对于一些背景信息,我尝试使用字典查找创建快速四叉树生成算法。基本概念涉及通过二进制表示将坐标映射到四叉树节点:
struct vec2 { // Test coordinate object
double x, y; // replacing double with signed int everywhere does not achieve results either
vec2(const double& x = NULL, const double& y = NULL)
: x(x), y(y) {}
friend std::ostream& operator<<(std::ostream& os, vec2 vector)
{
return os << "(" << vector.x << ", " << vector.y << ")\n";
}
bool operator()(const vec2& lhs, const vec2& rhs) const
{
/* TODO: make proper sorting function */
if ((lhs.x < rhs.x) && (lhs.y < rhs.y)) {
return true;
}
if (std::hypot(lhs.x, lhs.y) < std::hypot(rhs.x, rhs.y)) {
return true;
}
return false;
}
};
std::map<vec2, std::bitset<4>, vec2> nodeLoc = { // quadtree node mapping
{ ( 1, 1), 1000 }, // first quadrant
{ (-1, 1), 0100 }, // second quadrant
{ (-1,-1), 0010 }, // third quadrant
{ ( 1,-1), 0001 }, // fourth quadrant
{ ( 0, 0), 0000 },
{ ( 0, 1), 1100 }, // first and second
{ ( 0,-1), 0011 }, // third and fourth
{ ( 1, 0), 1001 }, // first and fourth
{ (-1, 0), 0110 }, // second and third
};
int main() {
std::cout << nodeLoc[(-1, -1)];
return 0;
}
main 函数应该打印0010
到控制台,但它却打印了1000
。地图函数正在识别(-1, -1)
,(1, 1)
但我认为 的定义bool operator()
会阻止它们被识别为相同的输入。我尝试创建一个哈希函数来与 an 一起使用std::unordered_map
,但最终遇到了类似的问题(尽管有点不同,因为(-1,1)
会映射相同的(1,-1)
值)。
如何在带符号的坐标与其二进制节点表示之间正确创建映射?
编译器可以指出代码中的两个严重错误:
没有空引用
首先,您所做的本质上是
const double& x = 0
在该代码中。C++ 中不存在空引用之类的东西,这看起来就像您想要创建的那样。也不是说 aconst&
可以绑定到临时值(临时物化),以便代码可以编译。要解决此问题,请完全删除构造函数,这会生成
vec2
聚合类型。或者:(1, 1)
是一个逗号表达式,而不是构造函数调用第二个错误是使用以下语法:
(1, 1)
不做vec2(1, 1)
,它使用逗号运算符,其中左侧1
被丢弃,右侧1
用于调用vec2(1)
。您的原始构造函数只需一个参数即可调用,但不是,因此可以进行从到 的explicit
隐式转换。1
vec2
要解决此问题,请使用
{ { 1, 1}, 1000 }
,其中内部{ 1, 1}
相当于vec2(1, 1)
。进一步说明
1000
是十进制文字;0b1000
你应该在初始化时提供一个二进制文字std::bitset
vec2
不应该是提供给 的函数对象std::map
;你可以简单地变成operator()
并operator<
使用std::map<vec2, std::bitset<4>>
nodeLoc
应该被声明为const
理想的,而不是nodeLoc[(x, y)]
(也使用逗号运算符),写nodeLoc.at({x, y})
请参阅编译器资源管理器中的实时示例,其中已实施所有更改