Personal tools

Library for colours

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m (Ooops! Meant to press preview, not save...)
Current revision (22:40, 8 December 2010) (edit) (undo)
(add link to hackag)
 
(2 intermediate revisions not shown.)
Line 1: Line 1:
[[Category:Code]]
[[Category:Code]]
-
Simple thing for working on colours in the RGB colours space. (The intention being that each component is in the interval 0 <= x <= 1.) You could just use tuples, but this library provides simple colour arithmetic.
+
''See also the more sophisticated [http://hackage.haskell.org/package/colour colour package] on Hackage.''
 +
 
 +
Simple thing for working on colours in the RGB colours space. (The intention being that each component is in the interval 0 &le; x &le; 1.) You could just use tuples, but this library provides simple colour arithmetic.
<haskell>
<haskell>
Line 42: Line 44:
cclip :: Colour -> Colour
cclip :: Colour -> Colour
cclip = cmap clip
cclip = cmap clip
-
 
-
quantinize :: Int -> Double -> Int
 
-
quantinize max v = floor (v * (fromIntegral max))
 
</haskell>
</haskell>

Current revision


See also the more sophisticated colour package on Hackage.

Simple thing for working on colours in the RGB colours space. (The intention being that each component is in the interval 0 ≤ x ≤ 1.) You could just use tuples, but this library provides simple colour arithmetic.

module Colour where
 
data Colour = Colour {red, green, blue :: Double} deriving (Eq, Show)
 
cmap :: (Double -> Double) -> Colour -> Colour
cmap f (Colour r g b) = Colour (f r) (f g) (f b)
 
czip :: (Double -> Double -> Double) -> Colour -> Colour -> Colour
czip f (Colour r1 g1 b1) (Colour r2 g2 b2) = Colour (f r1 r2) (f g1 g2) (f b1 b2)
 
cfold :: (Double -> Double -> Double) -> Colour -> Double
cfold f (Colour r g b) = r `f` g `f` b
 
cpromote :: Double -> Colour
cpromote x = Colour x x x
 
instance Num Colour where
  (+) = czip (+)
  (-) = czip (-)
  (*) = czip (*)
  negate = cmap negate
  abs    = cmap abs
  signum = cmap signum
  fromInteger x = cpromote (fromInteger x)
 
instance Fractional Colour where
  (/) = czip (/)
  recip = cmap recip
  fromRational x = cpromote (fromRational x)
 
clip :: (Num n, Ord n) => n -> n
clip n
  | n < 0 = 0
  | n > 1 = 1
  | otherwise = n
 
cclip :: Colour -> Colour
cclip = cmap clip