Rate functions
Las animaciones que hemos hecho hasta ahora tienen un ritmo particular. Pareciera que empieza lento y poco a poco va acelerando hasta que vuelve a frenar.
Rate functions
Sección titulada «Rate functions»Esto es debido a las rate_functions: funciones que definen que tan rápido progresa una animación. La documentación de Manim nos ofrece unas gráficas que ayudan a aclarar cómo funcionan las rate_functions visualmente:

Para que queden aún más claras, vamos a hacer animaciones que representen algunas de estas funciones.
from manim import *
class RateFuncsExample(Scene): def construct(self): colors = [ RED, GREEN, BLUE, YELLOW, PURPLE ] dots = VGroup( [Dot(color=colors[i]) for i in range(5)] ).scale(4).arrange(DOWN).to_edge(LEFT) self.add(dots) self.wait() self.play( ApplyMethod(dots[0].to_edge, RIGHT, rate_func=rate_functions.smooth), ApplyMethod(dots[1].to_edge, RIGHT, rate_func=rate_functions.double_smooth), ApplyMethod(dots[2].to_edge, RIGHT, rate_func=rate_functions.there_and_back), ApplyMethod(dots[3].to_edge, RIGHT, rate_func=rate_functions.ease_in_bounce), ApplyMethod(dots[4].to_edge, RIGHT, rate_func=rate_functions.ease_in_out_elastic), run_time=5 ) self.wait()¡Ejercicios!
Sección titulada «¡Ejercicios!»Ejercicio 1
Sección titulada «Ejercicio 1»Combina lo aprendido en este apartado y en el apartado anterior de Grupos de Animaciones y juega un poco a ver qué consigues.
Solución al ejercicio 1
from manim import *
class RateFuncsExerciseOne(Scene): def construct(self): dots = VGroup([Dot(color=random_color()) for _ in range(10)]).scale(2).arrange(RIGHT).to_edge(DOWN)
self.add(dots) self.wait() self.play( LaggedStart( *[dot.animate(rate_func=rate_functions.ease_in_bounce).shift(5*UP) for dot in dots], lag_ratio=0.1, ), run_time=10 )Ejercicio 2
Sección titulada «Ejercicio 2»Las rate_functions son funciones que dependen de una variable temporal t que va de 0 a 1. Crea una rate_function propia y aplícala a una animación.
Solución al ejercicio 2
from manim import *from math import sin, tan
def sin_rate_func(t: float) -> float: if t == 0: return 0 else: return sin(2*PI*t)
def tan_rate_func(t: float) -> float: if t == 0: return 0 else: return tan(2*PI*t)
class RateFuncsExerciseTwo(Scene): def construct(self): dots = VGroup([Dot(color=random_color()) for _ in range(10)]).scale(2).arrange(RIGHT)
self.add(dots) self.wait() self.play( LaggedStart( *[dot.animate(rate_func=sin_rate_func).shift(2*UP) for dot in dots], lag_ratio=0.1, ), run_time=10 ) self.play( LaggedStart( *[dot.animate(rate_func=tan_rate_func).shift(2*UP) for dot in dots], lag_ratio=0.1, ), run_time=10 )