示例#1
0
    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);
                        }
                    }
                }
            }
        }
    }
示例#2
0
 public void Query(Vector3 pos, float radius, UKList<IUKSpatialObject> result)
 {
     foreach(var o in Objects) {
         result.Add(o);
     }
 }
示例#3
0
    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);
                }
            }
        }
    }