module Graphics.PDF.Geometry
(
Angle(..)
, Matrix
, rotate, translate, scale, applyMatrix, identity
)
where
import Graphics.PDF.LowLevel
data Angle = Degree Float
| Radian Float
newtype Matrix = Matrix(Float,Float,Float,Float,Float,Float) deriving (Eq)
identity :: Matrix
identity = Matrix(1.0,0,0,1.0,0,0)
instance Show Matrix where
show (Matrix(ma,mb,mc,md,me,mf)) = "Matrix " ++ (unwords [(show ma),(show mb),(show mc),(show md),(show me),(show mf)])
instance Num Matrix where
(+) (Matrix(ma,mb,mc,md,me,mf)) (Matrix(na,nb,nc,nd,ne,nf)) =
Matrix( (ma+na), (mb+nb), (mc+nc), (md+nd), (me+ne), (mf+nf))
(*) (Matrix(ma,mb,mc,md,me,mf)) (Matrix(na,nb,nc,nd,ne,nf)) =
Matrix( (ma*na+mb*nc), (ma*nb + mb*nd ), (mc*na+md*nc), (mc*nb +md*nd), (me*na+mf*nc+ne), (me*nb+mf*nd+nf))
negate (Matrix(ma,mb,mc,md,me,mf)) =
Matrix( (ma), (mb), (mc), (md), (me), (mf))
abs m = m
signum _ = identity
fromInteger i = Matrix(r,0,0,r, 0, 0)
where
r = fromInteger i
applyMatrix :: Matrix -> PdfCmd
applyMatrix (Matrix(a,b,c,d,e,f)) = (PdfCM a b c d e f,[])
rotate :: Angle -> Matrix
rotate r = Matrix ((cos(radian)), (sin(radian)), (sin(radian)) ,(cos(radian)), 0, 0)
where
radian = case r of
Degree angle -> angle / 180 * pi
Radian angle -> angle
translate :: Float -> Float -> Matrix
translate tx ty = Matrix( 1, 0, 0, 1 ,tx ,ty)
scale :: Float -> Float -> Matrix
scale sx sy = Matrix (sx, 0, 0, sy, 0 ,0 )