Récemment, j'ai découvert manim et j'ai adoré le côté procédural du langage.
Voilà ma première « vraie » animation.

Je vous partage le code ici. Il est encore primitif.
N'hésitez pas à me faire une remarque si vous en avez.
config.frame_width = 7
config.frame_height = 12
config.pixel_width = 500
config.pixel_height= 500
class fractionsDecoupe(Scene):
delta = DOWN
def decoupe(self, r, a, n):
epsilon = 0.
return VGroup( *[ Sector( r, start_angle=j*TAU/n+epsilon/2+PI/2, angle=TAU/n-epsilon, color=Color( hue=j/n, saturation=1, luminance=0.6 ) ) for j in range(int(a)) ] ).shift( self.delta );
def decL(self, r, n):
angle=TAU/n
return VGroup( *[ Line( ORIGIN, RIGHT*r*np.cos(angle*j+PI/2)+UP*r*np.sin(angle*j+PI/2), color=BLACK ) for j in range(int(n)+1) ] ).shift( self.delta );
def construct(self):
a = ValueTracker(4)
b = ValueTracker(5)
k = 3
c = 8
fontSize = 56
i = complex(0,1)
circle = Circle(radius=2, color=WHITE, fill_color=WHITE, fill_opacity=0.5).shift( self.delta );
sectors = self.decoupe( circle.radius, a.get_value(), b.get_value() );
t = MathTex(r'\frac{'+str(int(a.get_value()))+'}{' + str(int(b.get_value())) + r'}', font_size=fontSize, color=ORANGE).next_to( circle, UL ).shift(UR*0.5)
t2 = MathTex(r' = \frac{'+str(int(a.get_value()))+'\\times'+str(k)+'}{'+str(int(b.get_value()))+'\\times'+str(k)+ r'}', font_size=fontSize, color=ORANGE).next_to( t, RIGHT )
self.play( DrawBorderThenFill(circle) )
self.wait(0.5)
self.play( Write(t) )
self.play( Create( self.decL(circle.radius, b.get_value() ) ), run_time=2 )
self.play( FadeIn( sectors ), FadeIn( self.decL(circle.radius, b.get_value() ) ), run_time=2 )
a.set_value(a.get_value()*k);
b.set_value(b.get_value()*k);
t3 = MathTex(r' = \frac{'+str(int(a.get_value()))+'}{' + str(int(b.get_value())) + r'}', font_size=fontSize, color=ORANGE).next_to( t2, RIGHT )
self.play( TransformFromCopy( t, t2 ), FadeIn( self.decL(circle.radius, b.get_value() ) ), run_time=2 )
self.play( TransformFromCopy( t2, t3 ), run_time=2 )
box = SurroundingRectangle( VGroup( t, t2, t3 ), buff=0.2 )
self.play( Create( box ) )
self.wait(4)
En modifiant un peu le script précédent, on est capable de faire mieux :