hsnoise-0.0.1: src/Numeric/Noise/Perlin.hs
-- Copyright (c) 2011, Colin Hill
-- | Implementation of Perlin noise.
module Numeric.Noise.Perlin (
Perlin(..),
noiseValue
) where
import Numeric.Noise
-- | Perlin noise function.
data Perlin =
-- | Constructs a perlin noise function given a 'Seed', number of octaves, scale, and
-- persistance.
Perlin Seed Int Double Double
-- | Implementation of 'Noise' for 'Perlin'.
instance Noise Perlin where
-- | Returns a perlin noise value given a 'Perlin' function and a point.
noiseValue nf xyz = max (-1.0) (min 1.0 noise)
where Perlin _ octs _ _ = nf
noise = perlinNoise nf octs 0 1.0 1.0 xyz
-- | Evaluates a given number of octaves of perlin noise holding the total, amplitude
-- and frequency in the arguments.
perlinNoise :: Perlin -> Int -> Double -> Double -> Double -> Point -> Double
perlinNoise nf 0 t freq amp xyz = t
perlinNoise nf o t freq amp xyz = t + perlinNoise nf (o - 1) t' (freq * 2.0) (amp * persist) xyz
where Perlin seed _ scale persist = nf
(x, y, z) = xyz
(x', y', z') = (x * scale * freq, y * scale * freq, z * scale * freq)
t' = coherentNoise seed (x', y', z') * amp