public static double[][] getFastNoise2D( Noise noise, int xSize, int zSize, int samplingRate, int x, int y, int z, int xZoom, int zZoom) { if (samplingRate == 0) { throw new IllegalArgumentException("samplingRate cannot be 0"); } if (xSize % samplingRate != 0) { throw new IllegalArgumentException("xSize % samplingRate must return 0"); } if (zSize % samplingRate != 0) { throw new IllegalArgumentException("zSize % samplingRate must return 0"); } double[][] noiseArray = new double[xSize + 1][zSize + 1]; for (int xx = 0; xx <= xSize; xx += samplingRate) { noiseArray[xx] = new double[zSize + 1]; for (int zz = 0; zz <= zSize; zz += samplingRate) { noiseArray[xx][zz] = noise.noise3D((x + xx) >> xZoom, y, (z + zz) >> zZoom); } } for (int xx = 0; xx < xSize; ++xx) { if (xx % samplingRate != 0) { noiseArray[xx] = new double[zSize + 1]; } for (int zz = 0; zz < zSize; ++zz) { if (xx % samplingRate != 0 || zz % samplingRate != 0) { int nx = xx / samplingRate * samplingRate; int nz = zz / samplingRate * samplingRate; noiseArray[xx][zz] = Noise.bilinearLerp( xx, zz, noiseArray[nx][nz], noiseArray[nx][nz + samplingRate], noiseArray[nx + samplingRate][nz], noiseArray[nx + samplingRate][nz + samplingRate], nx, nx + samplingRate, nz, nz + samplingRate); } } } return noiseArray; }