packages feed

hcg-minus-0.11: Render/CG/Minus/Arrow.hs

-- | Rendering of "Data.CG.Minus.Arrow".
module Render.CG.Minus.Arrow where

import Data.CG.Minus
import Data.CG.Minus.Arrow
import Data.CG.Minus.Colour
import qualified Graphics.Rendering.Cairo as C
import Render.CG.Minus

-- | Render 'Ln' with solid arrow tip at endpoint.  Arrow tip
-- co-ordinates are given by 'arrow_coord'.
arrow_ep :: R -> R -> Ca -> Ln R -> C.Render ()
arrow_ep n a c l = do
    let (p0,p1) = ln_pt l
        (p2,p3) = arrow_coord l n a
    line [p0,ln_midpoint (ln p2 p3)]
    C.setLineCap C.LineCapRound
    stroke 0.01 c
    polygon [p2,p1,p3]
    C.fill

-- | Variant of 'arrow_ep' to render 'Ls' as sequence of arrows.
arrows_ep :: R -> R -> Ca -> Ls R -> C.Render ()
arrows_ep n a c xs = mapM_ (arrow_ep n a c) (zipWith ln xs (tail xs))

-- | Variant of 'arrow_ep' with draws tip at mid-point of 'Ln'.
arrow_mp :: R -> R -> Ca -> Ln R -> C.Render ()
arrow_mp n a c l = do
    let (p0,p1) = ln_pt l
        p1' = ln_midpoint (ln p0 (pt_linear_extension n l))
        (p2,p3) = arrow_coord (ln p0 p1') n a
    line [p0,p1]
    C.setLineCap C.LineCapRound
    stroke 0.01 c
    polygon [p2,p1',p3]
    C.fill

-- | Variant of 'arrow_mp' to render 'Ls' as sequence of arrows.
arrows_mp :: R -> R -> Ca -> Ls R -> C.Render ()
arrows_mp n a c xs = mapM_ (arrow_mp n a c) (zipWith ln xs (tail xs))