From 41d6a1d9f1540e1cf62bf1646d07ab1e8dc09853 Mon Sep 17 00:00:00 2001 From: David Himmelstrup Date: Tue, 25 Aug 2020 16:38:29 +0800 Subject: [PATCH] Write more API documentation. --- docs/gifs/doc_githubWhiteIcon.gif | Bin 0 -> 5171 bytes docs/gifs/doc_ternaryPlot.gif | Bin 5132 -> 6497 bytes examples/doc_githubWhiteIcon.hs | 12 +++++ examples/doc_ternaryPlot.hs | 18 +++---- src/Reanimate/Builtin/Images.hs | 12 +++++ src/Reanimate/Builtin/TernaryPlot.hs | 69 ++++++++++++++++++++++----- 6 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 docs/gifs/doc_githubWhiteIcon.gif create mode 100755 examples/doc_githubWhiteIcon.hs diff --git a/docs/gifs/doc_githubWhiteIcon.gif b/docs/gifs/doc_githubWhiteIcon.gif new file mode 100644 index 0000000000000000000000000000000000000000..c927a477d3e928cfdac10cf19016809c63c3ed10 GIT binary patch literal 5171 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 Q2R|kGzyHR6Z3gH60c!4E_y7O^ literal 0 HcmV?d00001 diff --git a/docs/gifs/doc_ternaryPlot.gif b/docs/gifs/doc_ternaryPlot.gif index a4afc4bbbbb76160f3c136ee926eb3ca6f052976..3692b5297faeea95fa4b91e2d8b569dd9eb771de 100644 GIT binary patch literal 6497 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 f>H+MJ01OfwMk4>0tNz>Y?~?q_+UA diff --git a/examples/doc_githubWhiteIcon.hs b/examples/doc_githubWhiteIcon.hs new file mode 100755 index 0000000..d8899c2 --- /dev/null +++ b/examples/doc_githubWhiteIcon.hs @@ -0,0 +1,12 @@ +#!/usr/bin/env stack +-- stack runghc --package reanimate +module Main (main) where + +import Reanimate +import Reanimate.Builtin.Documentation +import Reanimate.Builtin.Images + +main :: IO () +main = reanimate $ staticFrame 1 $ mkGroup + [ mkBackground "grey" + , githubWhiteIcon ] diff --git a/examples/doc_ternaryPlot.hs b/examples/doc_ternaryPlot.hs index e038685..31c8dbc 100755 --- a/examples/doc_ternaryPlot.hs +++ b/examples/doc_ternaryPlot.hs @@ -2,13 +2,15 @@ -- stack runghc --package reanimate module Main(main) where -import Reanimate hiding (raster) -import Reanimate.Builtin.Documentation -import Reanimate.Builtin.TernaryPlot -import Reanimate.ColorComponents -import Data.Colour.CIE -import Codec.Picture.Types +import Codec.Picture.Types +import Reanimate +import Reanimate.Builtin.Documentation +import Reanimate.Builtin.TernaryPlot main :: IO () -main = reanimate $ docEnv $ animate $ const $ - ternaryPlot 1024 (\a b c -> promotePixel $ toRGB8 $ cieXYZ a b c) +main = reanimate $ docEnv $ staticFrame 1 $ + ternaryPlot 100 $ \aCoord bCoord cCoord -> promotePixel $ + let red = round $ aCoord*255 + green = round $ bCoord*255 + blue = round $ cCoord*255 + in PixelRGB8 red green blue diff --git a/src/Reanimate/Builtin/Images.hs b/src/Reanimate/Builtin/Images.hs index d7ea351..d8fbe38 100644 --- a/src/Reanimate/Builtin/Images.hs +++ b/src/Reanimate/Builtin/Images.hs @@ -1,3 +1,14 @@ +{-| +Module : Reanimate.Builtin.Images +Copyright : Written by David Himmelstrup +License : Unlicense +Maintainer : lemmih@gmail.com +Stability : experimental +Portability : POSIX + +Collection of built-in images. + +-} module Reanimate.Builtin.Images ( svgLogo , haskellLogo @@ -46,6 +57,7 @@ githubIcon :: SVG githubIcon = unsafePerformIO $ embedImage "data/github-icon.svg" {-# NOINLINE githubWhiteIcon #-} +-- | <> githubWhiteIcon :: SVG githubWhiteIcon = unsafePerformIO $ embedImage "data/github-icon-white.svg" diff --git a/src/Reanimate/Builtin/TernaryPlot.hs b/src/Reanimate/Builtin/TernaryPlot.hs index cdfe9d3..9d787cc 100644 --- a/src/Reanimate/Builtin/TernaryPlot.hs +++ b/src/Reanimate/Builtin/TernaryPlot.hs @@ -1,19 +1,56 @@ -module Reanimate.Builtin.TernaryPlot where +{-| +Module : Reanimate.Builtin.TernaryPlot +Copyright : Written by David Himmelstrup +License : Unlicense +Maintainer : lemmih@gmail.com +Stability : experimental +Portability : POSIX + +Implementation of ternary plots: + +-} +module Reanimate.Builtin.TernaryPlot + ( ACoord + , BCoord + , CCoord + , ternaryPlot + -- , atCenter + -- , radius + , toCartesianCoords + , toOffsetCartesianCoords + , fromCartesianCoords + ) where import Codec.Picture import Graphics.SvgTree (Tree) import Reanimate.Raster import Reanimate.Svg --- (top, left, right) -- a+b+c=1 +-- | Left-most coordinate. type ACoord = Double +-- | Top-most coordinate. type BCoord = Double +-- | Right-most coordinate. type CCoord = Double --- Creates a centered ternary plot with a width of 5. -ternaryPlot :: Int -- ^ Pixels in the X-axis. - -> (ACoord -> BCoord -> CCoord -> PixelRGBA8) -> Tree +-- | Creates a centered ternary plot with a width of 5. +-- +-- Example: +-- +-- > ternaryPlot 100 $ \aCoord bCoord cCoord -> promotePixel $ +-- > let red = round $ aCoord*255 +-- > green = round $ bCoord*255 +-- > blue = round $ cCoord*255 +-- > in PixelRGB8 red green blue +-- +-- <> +ternaryPlot :: Int -- ^ Pixels in the X-axis. More pixels => higher quality. + -> (ACoord -> BCoord -> CCoord -> PixelRGBA8) + -- ^ a+b+c=1. A=1 is the left-most position, + -- B=1 is the top-most position, and + -- C=1 is the right-most position. + -> Tree ternaryPlot density fn = scaleToWidth stdWidth $ translate (-cX) (-cY) $ @@ -36,22 +73,27 @@ ternaryPlot density fn = then PixelRGBA8 0 0 0 0 else fn aCoord bCoord cCoord -atCenter :: Double -> Tree -> Tree -atCenter stdWidth = translate (-cX*stdWidth) (-cY*stdWidth) - where - (cX, cY) = toCartesianCoords (1/3) (1/3) +-- atCenter :: Double -> Tree -> Tree +-- atCenter stdWidth = translate (-cX*stdWidth) (-cY*stdWidth) +-- where +-- (cX, cY) = toCartesianCoords (1/3) (1/3) -radius :: Double -radius = sqrt (cX*cX + cY*cY) - where - (cX, cY) = toCartesianCoords (1/3) (1/3) +-- radius :: Double +-- radius = sqrt (cX*cX + cY*cY) +-- where +-- (cX, cY) = toCartesianCoords (1/3) (1/3) +-- | Compute the XY coordinates from ternary coordinates. +-- Note that @CCoord@ is given because @a+b+c=1@. toCartesianCoords :: ACoord -> BCoord -> (Double, Double) toCartesianCoords a b = (x, y) where x = (a+2*b)/2 y = (sqrt 3 / 2) * a +-- | Compute the XY coordinates relative from the center of the +-- ternary plot. +-- Note that @CCoord@ is given because @a+b+c=1@. toOffsetCartesianCoords :: ACoord -> BCoord -> (Double, Double) toOffsetCartesianCoords a b = (tx-zx, ty-zy) @@ -59,6 +101,7 @@ toOffsetCartesianCoords a b = (zx,zy) = toCartesianCoords (1/3) (1/3) (tx,ty) = toCartesianCoords a b +-- | Compute ternary coordinates from XY coordinates. fromCartesianCoords :: Double -> Double -> (ACoord, BCoord, CCoord) fromCartesianCoords x y = (a,b,1-a-b) where