Generating tileable terrain using Perlin Noise [duplicate]
- by terrorcell
This question already has an answer here:
    
        
            How do you generate tileable Perlin noise?
                
                    9 answers
                
        
    
            I'm having trouble figuring out the solution to this particular algorithm.
I'm using the Perlin Noise implementation from: https://code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/main/java/mikera/math/PerlinNoise.java
Here's what I have so far:
for (Chunk chunk : chunks)
    {
        PerlinNoise noise = new PerlinNoise();
        for (int y = 0; y < CHUNK_SIZE_HEIGHT; ++y)
        {
            for (int x = 0; x < CHUNK_SIZE_WIDTH; ++x)
            {
                int index = get1DIndex(y, CHUNK_SIZE_WIDTH, x);
                float val = 0;
                for (int i = 2; i <= 32; i *= i)
                {
                    double n = noise.tileableNoise2(i * x / (float)CHUNK_SIZE_WIDTH, i * y / (float)CHUNK_SIZE_HEIGHT, CHUNK_SIZE_WIDTH, CHUNK_SIZE_HEIGHT);                        
                    val += n / i;
                }
                // chunk tile at [index] gets set to the colour 'val'
            }
        }
    }
Which produces something like this:
Each chunk is made up of CHUNK_SIZE number of tiles, and each tile has a TILE_SIZE_WIDTH/HEIGHT. I think it has something to do with the inner-most for loop and the x/y co-ords given to the noise function, but I could be wrong.
Solved:
PerlinNoise noise = new PerlinNoise();
for (Chunk chunk : chunks)
    {
        for (int y = 0; y < CHUNK_SIZE_HEIGHT; ++y)
        {
            for (int x = 0; x < CHUNK_SIZE_WIDTH; ++x)
            {
                int index = get1DIndex(y, CHUNK_SIZE_WIDTH, x);
                float val = 0;
                float xx = x * TILE_SIZE_WIDTH + chunk.x;
                float yy = y * TILE_SIZE_HEIGHT + chunk.h;
                int w = CHUNK_SIZE_WIDTH * TILE_SIZE_WIDTH;
                int h = CHUNK_SIZE_HEIGHT * TILE_SIZE_HEIGHT;
                for (int i = 2; i <= 32; i *= i)
                {
                    double n = noise.tileableNoise2(i * xx / (float)w, i * yy / (float)h, w, h);                        
                    val += n / i;
                }
                // chunk tile at [index] gets set to the colour 'val'
            }
        }
    }