# Animations in Manim

Animations are transformations applied to mobjects over time. Manim provides a rich set of built-in animations for creating smooth, professional-looking transitions.

## Basic Animation Pattern

```python
from manim import *

class BasicAnimation(Scene):
    def construct(self):
        circle = Circle()

        # Play an animation
        self.play(Create(circle))
        self.wait(1)
```

## Creation Animations

Animations for introducing mobjects:

```python
class CreationAnimations(Scene):
    def construct(self):
        square = Square()
        circle = Circle()
        text = Text("Hello")

        # Create (draw stroke)
        self.play(Create(square))
        self.wait(0.5)

        # Fade in
        self.play(FadeIn(circle))
        self.wait(0.5)

        # Write (for text)
        self.play(Write(text))
        self.wait(0.5)

        # Grow from center
        triangle = Triangle()
        self.play(GrowFromCenter(triangle))
```

## Removal Animations

Animations for removing mobjects:

```python
class RemovalAnimations(Scene):
    def construct(self):
        shapes = VGroup(*[Circle() for _ in range(4)])
        shapes.arrange(RIGHT, buff=0.5)
        self.add(shapes)

        # Fade out
        self.play(FadeOut(shapes[0]))

        # Shrink to center
        self.play(ShrinkToCenter(shapes[1]))

        # Uncreate (reverse of Create)
        self.play(Uncreate(shapes[2]))

        # Unwrite (reverse of Write)
        text = Text("Bye")
        self.add(text)
        self.play(Unwrite(text))
```

## Transform Animations

Morph one mobject into another:

```python
class TransformAnimations(Scene):
    def construct(self):
        square = Square()
        circle = Circle()

        self.play(Create(square))
        self.wait(0.5)

        # Transform (original mobject becomes target)
        self.play(Transform(square, circle))
        self.wait(0.5)

        # ReplacementTransform (replace with new mobject)
        triangle = Triangle()
        self.play(ReplacementTransform(square, triangle))
```

## Movement Animations

```python
class MovementAnimations(Scene):
    def construct(self):
        circle = Circle()
        self.add(circle)

        # Shift (relative movement)
        self.play(circle.animate.shift(RIGHT * 2))

        # Move to (absolute position)
        self.play(circle.animate.move_to(UP * 2))

        # Rotate
        self.play(circle.animate.rotate(PI / 2))

        # Scale
        self.play(circle.animate.scale(2))
```

## The .animate Syntax

Use `.animate` to smoothly interpolate property changes:

```python
class AnimateSyntax(Scene):
    def construct(self):
        square = Square()
        self.add(square)

        # Animate multiple properties at once
        self.play(
            square.animate
            .shift(RIGHT * 2)
            .rotate(PI / 4)
            .scale(1.5)
            .set_fill(BLUE, opacity=0.7)
        )
```

## Animation Timing

```python
class AnimationTiming(Scene):
    def construct(self):
        circle = Circle()
        self.add(circle)

        # Set animation duration (default is 1 second)
        self.play(circle.animate.shift(RIGHT * 3), run_time=2)

        # Add delay before next animation
        self.wait(1.5)

        # Fast animation
        self.play(circle.animate.shift(LEFT * 3), run_time=0.5)
```

## Rate Functions (Easing)

Control animation speed curves:

```python
class RateFunctions(Scene):
    def construct(self):
        circles = VGroup(*[Circle() for _ in range(3)])
        circles.arrange(DOWN, buff=1)
        self.add(circles)

        # Linear (constant speed)
        self.play(
            circles[0].animate.shift(RIGHT * 3),
            rate_func=linear
        )

        # Smooth (ease in and out)
        self.play(
            circles[1].animate.shift(RIGHT * 3),
            rate_func=smooth
        )

        # Bounce
        self.play(
            circles[2].animate.shift(RIGHT * 3),
            rate_func=there_and_back
        )
```

## Simultaneous Animations

Animate multiple mobjects at once:

```python
class SimultaneousAnimations(Scene):
    def construct(self):
        circle = Circle()
        square = Square()

        circle.shift(LEFT * 2)
        square.shift(RIGHT * 2)

        # Both animations play simultaneously
        self.play(
            Create(circle),
            Create(square)
        )

        self.play(
            circle.animate.shift(UP),
            square.animate.shift(DOWN)
        )
```

## Sequential vs Simultaneous

```python
class SequentialVsSimultaneous(Scene):
    def construct(self):
        # Sequential (one after another)
        c1 = Circle().shift(LEFT * 3)
        c2 = Circle()
        c3 = Circle().shift(RIGHT * 3)

        self.play(Create(c1))  # First
        self.play(Create(c2))  # Second
        self.play(Create(c3))  # Third

        # Simultaneous (all at once)
        s1 = Square().shift(LEFT * 3 + DOWN * 2)
        s2 = Square().shift(DOWN * 2)
        s3 = Square().shift(RIGHT * 3 + DOWN * 2)

        self.play(Create(s1), Create(s2), Create(s3))  # All together
```

## Resources

- [Animation Reference](https://docs.manim.community/en/stable/reference/manim.animation.animation.Animation.html)
- [Animation Examples](https://docs.manim.community/en/stable/examples.html)
