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.

main
Zed A. Shaw 1 month ago
parent 6f2fba4f7f
commit 98baa13264
  1. 5
      meson.build
  2. 70
      scratchpad/collider.cpp

@ -38,4 +38,9 @@ myecstest = executable('myecstest', [
], ],
dependencies: dependencies) dependencies: dependencies)
collider = executable('collider', [
'./scratchpad/collider.cpp'
],
dependencies: dependencies)
test('tests', runtests) test('tests', runtests)

@ -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…
Cancel
Save