reanimate-1.0.0.0: examples/tut_eq_final.hs
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Lens
import Control.Monad
import Reanimate
import Reanimate.Scene
main :: IO ()
main = reanimate animation
animation :: Animation
animation = env $
scene $ do
symbols <-
mapM
oNew
[symb_e, symb_eq, symb_m, symb_c2]
mapM_ oShow symbols
wait 1
forM_ (zip symbols yPositions) $
\(obj, yPos) -> do
fork $
oTweenS obj 1 $ \t -> do
oScale %= \origin -> fromToS origin scaleFactor t
oLeftX %= \origin -> fromToS origin screenLeft t
oCenterY %= \origin -> fromToS origin yPos t
wait 0.3
wait 1
ls <- mapM oNew [energy, equals, mass, speedOfLight]
-- Maybe show lines with the same center as the symbols.
-- Then show how to align the baselines.
forM_ (zip ls yPositions) $
\(obj, nth) -> do
--bot <- oRead (symbols!!nth) oBottomY
--margin <- oRead (symbols!!nth) oMarginBottom
oModifyS obj $ do
oLeftX .= -4
--oTranslateY .= bot+margin
oCenterY .= nth
oShowWith obj oDraw
wait 2
forM_ ls $ \obj ->
fork $ oHideWith obj oFadeOut
forM_ (reverse symbols) $ \obj -> do
fork $
oTweenS obj 1 $ \t -> do
oScale %= \origin -> fromToS origin 1 t
(oTranslate . _1) %= \pos -> fromToS pos 0 t
(oTranslate . _2) %= \pos -> fromToS pos 0 t
wait 0.3
wait 2
scaleFactor :: Double
scaleFactor = 0.7
symb_e :: SVG
symb_e = snd $ splitGlyphs [0] svg
symb_eq :: SVG
symb_eq = snd $ splitGlyphs [1] svg
symb_m :: SVG
symb_m = snd $ splitGlyphs [2] svg
symb_c2 :: SVG
symb_c2 = snd $ splitGlyphs [3, 4] svg
svg :: SVG
svg =
scale 3 $
center $
latexAlign "E = mc^2"
energy :: SVG
energy =
scale 1.5 $
centerX $
latex "Energy"
equals :: SVG
equals =
scale 1.5 $
centerX $
latex "equals"
mass :: SVG
mass =
scale 1.5 $
centerX $
latex "mass times"
speedOfLight :: SVG
speedOfLight =
scale 1.5 $
centerX $
latex "speed of light$^2$"
yPositions :: [Double]
yPositions = [3, 1, -1, -3]
env :: Animation -> Animation
env =
addStatic (mkBackground "lightblue")
. mapA (withStrokeWidth defaultStrokeWidth)
. mapA (withStrokeColor "black")