载入中...
搜索中...
未找到
SpatialHash2D.h
浏览该文件的文档.
1#pragma once
2
3#include "spatial/Bounds.h"
4#include "spatial/QueryIds.h"
5
6#include <unordered_map>
7#include <unordered_set>
8#include <vector>
9
10namespace eve::spatial {
11
17public:
18 explicit SpatialHash2D(float cellSize = 64.f);
19 ~SpatialHash2D() = default;
20
21 SpatialHash2D(const SpatialHash2D &) = delete;
23
24 void clear();
25 void setCellSize(float cellSize);
26 float getCellSize() const { return cellSize_; }
27
28 bool insert(int id, float minX, float minY, float maxX, float maxY);
29 bool remove(int id);
30 bool update(int id, float minX, float minY, float maxX, float maxY);
31 bool contains(int id) const;
32 int getCount() const { return static_cast<int>(items_.size()); }
33
34 int queryPoint(float x, float y);
35 int queryRect(float minX, float minY, float maxX, float maxY);
36 int queryCircle(float cx, float cy, float radius);
37
38 int getResultCount() const { return results_.getCount(); }
39 int getResultId(int index) const { return results_.getId(index); }
40
41private:
42 void cellRange(const AABB2 &b, int &minCX, int &minCY, int &maxCX, int &maxCY) const;
43 void insertCells(int id, const AABB2 &b);
44 void eraseCells(int id, const AABB2 &b);
45 void queryCells(int minCX, int minCY, int maxCX, int maxCY, const AABB2 *rect, float cx,
46 float cy, float radius, bool useCircle, bool usePoint);
47
48 float cellSize_ = 64.f;
49 std::unordered_map<int, AABB2> items_;
50 std::unordered_map<uint64_t, std::vector<int>> cells_;
51 QueryIds results_;
52};
53
54} // 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
uint32_t b
Last-query hit buffer shared by spatial indexes. Script pattern: call query* → getResultCount / getRe...
Definition QueryIds.h:11
int getId(int index) const
Definition QueryIds.h:26
int getCount() const
Definition QueryIds.h:24
Uniform-grid spatial hash for 2D AABB queries (map / particle / entity culling). Items are registered...
int getResultId(int index) const
SpatialHash2D & operator=(const SpatialHash2D &)=delete
bool contains(int id) const
bool update(int id, float minX, float minY, float maxX, float maxY)
SpatialHash2D(const SpatialHash2D &)=delete
void setCellSize(float cellSize)
int queryPoint(float x, float y)
int queryRect(float minX, float minY, float maxX, float maxY)
int queryCircle(float cx, float cy, float radius)
bool insert(int id, float minX, float minY, float maxX, float maxY)