module Graphics.Rasterific.Operators
( Point
, (^&&^)
, (^||^)
, (^==^)
, (^/=^)
, (^<=^)
, (^<^)
, (^<)
, vmin
, vmax
, vabs
, vfloor
, vceil
, clampPoint
, midPoint
, middle
, vpartition
, normal
, ifZero
, isNearby
, isDistingableFrom
) where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative( Applicative, (<$>) )
#endif
import Control.Applicative( liftA2, liftA3 )
import Graphics.Rasterific.Linear
( V2( .. )
, Additive( .. )
, Epsilon( nearZero )
, (^+^)
, (^*)
, dot
, normalize
)
infix 4 ^<, ^<=^, ^<^, ^==^, ^/=^
infixr 3 ^&&^
infixr 2 ^||^
type Point = V2 Float
(^&&^) :: (Applicative a) => a Bool -> a Bool -> a Bool
(^&&^) = liftA2 (&&)
(^||^) :: (Applicative a) => a Bool -> a Bool -> a Bool
(^||^) = liftA2 (||)
(^==^) :: (Eq v, Applicative a) => a v -> a v -> a Bool
(^==^) = liftA2 (==)
(^<=^) :: (Ord v, Applicative a) => a v -> a v -> a Bool
(^<=^) = liftA2 (<=)
(^<^) :: (Ord v, Applicative a) => a v -> a v -> a Bool
(^<^) = liftA2 (<)
(^<) :: (Applicative a, Ord v) => a v -> v -> a Bool
(^<) vec v = (< v) <$> vec
(^/=^) :: (Applicative a, Eq v) => a v -> a v -> a Bool
(^/=^) = liftA2 (/=)
vmin :: (Ord n, Applicative a) => a n -> a n -> a n
vmin = liftA2 min
vmax :: (Ord n, Applicative a) => a n -> a n -> a n
vmax = liftA2 max
vabs :: (Num n, Functor a) => a n -> a n
vabs = fmap abs
vfloor :: (Functor a) => a Float -> a Int
vfloor = fmap floor
vceil :: (Functor a) => a Float -> a Int
vceil = fmap ceiling
clampPoint :: Point -> Point -> Point -> Point
clampPoint mini maxi v = vmin maxi $ vmax mini v
midPoint :: (Additive a, Fractional coord) => a coord -> a coord -> a coord
midPoint a b = (a ^+^ b) ^* 0.5
middle :: (Fractional a) => a -> a -> a
middle a b = (a + b) * 0.5
vpartition :: (Applicative a) => a Bool -> a v -> a v -> a v
vpartition = liftA3 choose
where choose True a _ = a
choose False _ b = b
normal :: (Floating v, Epsilon v) => V2 v -> V2 v -> V2 v
normal (V2 ax ay) (V2 bx by) = normalize $ V2 (ay by) (bx ax)
ifZero :: (Epsilon v) => v -> v -> v
ifZero u v | nearZero u = v
| otherwise = u
isNearby :: Point -> Point -> Bool
isNearby p1 p2 = squareDist < 0.0001
where vec = p1 ^-^ p2
squareDist = vec `dot` vec
isDistingableFrom :: Point -> Point -> Bool
isDistingableFrom a b = not $ isNearby a b