diagrams-lib-0.1: src/Diagrams/Align.hs
{-# LANGUAGE TypeFamilies
, FlexibleContexts
#-}
-----------------------------------------------------------------------------
-- |
-- Module : Diagrams.Align
-- Copyright : (c) 2011 diagrams-lib team (see LICENSE)
-- License : BSD-style (see LICENSE)
-- Maintainer : diagrams-discuss@googlegroups.com
--
-- General tools for alignment. Any boundable object with a local
-- origin can be aligned; this includes diagrams, of course, but it also
-- includes paths.
--
-----------------------------------------------------------------------------
module Diagrams.Align
( align, alignBy
, center
) where
import Graphics.Rendering.Diagrams
import Data.VectorSpace
import Data.AffineSpace (alerp)
-- | @align v@ aligns a boundable object along the edge in the
-- direction of @v@. That is, it moves the local origin in the
-- direction of @v@ until it is on the boundary. (Note that if the
-- local origin is outside the boundary to begin, it may have to
-- move \"backwards\".)
align :: (HasOrigin a, Boundable a) => V a -> a -> a
align v a = moveOriginTo (boundary v a) a
-- XXX need a better, more intuitive description of alignBy
-- | @align v d a@ moves the origin of @a@ to a distance of @d*r@ from
-- the center along @v@, where @r@ is the radius along @v@. Hence
-- @align v 0@ centers along @v@, and @align v 1@ moves the origin
-- in the direction of @v@ to the very edge of the bounding region.
alignBy :: (HasOrigin a, Boundable a) => V a -> Rational -> a -> a
alignBy v d a = moveOriginTo (alerp (boundary (negateV v) a)
(boundary v a)
((fromRational d + 1) / 2))
a
-- | @center v@ centers a boundable object along the direction of @v@.
center :: (HasOrigin a, Boundable a) => V a -> a -> a
center v = alignBy v 0