载入中...
搜索中...
未找到
QuadTree.h
浏览该文件的文档.
1#pragma once
2
3#include "spatial/Bounds.h"
4#include "spatial/QueryIds.h"
5
6#include <memory>
7#include <unordered_map>
8#include <vector>
9
10namespace eve::spatial {
11
17class QuadTree {
18public:
19 QuadTree(float minX, float minY, float maxX, float maxY, int maxDepth = 8,
20 int maxPerNode = 8);
21 ~QuadTree() = default;
22
23 QuadTree(const QuadTree &) = delete;
24 QuadTree &operator=(const QuadTree &) = delete;
25
26 void clear();
27 bool insert(int id, float minX, float minY, float maxX, float maxY);
28 bool remove(int id);
29 bool update(int id, float minX, float minY, float maxX, float maxY);
30 bool contains(int id) const;
31 int getCount() const { return static_cast<int>(items_.size()); }
32
33 int queryPoint(float x, float y);
34 int queryRect(float minX, float minY, float maxX, float maxY);
35 int queryCircle(float cx, float cy, float radius);
36
37 int getResultCount() const { return results_.getCount(); }
38 int getResultId(int index) const { return results_.getId(index); }
39
40 float getMinX() const { return rootBounds_.minX; }
41 float getMinY() const { return rootBounds_.minY; }
42 float getMaxX() const { return rootBounds_.maxX; }
43 float getMaxY() const { return rootBounds_.maxY; }
44 int getMaxDepth() const { return maxDepth_; }
45 int getMaxPerNode() const { return maxPerNode_; }
46
47private:
48 struct Node {
49 AABB2 bounds;
50 int depth = 0;
51 std::vector<int> itemIds;
52 std::unique_ptr<Node> children[4];
53 bool isLeaf() const { return children[0] == nullptr; }
54 };
55
56 void rebuild();
57 bool insertInto(Node &node, int id, const AABB2 &bounds);
58 void split(Node &node);
59 void collect(Node &node, const AABB2 *rect, float cx, float cy, float radius,
60 bool useCircle);
61 Node *ensureRoot();
62
63 AABB2 rootBounds_;
64 int maxDepth_ = 8;
65 int maxPerNode_ = 8;
66 std::unique_ptr<Node> root_;
67 std::unordered_map<int, AABB2> items_;
68 QueryIds results_;
69};
70
71} // namespace eve::spatial
float cx
Definition CardTypes.cpp:31
float cy
Definition CardTypes.cpp:32
int y
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
float depth
int children
Definition TreeMesh.cpp:177
Region quadtree for 2D AABB broad-phase / map culling. Items are stored in the smallest node that ful...
Definition QuadTree.h:17
QuadTree & operator=(const QuadTree &)=delete
float getMaxY() const
Definition QuadTree.h:43
bool contains(int id) const
Definition QuadTree.cpp:33
bool insert(int id, float minX, float minY, float maxX, float maxY)
Definition QuadTree.cpp:35
int getCount() const
Definition QuadTree.h:31
bool update(int id, float minX, float minY, float maxX, float maxY)
Definition QuadTree.cpp:56
int queryPoint(float x, float y)
Definition QuadTree.cpp:157
int getResultId(int index) const
Definition QuadTree.h:38
int getMaxPerNode() const
Definition QuadTree.h:45
float getMinY() const
Definition QuadTree.h:41
float getMaxX() const
Definition QuadTree.h:42
int queryRect(float minX, float minY, float maxX, float maxY)
Definition QuadTree.cpp:163
QuadTree(const QuadTree &)=delete
int queryCircle(float cx, float cy, float radius)
Definition QuadTree.cpp:170
int getResultCount() const
Definition QuadTree.h:37
float getMinX() const
Definition QuadTree.h:40
int getMaxDepth() const
Definition QuadTree.h:44
bool remove(int id)
Definition QuadTree.cpp:49
int getId(int index) const
Definition QueryIds.h:26
int getCount() const
Definition QueryIds.h:24