dia-base-0.1.1: Graphics/Diagrams.hs
-- | Diagrams user API
module Graphics.Diagrams
( -- * Points
Point
, (*.), (.*.), (.+.), (.-.)
-- * Colors
, Color
, color, rgb
, red, green, blue, black, white, gray, yellow
-- * Diagrams
, Diagram
-- ** Primitives
, empty, rect, rectangle, circle, (>-<), (~~), polyline, polygon
-- ** Texts
, textFrom, textTo, textAt
-- ** Transformations
, move, rotate, scale, scaleXY, clip
-- ** Styles
, fill, stroke, strokeWidth, fontFamily, link
-- ** Combining diagrams
, union, (<|>)
, pack
) where
import Graphics.Diagrams.Types
---------------------
infixl 7 .*., *.
infixl 6 .+., .-.
infix 4 >-<, ~~
infixl 3 `move`, `rotate`, `scale`, `scaleXY`, `fill`, `stroke`, `strokeWidth`, `textFrom`, `textTo`, `textAt`, `fontFamily`, `link`
infixl 2 <|>
--------------------
-- | empty diagram
empty :: Diagram
empty = EmptyDiagram
-- | line segment
(>-<), (~~), line :: Point -> Point -> Diagram
(>-<) = line
(~~) = line
line a b = polyline [a,b]
-- | rectangle given with width and height
rect :: Double -> Double -> Diagram
rect = Rect
-- | rectangle given with two opposite corners
rectangle :: Point -> Point -> Diagram
rectangle (a1,a2) (b1,b2) = rect (abs (b1-a1)) (abs (b2-a2)) `move` (a1+(b1-a1)/2, a2+(b2-a2)/2)
--dot :: Diagram
--dot = circle 0.5 `strokeWidth` 0 `fill` black
-- | circle with radius
circle :: Double -> Diagram
circle = Circle
polygon, polyline :: [Point] -> Diagram
polygon = Polyline True
polyline = Polyline False
-- | text in origo
text :: Position -> String -> Diagram
text x = TransformMatrix 0.1 0 0 (-0.1) 0 0 . Text x
-- | text; middle of text is fixed
textAt :: String -> Point -> Diagram
textAt t x = text Middle t `move` x
-- | text; beginning of text is fixed
textFrom :: String -> Point -> Diagram
textFrom t x = text Start t `move` x
-- | text; end of text is fixed
textTo :: String -> Point -> Diagram
textTo t x = text End t `move` x
-- | set font family
fontFamily :: Diagram -> String -> Diagram
fontFamily = flip FontFamily
-- | add an html link
link :: Diagram -> String -> Diagram
link = flip Link
-- | clip a rectangle region (give lower-left and upper-right corners)
clip :: Point -> Point -> Diagram -> Diagram
clip = Clip
move :: Diagram -> Point -> Diagram
x `move` p = Move p x
-- | rotate (degree)
rotate :: Diagram -> Double -> Diagram
x `rotate` d = Rotate d x
-- | scale differently at x and y axes
scale :: Diagram -> Double -> Diagram
x `scale` t = Scale t x
scaleXY :: Diagram -> (Double, Double) -> Diagram
d `scaleXY` (x, y) = ScaleXY x y d
-- | fill with color
fill :: Diagram -> Color -> Diagram
x `fill` c = Fill c x
-- | set stroke color
stroke :: Diagram -> Color -> Diagram
x `stroke` c = Stroke c x
-- | set stroke width
strokeWidth :: Diagram -> Double -> Diagram
x `strokeWidth` c = StrokeWidth c x
-- | overlay; the second diagram is over the first one
(<|>) :: Diagram -> Diagram -> Diagram
(<|>) = Overlay
-- | overlay generalized to several diagrams
union :: [Diagram] -> Diagram
union = foldr Overlay EmptyDiagram
-- | pack a diagram; (@pack d f@) is the more efficient version of (@let v=d in f v@).
pack :: Diagram -> (Diagram -> Diagram) -> Diagram
pack = Pack
-------------------------
-- | named color
color :: String -> Color
color = Color
-- | RGB color (components are between 0 and 1)
rgb :: Double -> Double -> Double -> Color
rgb = RGB
red, green, blue, black, white, gray, yellow :: Color
red = color "red"
green = color "green"
blue = color "blue"
black = color "black"
white = color "white"
gray = color "gray"
yellow = color "yellow"
-- | Scalar multiplication.
(*.) :: Double -> Point -> Point
s *. (x,y) = (s*x, s*y)
-- | Elementwise addition, subtraction and multiplication for 'Point's.
(.+.), (.-.), (.*.) :: Point -> Point -> Point
(x1,y1) .+. (x2,y2) = (x1 + x2, y1 + y2)
(x1,y1) .*. (x2,y2) = (x1 * x2, y1 * y2)
a .-. b = a .+. ((-1) *. b)