{-# LANGUAGE FlexibleInstances #-} module Graphics.Transformation ( TransformationMatrix , fromElements , identityTransform , mirrorYTransform , multiply , translateTransform , scaleTransform , Transform(..) ) where import Data.Matrix as M import Graphics.Point import Graphics.Path type TransformationMatrix = Matrix Double identityTransform :: TransformationMatrix identityTransform = identity 3 mirrorYTransform :: Double -> Double -> TransformationMatrix mirrorYTransform _ h = fromElements [1, 0, 0, -1, 0, h] translateTransform :: Double -> Double -> TransformationMatrix translateTransform x y = fromElements [1, 0, 0, 1, x, y] scaleTransform :: Double -> Double -> TransformationMatrix scaleTransform sx sy = fromElements [sx, 0, 0, sy, 0, 0] multiply :: TransformationMatrix -> TransformationMatrix -> TransformationMatrix multiply = multStd fromElements :: [Double] -> TransformationMatrix fromElements [a,b,c,d,e,f] = fromList 3 3 [a,c,e,b,d,f,0,0,1] fromElements _ = error "Malformed transformation matrix" class Transform t where transform :: TransformationMatrix -> t -> t instance Transform Point where transform m (x,y) = (a * x + c * y + e, b * x + d * y + f) where (a:c:e:b:d:f:_) = M.toList m instance Transform PathCommand where transform m (MoveTo p) = MoveTo (transform m p) transform m (LineTo p) = LineTo (transform m p) transform m (ArcTo p1 p2 d) = ArcTo (transform m p1) (transform m p2) d transform m (BezierTo c1 c2 p2) = BezierTo (transform m c1) (transform m c2) (transform m p2)