packages feed

hevolisa-0.0: Hevolisa/Shapes/DnaBrush.hs

--
-- Module      : DnaBrush
-- Copyright   : (c) Daniel Neun 2008
-- License     : BSD-style
-- Maintainer  : daniel.neun@gmx.de
-- Stability   : experimental
-- Portability : portable

module Hevolisa.Shapes.DnaBrush (
                 DnaBrush,
                         
                 -- * Accessors
                 red, green, blue, alpha
) where

import Hevolisa.Settings
import Hevolisa.Tools

-- |Brush to color polygons
data DnaBrush = DnaBrush {
      red   :: Integer,
      green :: Integer,
      blue  :: Integer,
      alpha :: Integer 
} deriving (Show,Eq,Read)

-- |Brush is mutable
instance Mutable DnaBrush where
    mutate = mutateBrush

-- |Initialize brush with random garbage
instance RandomInit DnaBrush where
    randomInit = do r <- getRandomNumber 0 255
                    g <- getRandomNumber 0 255
                    b <- getRandomNumber 0 255
                    a <- getRandomNumber 10 60
                    return (DnaBrush r g b a)

-- |Change the brush values in a semi random way, rates can be adjusted
mutateBrush :: DnaBrush -> IO DnaBrush
mutateBrush (DnaBrush r g b a) = do r <- maybeMutate_ r activeRedMutationRate 
                                         activeRedRangeMin activeRedRangeMax
                                    g <- maybeMutate_ g activeGreenMutationRate 
                                         activeGreenRangeMin activeGreenRangeMax
                                    b <- maybeMutate_ b activeBlueMutationRate 
                                         activeBlueRangeMin activeBlueRangeMax
                                    a <- maybeMutate_ a activeAlphaMutationRate 
                                         activeAlphaRangeMin activeAlphaRangeMax
                                    return (DnaBrush r g b a)
    where
      -- |Mutate a one-dimensional value
      maybeMutate_ :: Integer    -- ^ The unchanged value to pass through
                   -> Integer    -- ^ Mutation rate
                   -> Integer    -- ^ Minimum for random numbers
                   -> Integer    -- ^ Maximum for random numbers
                   -> IO Integer -- ^ Changed value
      maybeMutate_ unchanged rate min max = maybeMutate rate (getRandomNumber min max) unchanged