Portability | GHC with TypeFamilies and more |
---|---|
Stability | unstable |
Maintainer | stephen.tetley@gmail.com |
Construction of pictures, paths and text labels.
- blankPicture :: Num u => BoundingBox u -> Picture u
- frame :: (Real u, Floating u) => Primitive u -> Picture u
- frameWithin :: (Real u, Floating u) => Primitive u -> BoundingBox u -> Picture u
- frameMulti :: (Real u, Floating u) => [Primitive u] -> Picture u
- multi :: (Fractional u, Ord u) => [Picture u] -> Picture u
- path :: Point2 u -> [PathSegment u] -> Path u
- lineTo :: Point2 u -> PathSegment u
- curveTo :: Point2 u -> Point2 u -> Point2 u -> PathSegment u
- vertexPath :: [Point2 u] -> Path u
- curvedPath :: [Point2 u] -> Path u
- wumpus_default_font :: FontAttr
- class Stroke t where
- zostroke :: Num u => Path u -> Primitive u
- zcstroke :: Num u => Path u -> Primitive u
- class Fill t where
- zfill :: Num u => Path u -> Primitive u
- clip :: (Num u, Ord u) => Path u -> Picture u -> Picture u
- class TextLabel t where
- ztextlabel :: Num u => String -> Point2 u -> Primitive u
- class Ellipse t where
- ellipse :: Fractional u => t -> u -> u -> Point2 u -> Primitive u
- zellipse :: Num u => u -> u -> Point2 u -> Primitive u
- extendBoundary :: (Num u, Ord u) => u -> u -> Picture u -> Picture u
- picMoveBy :: Num u => Picture u -> Vec2 u -> Picture u
- picOver :: (Num u, Ord u) => Picture u -> Picture u -> Picture u
- picBeside :: (Num u, Ord u) => Picture u -> Picture u -> Picture u
- illustrateBounds :: (Real u, Floating u) => DRGB -> Picture u -> Picture u
- illustrateBoundsPrim :: (Real u, Floating u) => DRGB -> Primitive u -> Picture u
- illustrateControlPoints :: (Real u, Floating u) => DRGB -> Primitive u -> Picture u
Construction
blankPicture :: Num u => BoundingBox u -> Picture uSource
Create a blank Picture
sized to the supplied bounding box.
This is useful for spacing rows or columns of pictures.
frameWithin :: (Real u, Floating u) => Primitive u -> BoundingBox u -> Picture uSource
Frame a picture within the supplied bounding box
A text label uses the supplied bounding box as is - no clipping is performed if the bounding box is smaller than the boundary size of the text. This may cause strange overlap for subsequent composite pictures, and incorrect bounding box annotations in the prologue of the generated EPS file.
Paths and ellipses are bound within the union of the supplied bounding box and the inherent bounding box or the path or ellipse. Thus the bounding box will never reframed to a smaller size than the natural bounding box.
frameMulti :: (Real u, Floating u) => [Primitive u] -> Picture uSource
Lift a list of primitives to a composite picture, all primitives will be located within the standard frame.
The order of the list maps to the zorder - the front of the list is drawn at the top.
This function throws an error when supplied the empty list.
multi :: (Fractional u, Ord u) => [Picture u] -> Picture uSource
Place multiple pictures within the same affine frame.
This function throws an error when supplied the empty list.
path :: Point2 u -> [PathSegment u] -> Path uSource
Create a Path from a start point and a list of PathSegments.
lineTo :: Point2 u -> PathSegment uSource
Create a straight-line PathSegment.
vertexPath :: [Point2 u] -> Path uSource
Convert the list of vertices to a path of straight line segments.
curvedPath :: [Point2 u] -> Path uSource
Convert a list of vertices to a path of curve segments. The first point in the list makes the start point, each curve segment thereafter takes 3 points. Spare points at the end are discarded.
wumpus_default_font :: FontAttrSource
Constant for the default font, which is Courier
(aliased
to Courier New
for SVG).
The font size is 24 point. Note that only a handful of font sizes are available directly to PostScript / GhostScript.
To get non-standard sizes, consider drawing the text and
applying a uniformScale
.
Constructing primitives
Create a open, stroked path (ostroke
) or a closed, stroked
path (cstroke
).
ostroke
and cstroke
are overloaded to make attributing
the path more convenient.
Stroke () | |
Stroke StrokeAttr | |
Stroke [StrokeAttr] | |
Stroke (Gray Double) | |
Stroke (HSB3 Double) | |
Stroke (RGB3 Double) | |
Stroke (Gray Double, [StrokeAttr]) | |
Stroke (Gray Double, StrokeAttr) | |
Stroke (HSB3 Double, [StrokeAttr]) | |
Stroke (HSB3 Double, StrokeAttr) | |
Stroke (RGB3 Double, [StrokeAttr]) | |
Stroke (RGB3 Double, StrokeAttr) |
Create a filled path (fill
). Fills only have one
property - colour. But there are various representations of
colour.
fill ()
will fill with the default colour - black.
clip :: (Num u, Ord u) => Path u -> Picture u -> Picture uSource
Clip a picture with respect to the supplied path.
Create a text label. The string should not contain newline
or tab characters. Use multilabel
to create text with
multiple lines.
textlabel
is overloaded to make attributing the label more
convenient.
Unless a FontAttr
is specified, the label will use 12pt
Courier.
The supplied point is is the bottom left corner.
ztextlabel :: Num u => String -> Point2 u -> Primitive uSource
Create a label where the font is Courier
, text size is 24pt
and colour is black.
Create an ellipse, the ellipse will be filled unless the supplied attributes imply a stroked ellipse, e.g.:
ellipse (LineWidth 4) zeroPt 40 40
Note - within Wumpus, ellipses are considered an unfortunate
but useful optimization. Drawing good cicles with Beziers
needs at least eight curves, but drawing them with
PostScript's arc
command is a single operation. For
drawings with many dots (e.g. scatter plots) it seems sensible
to employ this optimaztion.
A deficiency of Wumpus's ellipse is that (non-uniformly) scaling a stroked ellipse also (non-uniformly) scales the pen it is drawn with. Where the ellipse is wider, the pen stroke will be wider too.
ellipse :: Fractional u => t -> u -> u -> Point2 u -> Primitive uSource
Ellipse () | |
Ellipse StrokeAttr | |
Ellipse DrawEllipse | |
Ellipse [StrokeAttr] | |
Ellipse (Gray Double) | |
Ellipse (HSB3 Double) | |
Ellipse (RGB3 Double) | |
Ellipse (Gray Double, [StrokeAttr]) | |
Ellipse (Gray Double, StrokeAttr) | |
Ellipse (Gray Double, DrawEllipse) | |
Ellipse (HSB3 Double, [StrokeAttr]) | |
Ellipse (HSB3 Double, StrokeAttr) | |
Ellipse (HSB3 Double, DrawEllipse) | |
Ellipse (RGB3 Double, [StrokeAttr]) | |
Ellipse (RGB3 Double, StrokeAttr) | |
Ellipse (RGB3 Double, DrawEllipse) |
Operations
extendBoundary :: (Num u, Ord u) => u -> u -> Picture u -> Picture uSource
Extend the bounding box of a picture.
The bounding box is both horizontal directions by x
and
both vertical directions by y
. x
and y
must be positive
This function cannot be used to shrink a boundary.
Minimal - picture composition
picMoveBy :: Num u => Picture u -> Vec2 u -> Picture uSource
picMoveBy
: picture -> vector -> picture
Move a picture by the supplied vector.
picOver :: (Num u, Ord u) => Picture u -> Picture u -> Picture uSource
picOver
: picture -> picture -> picture
Draw the first picture on top of the second picture - neither picture will be moved.
picBeside :: (Num u, Ord u) => Picture u -> Picture u -> Picture uSource
picBeside
: picture -> picture -> picture
Move the second picture to sit at the right side of the first picture
illustrateBounds :: (Real u, Floating u) => DRGB -> Picture u -> Picture uSource
illustrateBounds
: colour -> picture -> picture
Draw the picture on top of an image of its bounding box. The bounding box image will be drawn in the supplied colour.
illustrateBoundsPrim :: (Real u, Floating u) => DRGB -> Primitive u -> Picture uSource
illustrateBoundsPrim
: colour -> primitive -> picture
Draw the primitive on top of an image of its bounding box. The bounding box image will be drawn in the supplied colour.
The result will be lifted from Primitive to Picture.
illustrateControlPoints :: (Real u, Floating u) => DRGB -> Primitive u -> Picture uSource
Generate the control points illustrating the Bezier curves within a picture.
This has no effect on TextLabels.
Pseudo control points are generated for ellipses,
although strictly speaking ellipses do not use Bezier
curves - they are implemented with PostScript's
arc
command.