Tried out Google's AI response to the question of a C++ spatial hash and it kind of came close. This took some massaging but it could work.
parent
6f2fba4f7f
commit
98baa13264
@ -0,0 +1,70 @@ |
||||
#include <iostream> |
||||
#include <vector> |
||||
#include <unordered_map> |
||||
|
||||
struct Point { |
||||
int x, y; |
||||
|
||||
bool operator==(const Point& other) const { |
||||
return other.x == x && other.y == y; |
||||
} |
||||
}; |
||||
|
||||
struct Object { |
||||
Point position; |
||||
// Add other object data as needed
|
||||
}; |
||||
|
||||
struct PointHash { |
||||
size_t operator()(const Point& p) const { |
||||
return std::hash<int>()(p.x) ^ std::hash<int>()(p.y); |
||||
} |
||||
}; |
||||
|
||||
class SpatialHashTable { |
||||
public: |
||||
SpatialHashTable() {} |
||||
|
||||
void insert(Object* obj) { |
||||
table[obj->position].push_back(obj); |
||||
} |
||||
|
||||
std::vector<Object*> getNearbyObjects(Point position) { |
||||
std::vector<Object*> result; |
||||
Point cell = position; |
||||
|
||||
// Check the current cell and its 8 neighbors
|
||||
for (int x = cell.x - 1; x <= cell.x + 1; x++) { |
||||
for (int y = cell.y - 1; y <= cell.y + 1; y++) { |
||||
Point neighborCell = {x, y}; |
||||
auto it = table.find(neighborCell); |
||||
if (it != table.end()) { |
||||
result.insert(result.end(), it->second.begin(), it->second.end()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
private: |
||||
std::unordered_map<Point, std::vector<Object*>, PointHash> table; |
||||
}; |
||||
|
||||
int main() { |
||||
SpatialHashTable hashTable; |
||||
Object obj1 = {{5, 5}}; |
||||
Object obj2 = {{15, 15}}; |
||||
Object bomb = {{25, 25}}; |
||||
|
||||
hashTable.insert(&obj1); |
||||
hashTable.insert(&obj2); |
||||
hashTable.insert(&bomb); |
||||
|
||||
std::vector<Object*> nearby = hashTable.getNearbyObjects({24, 24}); |
||||
for (Object* obj : nearby) { |
||||
std::cout << obj->position.x << ", " << obj->position.y << std::endl; |
||||
} |
||||
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue