diagrams-lib-1.4.1.2: Embedded domain-specific language for declarative graphics

Diagrams.Align

Description

The alignment of an object refers to the position of its local origin with respect to its envelope. This module defines the Alignable class for things which can be aligned, as well as a default implementation in terms of HasOrigin and Enveloped, along with several utility methods for alignment.

Synopsis

# Alignable class

class Alignable a where #

Class of things which can be aligned.

Minimal complete definition

defaultBoundary

Methods

alignBy' :: (InSpace v n a, Fractional n, HasOrigin a) => (v n -> a -> Point v n) -> v n -> n -> a -> a #

alignBy v d a moves the origin of a along the vector v. If d = 1, the origin is moved to the edge of the boundary in the direction of v; if d = -1, it moves to the edge of the boundary in the direction of the negation of v. Other values of d interpolate linearly (so for example, d = 0 centers the origin along the direction of v).

defaultBoundary :: (V a ~ v, N a ~ n) => v n -> a -> Point v n #

alignBy :: (InSpace v n a, Fractional n, HasOrigin a) => v n -> n -> a -> a #

Instances

 ((~) (* -> *) (V b) v, (~) * (N b) n, Metric v, OrderedField n, Alignable b) => Alignable [b] # MethodsalignBy' :: (InSpace v n [b], Fractional n, HasOrigin [b]) => (v n -> [b] -> Point v n) -> v n -> n -> [b] -> [b] #defaultBoundary :: (((* -> *) ~ V [b]) v, (* ~ N [b]) n) => v n -> [b] -> Point v n #alignBy :: (InSpace v n [b], Fractional n, HasOrigin [b]) => v n -> n -> [b] -> [b] # ((~) (* -> *) (V b) v, (~) * (N b) n, Metric v, OrderedField n, Alignable b) => Alignable (Set b) # MethodsalignBy' :: (InSpace v n (Set b), Fractional n, HasOrigin (Set b)) => (v n -> Set b -> Point v n) -> v n -> n -> Set b -> Set b #defaultBoundary :: (((* -> *) ~ V (Set b)) v, (* ~ N (Set b)) n) => v n -> Set b -> Point v n #alignBy :: (InSpace v n (Set b), Fractional n, HasOrigin (Set b)) => v n -> n -> Set b -> Set b # Alignable a => Alignable (Located a) # MethodsalignBy' :: (InSpace v n (Located a), Fractional n, HasOrigin (Located a)) => (v n -> Located a -> Point v n) -> v n -> n -> Located a -> Located a #defaultBoundary :: (((* -> *) ~ V (Located a)) v, (* ~ N (Located a)) n) => v n -> Located a -> Point v n #alignBy :: (InSpace v n (Located a), Fractional n, HasOrigin (Located a)) => v n -> n -> Located a -> Located a # (InSpace v n a, HasOrigin a, Alignable a) => Alignable (b -> a) # Although the alignBy method for the (b -> a) instance is sensible, there is no good implementation for defaultBoundary. Instead, we provide a total method, but one that is not sensible. This should not present a serious problem as long as your use of Alignable happens through alignBy. MethodsalignBy' :: (InSpace v n (b -> a), Fractional n, HasOrigin (b -> a)) => (v n -> (b -> a) -> Point v n) -> v n -> n -> (b -> a) -> b -> a #defaultBoundary :: (((* -> *) ~ V (b -> a)) v, (* ~ N (b -> a)) n) => v n -> (b -> a) -> Point v n #alignBy :: (InSpace v n (b -> a), Fractional n, HasOrigin (b -> a)) => v n -> n -> (b -> a) -> b -> a # ((~) (* -> *) (V b) v, (~) * (N b) n, Metric v, OrderedField n, Alignable b) => Alignable (Map k b) # MethodsalignBy' :: (InSpace v n (Map k b), Fractional n, HasOrigin (Map k b)) => (v n -> Map k b -> Point v n) -> v n -> n -> Map k b -> Map k b #defaultBoundary :: (((* -> *) ~ V (Map k b)) v, (* ~ N (Map k b)) n) => v n -> Map k b -> Point v n #alignBy :: (InSpace v n (Map k b), Fractional n, HasOrigin (Map k b)) => v n -> n -> Map k b -> Map k b # (Metric v, OrderedField n) => Alignable (Envelope v n) # MethodsalignBy' :: (InSpace v n (Envelope v n), Fractional n, HasOrigin (Envelope v n)) => (v n -> Envelope v n -> Point v n) -> v n -> n -> Envelope v n -> Envelope v n #defaultBoundary :: (((* -> *) ~ V (Envelope v n)) v, (* ~ N (Envelope v n)) n) => v n -> Envelope v n -> Point v n #alignBy :: (InSpace v n (Envelope v n), Fractional n, HasOrigin (Envelope v n)) => v n -> n -> Envelope v n -> Envelope v n # (Metric v, OrderedField n) => Alignable (Trace v n) # MethodsalignBy' :: (InSpace v n (Trace v n), Fractional n, HasOrigin (Trace v n)) => (v n -> Trace v n -> Point v n) -> v n -> n -> Trace v n -> Trace v n #defaultBoundary :: (((* -> *) ~ V (Trace v n)) v, (* ~ N (Trace v n)) n) => v n -> Trace v n -> Point v n #alignBy :: (InSpace v n (Trace v n), Fractional n, HasOrigin (Trace v n)) => v n -> n -> Trace v n -> Trace v n # (Metric v, OrderedField n) => Alignable (Path v n) # MethodsalignBy' :: (InSpace v n (Path v n), Fractional n, HasOrigin (Path v n)) => (v n -> Path v n -> Point v n) -> v n -> n -> Path v n -> Path v n #defaultBoundary :: (((* -> *) ~ V (Path v n)) v, (* ~ N (Path v n)) n) => v n -> Path v n -> Point v n #alignBy :: (InSpace v n (Path v n), Fractional n, HasOrigin (Path v n)) => v n -> n -> Path v n -> Path v n # (Metric v, Traversable v, OrderedField n) => Alignable (BoundingBox v n) # MethodsalignBy' :: (InSpace v n (BoundingBox v n), Fractional n, HasOrigin (BoundingBox v n)) => (v n -> BoundingBox v n -> Point v n) -> v n -> n -> BoundingBox v n -> BoundingBox v n #defaultBoundary :: (((* -> *) ~ V (BoundingBox v n)) v, (* ~ N (BoundingBox v n)) n) => v n -> BoundingBox v n -> Point v n #alignBy :: (InSpace v n (BoundingBox v n), Fractional n, HasOrigin (BoundingBox v n)) => v n -> n -> BoundingBox v n -> BoundingBox v n # (Metric v, OrderedField n, Monoid' m) => Alignable (QDiagram b v n m) # MethodsalignBy' :: (InSpace v n (QDiagram b v n m), Fractional n, HasOrigin (QDiagram b v n m)) => (v n -> QDiagram b v n m -> Point v n) -> v n -> n -> QDiagram b v n m -> QDiagram b v n m #defaultBoundary :: (((* -> *) ~ V (QDiagram b v n m)) v, (* ~ N (QDiagram b v n m)) n) => v n -> QDiagram b v n m -> Point v n #alignBy :: (InSpace v n (QDiagram b v n m), Fractional n, HasOrigin (QDiagram b v n m)) => v n -> n -> QDiagram b v n m -> QDiagram b v n m #

