public void Query(Vector3 pos, float radius, UKList<IUKSpatialObject> result) { var b = new Bounds(pos, Vector3.one * radius * 2f); int minx = Mathf.FloorToInt(b.min.x / CELL_SIZE); int miny = Mathf.FloorToInt(b.min.y / CELL_SIZE); int minz = Mathf.FloorToInt(b.min.z / CELL_SIZE); int maxx = Mathf.FloorToInt(b.max.x / CELL_SIZE); int maxy = Mathf.FloorToInt(b.max.y / CELL_SIZE); int maxz = Mathf.FloorToInt(b.max.z / CELL_SIZE); for (int z = minz; z <= maxz; ++z) { for (int y = miny; y <= maxy; ++y) { for (int x = minx; x <= maxx; ++x) { var h = CalculateHash(x,y,z); if (spatialHashTable.ContainsKey(h)) { var l = spatialHashTable[h]; foreach(var p in l) { result.Add(p.Key); } } } } } }
public void Query(Vector3 pos, float radius, UKList<IUKSpatialObject> result) { foreach(var o in Objects) { result.Add(o); } }
public void Query(Vector3 pos, float radius, UKList<IUKSpatialObject> result) { int cx = Mathf.FloorToInt(pos.x / CELL_SIZE); //int cy = Mathf.FloorToInt(pos.y / CELL_SIZE); int cz = Mathf.FloorToInt(pos.z / CELL_SIZE); int d = Mathf.FloorToInt(radius / CELL_SIZE); bool addOverlap = false; // XZ for (int x = cx-d; x <= cx+d; ++x) { for (int z = cz-d; z <= cz+d; ++z) { var index = CalculateIndex(x,z); if (index >= 0) { EnsureIndex(index); var l = grid[index]; foreach(var o in l.Keys) { result.Add(o); } } else { addOverlap = true; } } } if (addOverlap) { foreach(var o in overlap.Keys) { var p = o.SpatialPosition(); var minAxisDist = Mathf.Min(Mathf.Abs(p.x - pos.x), Mathf.Abs(p.z - pos.z)); if (minAxisDist <= o.SpatialRadius() + radius) { result.Add(o); } } } }