Resolviendo ecuaciones de primer grado

Resultado

from manim import *

class ResolverEcuacion(Scene):
    def construct(self):
        # Primera ecuación, ubicada en la parte superior
        eq1 = MathTex("2x", "-", "5", "+", "4x", "=", "x", "+", "5", "-", "2x", "+", "4")
        eq1.to_edge(UP)
        self.play(Write(eq1))
        self.wait()

        # Cambia de color las incógnitas y los números que se van a mover
        self.play(
            eq1[6].animate.set_color(RED),   # x a la derecha
            eq1[8].animate.set_color(BLUE),  # 5 a la derecha
            eq1[10].animate.set_color(RED),  # -2x a la derecha
            eq1[12].animate.set_color(BLUE), # 4 a la derecha
            eq1[2].animate.set_color(BLUE),  # -5 a la izquierda
        )
        self.wait()

        # Segunda ecuación: todos los términos en su lado correspondiente
        eq2 = MathTex("2x", "+", "4x", "+", "2x", "-", "x", "=", "5", "+", "4", "+", "5")
        eq2.next_to(eq1, DOWN, buff=0.7)
        self.play(Write(eq2[0]), Write(eq2[1]), Write(eq2[2]), Write(eq2[3]), Write(eq2[5]), Write(eq2[7]), Write(eq2[9]), Write(eq2[11]))
        # Colores para las incógnitas y números que se mueven
        eq2[4].set_color(RED)   # 2x que viene de la derecha
        eq2[6].set_color(RED)   # -x que viene de la derecha
        eq2[8].set_color(BLUE)  # 5 que viene de la derecha
        eq2[10].set_color(BLUE) # 4 que viene de la derecha
        eq2[12].set_color(BLUE) # 5 que viene de la izquierda

        # Animaciones: mueve incógnitas y números a la vez
        self.play(
            ReplacementTransform(eq1[10].copy(), eq2[4]),   # -2x a la izquierda como +2x
            ReplacementTransform(eq1[6].copy(), eq2[6]),    # x a la izquierda como -x
            ReplacementTransform(eq1[8].copy(), eq2[8]),    # 5 a la derecha
            ReplacementTransform(eq1[12].copy(), eq2[10]),  # 4 a la derecha
            ReplacementTransform(eq1[2].copy(), eq2[12]),   # -5 a la derecha como +5
        )
        self.wait()

        # Devuelve los colores a normal
        self.play(
            eq2[4].animate.set_color(YELLOW),   # 2x
            eq2[6].animate.set_color(YELLOW),   # -x
            eq2[0].animate.set_color(YELLOW),   # 2x
            eq2[2].animate.set_color(YELLOW),   # 4x
            eq2[8].animate.set_color(GREEN),    # 5
            eq2[10].animate.set_color(GREEN),   # 4
            eq2[12].animate.set_color(GREEN)    # 5
        )
        self.wait()

        # Paso final: simplificar ambos lados
        eq3 = MathTex("7x", "=", "14")
        eq3.next_to(eq2, DOWN, buff=0.7)
        self.play(Write(eq3))
        eq3[0].set_color(YELLOW)   # 7x
        eq3[2].set_color(GREEN)    # 14

        self.play(
            ReplacementTransform(eq2[0].copy(), eq3[0]),   # 2x -> 7x
            ReplacementTransform(eq2[2].copy(), eq3[0]),   # 4x -> 7x
            ReplacementTransform(eq2[4].copy(), eq3[0]),   # 2x -> 7x
            ReplacementTransform(eq2[6].copy(), eq3[0]),   # -x -> 7x
            ReplacementTransform(eq2[8].copy(), eq3[2]),   # 5 -> 14
            ReplacementTransform(eq2[10].copy(), eq3[2]),  # 4 -> 14
            ReplacementTransform(eq2[12].copy(), eq3[2]),  # 5 -> 14
        )
        self.wait()

        # Devuelve los colores a normal
        self.play(
            eq3[0].animate.set_color(WHITE),
            eq3[2].animate.set_color(WHITE)
        )
        self.wait()

        # --- Nueva transición: 7x = 14  -->  x = 14/7  --> x = 2 ---
        # Resalta el 7 antes de despejar x
        siete_izq = eq3[0][0]  # El primer carácter de "7x" es el "7"
        self.play(siete_izq.animate.set_color(BLUE))
        self.wait()

        # Ecuación con fracción
        eq4 = MathTex("x", "=", r"\frac{14}{7}")
        eq4.next_to(eq3, DOWN, buff=0.7)
        self.play(Write(eq4))
        siete_denominador = eq4.get_part_by_tex("7")
        catorce_numerador = eq4.get_part_by_tex("14")
        catorce_numerador.set_color(WHITE)  # Fuerza el color blanco
        siete_denominador.set_color(BLUE)

        self.play(
            ReplacementTransform(siete_izq.copy(), siete_denominador)
        )
        self.wait(2) # El 7 permanece azul 2 segundos

        # Devuelve el color a normal
        self.play(siete_denominador.animate.set_color(WHITE))
        self.wait()

        # Último paso: simplificar la fracción
        eq5 = MathTex("x", "=", "2")
        eq5.next_to(eq4, DOWN, buff=0.7)
        self.play(Write(eq5))
        self.wait()