alignBy'Default :: (InSpace v n a, Fractional n, HasOrigin a) => (v n -> a -> Point v n) -> v n -> n -> a -> a #

Default implementation of alignBy for types with HasOrigin and AdditiveGroup instances.

envelopeBoundary :: (V a ~ v, N a ~ n, Enveloped a) => v n -> a -> Point v n #

Some standard functions which can be used as the boundary argument to alignBy'.

traceBoundary :: (V a ~ v, N a ~ n, Num n, Traced a) => v n -> a -> Point v n #

# General alignment functions

align :: (InSpace v n a, Fractional n, Alignable a, HasOrigin a) => v n -> a -> a #

align v aligns an enveloped 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 edge of the envelope. (Note that if the local origin is outside the envelope to begin with, it may have to move "backwards".)

snug :: (InSpace v n a, Fractional n, Alignable a, Traced a, HasOrigin a) => v n -> a -> a #

Like align but uses trace.

centerV :: (InSpace v n a, Fractional n, Alignable a, HasOrigin a) => v n -> a -> a #

centerV v centers an enveloped object along the direction of v.

center :: (InSpace v n a, Fractional n, Traversable v, Alignable a, HasOrigin a) => a -> a #

center centers an enveloped object along all of its basis vectors.

snugBy :: (InSpace v n a, Fractional n, Alignable a, Traced a, HasOrigin a) => v n -> n -> a -> a #

Version of alignBy specialized to use traceBoundary

snugCenterV :: (InSpace v n a, Fractional n, Alignable a, Traced a, HasOrigin a) => v n -> a -> a #

Like centerV using trace.

snugCenter :: (InSpace v n a, Traversable v, Fractional n, Alignable a, HasOrigin a, Traced a) => a -> a #

Like center using trace.