diff --git a/examples/boundingbox.hs b/examples/boundingbox.hs new file mode 100755 index 0000000..b723955 --- /dev/null +++ b/examples/boundingbox.hs @@ -0,0 +1,51 @@ +#!/usr/bin/env stack +-- stack --resolver lts-13.14 runghc --package reanimate +{-# LANGUAGE OverloadedStrings #-} +module Main (main) where + +import Control.Lens + +import Graphics.SvgTree (Number(..),Tree) +import Reanimate.Driver (reanimate) +import Reanimate.LaTeX +import Reanimate.Monad +import Reanimate.Svg +import Reanimate.Signal + +main :: IO () +main = reanimate bbox + +bbox :: Animation +bbox = bg `sim` + mapA (translate (-50) 0) bbox1 `sim` + mapA (translate 50 0) bbox2 + where + bg = mkAnimation 0 $ emit $ mkBackground "black" + +bbox1 :: Animation +bbox1 = mkAnimation 5 $ do + s <- getSignal signalLinear + emit $ mkGroup + [ mkBoundingBox $ rotate (360*s) svg + , withFillColor "white" $ rotate (360*s) svg ] + where + svg = scale 3 $ center $ latexAlign "\\sum_{k=1}^\\infty" + +bbox2 :: Animation +bbox2 = autoReverse $ mkAnimation 2.5 $ do + s <- getSignal signalLinear + emit $ mkGroup + [ mkBoundingBox $ partialSvg s heartShape + , withStrokeColor "white" $ withFillOpacity 0 $ partialSvg s heartShape ] + +mkBoundingBox :: Tree -> Tree +mkBoundingBox svg = withStrokeColor "red" $ withFillOpacity 0 $ + mkRect (Num x, Num y) (Num w) (Num h) + where + (x, y, w, h) = boundingBox svg + +heartShape = + center $ rotateAroundCenter 225 $ mkPathString + "M0.0,40.0 v-40.0 h40.0\ + \a20.0 20.0 90.0 0 1 0.0,40.0\ + \a20.0 20.0 90.0 0 1 -40.0,0.0 Z" diff --git a/examples/latex_basic.hs b/examples/latex_basic.hs new file mode 100755 index 0000000..3e37072 --- /dev/null +++ b/examples/latex_basic.hs @@ -0,0 +1,24 @@ +#!/usr/bin/env stack +-- stack --resolver lts-13.14 runghc --package reanimate +{-# LANGUAGE OverloadedStrings #-} +module Main (main) where + +import Control.Lens + +import Graphics.SvgTree (Number(..)) +import Reanimate.Driver (reanimate) +import Reanimate.LaTeX +import Reanimate.Monad +import Reanimate.Svg +import Reanimate.Signal + +main :: IO () +main = reanimate $ autoReverse $ mkAnimation 2 $ do + s <- getSignal signalLinear + emit $ mkGroup + [ mkBackground "black" + , withStrokeColor "white" $ withFillOpacity 0 $ withStrokeWidth (Num 0.1) text + , withFillColor "white" $ withFillOpacity s text ] + where + text = scale 4 $ center $ latexAlign + "\\sum_{k=1}^\\infty {1 \\over k^2} = {\\pi^2 \\over 6}" diff --git a/examples/latex_color.hs b/examples/latex_color.hs index 36099ca..b365a0c 100755 --- a/examples/latex_color.hs +++ b/examples/latex_color.hs @@ -1,5 +1,5 @@ #!/usr/bin/env stack --- stack --resolver lts-12.26 runghc --package reanimate +-- stack --resolver lts-13.14 runghc --package reanimate {-# LANGUAGE OverloadedStrings #-} module Main (main) where diff --git a/examples/latex_draw.hs b/examples/latex_draw.hs new file mode 100755 index 0000000..0c6c206 --- /dev/null +++ b/examples/latex_draw.hs @@ -0,0 +1,29 @@ +#!/usr/bin/env stack +-- stack --resolver lts-13.14 runghc --package reanimate +{-# LANGUAGE OverloadedStrings #-} +module Main (main) where + +import Control.Lens + +import Graphics.SvgTree (Number(..)) +import Reanimate.Driver (reanimate) +import Reanimate.LaTeX +import Reanimate.Monad +import Reanimate.Svg +import Reanimate.Signal + +main :: IO () +main = reanimate $ + bg `sim` (autoReverse $ drawText `andThen` fillText) + where + bg = mkAnimation 0 $ emit (mkBackground "black") + msg = "\\sum_{k=1}^\\infty {1 \\over k^2} = {\\pi^2 \\over 6}" + glyphs = pathify $ center $ latexAlign msg + fillText = mkAnimation 1 $ do + s <- getSignal signalLinear + emit $ scale 5 $ withFillColor "white" $ withFillOpacity s glyphs + drawText = mkAnimation 2 $ do + s <- getSignal signalLinear + emit $ scale 5 $ + withStrokeColor "white" $ withFillOpacity 0 $ withStrokeWidth (Num 0.1) $ + partialSvg s glyphs diff --git a/examples/sunflower.hs b/examples/sunflower.hs new file mode 100755 index 0000000..cc01739 --- /dev/null +++ b/examples/sunflower.hs @@ -0,0 +1,53 @@ +#!/usr/bin/env stack +-- stack --resolver lts-13.14 runghc --package reanimate +{-# LANGUAGE OverloadedStrings #-} +module Main (main) where + +import Codec.Picture.Types +import qualified Data.Colour.Palette.BrewerSet as D +import qualified Diagrams.Backend.SVG as D +import Diagrams.Prelude hiding (Animation, boundingBox, + center, circle, duration, + fontSize, rotate, scale, + translate) +import qualified Diagrams.Prelude as D +import qualified Diagrams.TwoD.Path.LSystem as D +import Graphics.SvgTree (Number (..)) +import Graphics.SvgTree as S +import Linear.V2 +import Reanimate.Diagrams +import Reanimate.Driver (reanimate) +import Reanimate.LaTeX +import Reanimate.Monad +import Reanimate.Signal +import Reanimate.Svg + + +main :: IO () +main = reanimate $ mkAnimation 10 $ do + n <- getSignal $ signalFromTo 1 500 signalLinear + rot <- getSignal $ signalFromTo 0 45 signalLinear + emit $ mkBackground "black" + emit $ rotate rot $ translate (-320/2) (-180/2) + (dSvg $ round n) + where + cached = [ dSvg n | n <- [0..]] + dSvg n = renderDiagram $ withEnvelope (D.rect 320 180 :: SvgDiagram) $ + D.scale 5 $ sunflower n + + mkCoords :: [P2 Double] + mkCoords =[coord (fromIntegral i) | i <- [1..]] + where + coord m = p2 $ fromPolar (sqrt m) (2.4 * m) + fromPolar r theta = (r * cos theta, r * sin theta) + + floret :: Double -> SvgDiagram + floret r = D.circle 0.6 # lw none # fc (colors !! n) + where + n = floor (1.4 * sqrt r) `mod` 10 + colors = black : (reverse $ D.brewerSet D.YlOrBr 9) + + sunflower :: Int -> SvgDiagram + sunflower n = frame 4 $ position $ take n $ zip mkCoords florets + where + florets = [ floret (sqrt (fromIntegral i)) | i <- [1 ..]] diff --git a/examples/tangent_and_normal.hs b/examples/tangent_and_normal.hs new file mode 100755 index 0000000..9355edc --- /dev/null +++ b/examples/tangent_and_normal.hs @@ -0,0 +1,63 @@ +#!/usr/bin/env stack +-- stack --resolver lts-13.14 runghc --package reanimate +{-# LANGUAGE OverloadedStrings #-} +module Main (main) where + +import Codec.Picture.Types +import qualified Data.Colour.Palette.BrewerSet as D +import qualified Diagrams.Backend.SVG as D +import Diagrams.Prelude hiding (Animation, boundingBox, + center, circle, duration, + fontSize, rotate, scale, + translate) +import qualified Diagrams.Prelude as D +import qualified Diagrams.TwoD.Path.LSystem as D +import Graphics.SvgTree (Number (..)) +import Graphics.SvgTree as S +import Linear.V2 +import Reanimate.Diagrams +import Reanimate.Driver (reanimate) +import Reanimate.LaTeX +import Reanimate.Monad +import Reanimate.Signal +import Reanimate.Svg + + +main :: IO () +main = reanimate $ mkAnimation 5 $ do + s <- oscillate $ getSignal $ signalCurve 2 + emit $ mkBackground "black" + emit $ translate (-320/2) (-180/2) $ withStrokeColor "white" $ + renderDiagram $ + withEnvelope (D.rect 320 180 :: SvgDiagram) $ + D.scale 50 $ D.translate (V2 (-2) (-0.75)) $ dia s + where + dia param = + frame 0.5 $ lc white $ + mconcat + [ lc green $ rightAngleSquare + , tangentLine + , baselineText "tangent" # D.translate tangentVector + , normalLine + , topLeftText "normal" # D.translate (-normalVector) + ] # moveTo pt # D.fontSize large + <> strokeLocTrail spline + where + pts = map p2 [(0,0), (1,1), (2,1), (3,0), (3.5,0)] + + spline :: Located (Trail V2 Double) + spline = cubicSpline False pts + + pt = atParam spline param + tangentVector :: V2 Double + tangentVector = D.normalize $ tangentAtParam spline param + normalVector = D.normalize $ normalAtParam spline param + + symmetricLine :: V2 Double -> SvgDiagram + symmetricLine v = fromOffsets [2 *^ v] # D.center + tangentLine :: SvgDiagram + tangentLine = symmetricLine tangentVector + normalLine = symmetricLine normalVector + + rightAngleSquare :: SvgDiagram + rightAngleSquare = square 0.1 # alignBL # D.rotate (signedAngleBetween tangentVector unitX)