Diagrams

The diagrams library provides an embedded domain-specific language (EDSL) for creating simple pictures and diagrams in Haskell

1 Rewrite

1.1 Core DSL

1.1.1 Style

Do we either want

``` yellowCircle x y radius = yellowFill \$ circleShape x y radius ```

or

``` drawYellowCircle x y radius = do \$ ```

``` setFill yellow drawCircle x y radius ```

?

The first version allows better reuse and functional composition.

1.1.2 Elements

• graphical primitives
• path
• boundingBox
• moveTo, lineTo, cubic bezier, quadratic bezier, arcTo
• text
• boundingBox
• convertToPath
• circle
• boundingBox
• convertToPath
• ellipse
• boundingBox
• convertToPath
• rectangle
• boundingBox
• convertToPath
• polygon
• boundingBox
• convertToPath
• polyline
• boundingBox
• convertToPath
• graphical attributes
• fill
• paint
• fill rule
• evenOdd, nonZero
• stroke
• paint
• width
• line cap
• line join
• miter limit
• dash
• offset
• array
• marker symbols
• effects
• constraint solving
• animations/pages/frames

1.2 Data structures

```data Figure = Figure {
fill :: Fill
, shape :: Shape
, stroke :: Stroke
}

data Fill = Fill {
fillPaint :: Paint,
}

data Stroke = Stroke {
strokePaint :: Paint,
, lineWidth :: Double,
, dashPattern :: DashPattern
, lineCap :: LineCap
, lineJoin :: LineJoin
, miterLimit :: Double
} deriving(Eq, Show)

data Paint =
SolidColor
| Pattern
deriving(Eq, Show)

data LineCap =
LineCapButt
| LineCapRound
| LineCapSquare
deriving(Eq, Show)

data LineJoin =
LineJoinMiter
| LineJoinRound
| LineJoinBevel
deriving(Eq, Show)

data Shape =
Path
| Primitive
| Text
deriving(Eq, Show)

data Path = Path {
segments :: [Segment]
}
deriving(Eq, Show)

data Segment =
Move Point
| Line {
a :: Point
, b :: Point
}
| HorizontalLine {
a :: Point
, w :: Double
}
| VerticalLine {
a :: Point
, h :: Double
}
| CubicBezier Point Point Point Point
deriving(Eq, Show)

data Point =
Node2d Double Double
| Node3d Double Double Double
deriving(Eq, Show)

data Primitive =
Circle
| Ellipse
| Rectangle
| RegularPolygon
| Square
| Star
deriving(Eq, Show)

class PathLike a =
convertToPath :: a -> Path```

1.3 Modules/Extensions

1.3.1 Paths

• inset, outset
• boolean operations
• morphing
• approximation (autotrace)

See

1.4 Input/Output

Many Haskell graphic libraries are tied to a specific rendering backend (Cairo, OpenGL, libGD etc) which makes collaboration and reuse of code and data structures very hard or impossible.

Also some dependencies are hard to fulfill. Cairo is very difficult to install on Mac OS 10.6. If you just need to generate PDF diagrams, you could choose the pure HPDF library where e.g. Hieroglyph can not be installed because of its Cairo dependence.

1.4.1 Output

• interactive drawing via Cairo
• PDF export via pure HPDF
• EPS export
• SWF export
• LaTeX export
• exotic backends