packages feed

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")