mirror of
https://github.com/reanimate/reanimate.git
synced 2026-09-10 23:52:22 +00:00
114 lines
2.3 KiB
Haskell
114 lines
2.3 KiB
Haskell
{-# 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")
|