> 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