PerlinNoise implementation