mathematical animations with haskell https://reanimate.github.io
  • Haskell 95.8%
  • Elm 3.9%
  • Nix 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
David Himmelstrup ff880e7296
Enable FlexibleContexts and import Control.Monad.State (#164)
* Enable FlexibleContexts and import Control.Monad.State

* Import Control.Monad
2020-09-19 09:34:48 +08:00
.azure Efficient time variables. (#145) 2020-09-08 17:35:00 +08:00
.github Delete dist-newstyle if it was restored from cache. 2020-09-09 13:30:30 +08:00
data Add missing icon. 2020-08-06 19:09:43 +08:00
discord-bot Minor style changes. (#155) 2020-09-04 10:15:10 +08:00
docs Rewamp object effects. 2020-09-01 14:15:06 +08:00
examples Use reanimate-svg-0.11.0.0 (#161) 2020-09-08 14:01:18 +08:00
playground Enable FlexibleContexts and import Control.Monad.State (#164) 2020-09-19 09:34:48 +08:00
reanimate-examples Morphology (#112) 2020-08-07 15:34:26 +08:00
reanimate-morph [WIP] Use hgeometry instead of custom code (#142) 2020-08-26 17:39:13 +08:00
src Fix fragile docker builds. (#163) 2020-09-12 21:28:26 +08:00
test Disable unit tests if reanimate library isn't built. 2020-09-09 12:52:32 +08:00
videos [WIP] Use hgeometry instead of custom code (#142) 2020-08-26 17:39:13 +08:00
viewer-elm Bump elm/core from 1.0.4 to 1.0.5 in /viewer-elm 2020-09-03 16:46:56 +08:00
.gitignore Add .stack-work to .gitignore 2019-12-10 10:36:07 +01:00
.stylish-haskell.yaml Update stylish preferences. 2020-08-27 13:42:59 +08:00
azure-pipelines.yml Fix azure formatting. 2019-09-17 10:04:23 +08:00
ChangeLog.md ChangeLog format and tighter bounds (#162) 2020-09-09 13:28:07 +08:00
default.nix Adding haskell.nix based default and shell.nix (#141) 2020-09-02 09:47:04 +08:00
Dockerfile.discord Fix fragile docker builds. (#163) 2020-09-12 21:28:26 +08:00
Dockerfile.playground Fix fragile docker builds. (#163) 2020-09-12 21:28:26 +08:00
hie.yaml Discord bot (#108) 2020-07-14 13:49:27 +08:00
LICENSE Create LICENSE 2019-09-12 23:00:55 +08:00
mkdocs.yml Remove link to gallery and disable link to morphology article. 2020-08-11 15:33:07 +08:00
README.md Note that the playground has been completed. 2020-09-02 18:49:54 +08:00
reanimate.cabal Add autogen-modules field. 2020-09-09 15:10:47 +08:00
RESOURCES.md Country distortion video (#54) 2020-02-20 21:22:36 +08:00
run-tests.sh Update test runner script. 2020-08-25 18:22:06 +08:00
Setup.hs First stab at reanimate. 2019-02-13 21:08:49 +01:00
shell.nix Adding haskell.nix based default and shell.nix (#141) 2020-09-02 09:47:04 +08:00
stack-lts-13.yaml Use reanimate-svg-0.11.0.0 (#161) 2020-09-08 14:01:18 +08:00
stack-lts-14.yaml Use reanimate-svg-0.11.0.0 (#161) 2020-09-08 14:01:18 +08:00
stack-lts-15.yaml Use reanimate-svg-0.11.0.0 (#161) 2020-09-08 14:01:18 +08:00
stack.yaml Use reanimate-svg-0.11.0.0 (#161) 2020-09-08 14:01:18 +08:00

Hackage packagename on Stackage LTS packagename on Stackage Nightly Build Status Documentation Status Platforms GitHub repo size API docs coverage Docker Cloud Build Status Discord

Reanimate

Reanimate is a library for programmatically generating animations with a twist towards mathematics / 2D vector drawings. A lot of inspiration was drawn from 3b1b's manim library.

Reanimate aims at being a batteries-included way of gluing together different technologies: SVG as a universal image format, LaTeX for typesetting, ffmpeg for video encoding, inkscape/imagemagick for rasterization, potrace for vectorization, blender/povray for 3D graphics, and Haskell for scripting.

In more practical terms, reanimate is a library for turning code like this:

main = reanimate $ docEnv $ playThenReverseA drawCircle

... into animations like this:

Draw Circle

If you like what you see, boost reanimate's visibility with a star or consider becoming a sponsor ❤.

What is reanimate good at?

Vector graphics and math

Tangent/Normal Fourier

Mapping and tracing

Geo JSON Object tracing

Mathematical typesetting and effects

LaTeX Stars

2D physics and 3D graphics

2D Physics 3D graphics

Prerequisites

Reanimate is built using the Haskell Tool Stack. For installation instructions, see: https://docs.haskellstack.org/en/stable/README/

Optionally, you can install one or more of these programs to enable additional features:

I highly recommend that you install at least 'ffmpeg' and 'latex'.

Installing / Running an example

Reanimate ships with a web-based viewer and automatic code reloading. To get a small demo up and running, clone the repository, run one of the examples (this will install the library), and wait for a browser window to open:

$ git clone https://github.com/reanimate/reanimate.git
$ cd reanimate/
$ stack build
$ stack ./examples/doc_drawCircle.hs

This should render the doc_drawCircle example in a new browser window. If you then change the animation source code, the browser window will automatically reload and show the updated animation.

Using Cabal

It's also possible to use cabal instead of stack:

$ git clone https://github.com/reanimate/reanimate.git
$ cd reanimate/
$ cabal v2-build
$ # Workaround for a cabal bug: https://github.com/haskell/cabal/issues/6235
$ export reanimate_datadir=`pwd`
$ cabal v2-exec -- runhaskell examples/doc_drawCircle.hs --ghc ghc

Using Nix

If you'd rather use nix to build an environment with all of the system dependencies mentioned previously do:

$ git clone https://github.com/reanimate/reanimate.git
$ cd reanimate/
$ nix-shell
[nix-shell:./reanimate]$ cabal v2-build --write-ghc-environment-files=always

If you have cachix available run cachix use cdodev before you drop into the nix shell. This will significantly speed things up!

This will write a file in the working directory like .ghc.environment.x86_64-linux-8.8.3 which will enable commands like runhaskell to pick up reanimate.

Now, still within the nix-shell you can run:

[nix-shell:./reanimate]$ reanimate_datadir=. runhaskell examples/doc_drawCircle.hs --ghc `which ghc`

Documentation

Features

  • Cross-platform. Official support for Linux, MacOS, and Windows.
  • Well-documented. API reference documentation include GIFs to illustrate behavior, and in-depth tutorial/explanation articles are hosted on readthedocs.io.
  • Advanced type-setting via LaTeX.
  • Voice control: Align animation timings with a transcript.
  • 3D graphics: Built-in support for integrating povray and blender.
  • Mapping: Built-in support for GeoJSON and map projections.
  • Online playground for toying with reanimate scripts.

Roadmap

  • Easy-to-use font selection when using latex/xelatex/luatex.
  • Polygon morphing framework with support for several algorithms, including: linear interpolation, as-rigid-as-possible interpolation, and intersection-free interpolation.
  • Built-in tools for creating presentations.

Authors

  • David Himmelstrup.
  • Jan Hrcek.

License

This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.

Acknowledgments

  • Huge thanks to 3b1b's manim which inspired this library.
  • Thanks to svg-tree for their SVG library.
  • Thanks to CthulhuDen/chiphunk for making a 2D physics library easily available.
  • Thanks to Peter Johnson for reserving the 'reanimate' organization on GitHub.

YouTube

Completed animations are uploaded to the Reanimated Science channel.

Animation snippets are uploaded to the Reanimated Science Shorts channel.