class Grid<T> {
private T[,,] grid;
private int minX, minY, minZ;
private int maxX, maxY, maxZ;
public Grid() {
}
public Grid(int minX, int minY, int minZ,
int maxX, int maxY, int maxZ) {
this.minX = minX;
this.minY = minY;
this.minZ = minZ;
this.maxX = maxX;
this.maxY = maxY;
this.maxZ = maxZ;
int sizeX = maxX-minX;
int sizeY = maxY-minY;
int sizeZ = maxZ-minZ;
grid = new T[sizeZ, sizeY, sizeX];
}
public T Get(int x, int y, int z) {
return grid[z-minZ, y-minY, x-minX];
}
public void Set(T obj, int x, int y, int z) {
int dMinX = 0, dMinY = 0, dMinZ = 0;
int dMaxX = 0, dMaxY = 0, dMaxZ = 0;
if(x < minX) dMinX = x-minX;
if(y < minY) dMinY = y-minY;
if(z < minZ) dMinZ = z-minZ;
if(x >= maxX) dMaxX = x-maxX+1;
if(y >= maxY) dMaxY = y-maxY+1;
if(z >= maxZ) dMaxZ = z-maxZ+1;
IncreaseMap(dMinX, dMinY, dMinZ,
dMaxX, dMaxY, dMaxZ);
grid[z-minZ, y-minY, x-minX] = obj;
}
private void IncreaseMap(int dMinX, int dMinY, int dMinZ,
int dMaxX, int dMaxY, int dMaxZ) {
int oldMinX = minX;
int oldMinY = minY;
int oldMinZ = minZ;
int oldMaxX = maxX;
int oldMaxY = maxY;
int oldMaxZ = maxZ;
T[,,] oldGrid = grid;
minX += dMinX;
minY += dMinY;
minZ += dMinZ;
maxX += dMaxX;
maxY += dMaxY;
maxZ += dMaxZ;
int sizeX = maxX-minX;
int sizeY = maxY-minY;
int sizeZ = maxZ-minZ;
grid = new T[sizeZ, sizeY, sizeX];
for(int z=oldMinZ; z<oldMaxZ; z++) {
for(int y=oldMinY; y<oldMaxY; y++) {
for(int x=oldMinX; x<oldMaxX; x++) {
grid[z-minZ, y-minY, x-minX] = oldGrid[z-oldMinZ, y-oldMinY, x-oldMinX];
}
}
}
}
}