> module GeomNum
Defines the Geometric Number class and gives instances
for LazyRationals only at present.
> (GeomNumb(..),Numb,Rationals,grid,rnd2
> )
> where
> import Params (renderLeft,renderTop,renderHeight,windowWidth)
> import Rationals (Rationals(..),rndNR)
Numb is a type synonym used throughout the rest of
the Geometric modeller code. A new number system can
hence be easily replaced by changing this one line.
> type Numb = Rationals
> class (Fractional a) => GeomNumb a where
GeomNumb Class specifies:
rnd - How to round a co-ordinate into an Int
[y,x]CoordInRange - how to work out if a co_ordinate is on screen
(screen defined in Params.hs)
ratio - find the ratio of two number in simplest terms
zerO, positive, negative - methods for determining the sign of a number
fromInt - How to coerce an integer the number type.
> rnd :: a->Int
> zerO,positive,negative :: a->Bool
> ratio :: a -> a -> (a,a)
> xCoordInRange :: a->Bool
> yCoordInRange :: a->Bool
> instance GeomNumb Rationals where
> rnd = rndNR
> zerO a = (a==0)
> positive a = signum a > 0
> negative a = signum a < 0
> ratio 0 y = if (positive y) then (0,1) else (0,-1)
> ratio x 0 = if (positive x) then (1,0) else (-1,0)
> ratio x y = (signum x*(n:%%1),signum y*(d:%%1))
> where (n:%%d)= abs x/abs y
> xCoordInRange x = (fromIntegral renderLeft) <= x && x <= (fromIntegral windowWidth)
> yCoordInRange x = (fromIntegral renderTop) <= x && x <= (fromIntegral renderHeight)
> rnd2 :: Numb -> Numb
> rnd2 a = rnd a :%% 1
> grid :: Numb -> Numb
> grid (x:%%1) = (div (x+5) 10 * 10) :%% 1
|