Skip to content

Instantly share code, notes, and snippets.

@Strilanc
Created March 8, 2023 22:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Strilanc/b396bc0156e368cc2ed6ba29a56c5b56 to your computer and use it in GitHub Desktop.
Save Strilanc/b396bc0156e368cc2ed6ba29a56c5b56 to your computer and use it in GitHub Desktop.
Using manim to make a rep code animation.
from manim import *
class SquareToCircle(Scene):
def construct(self):
n = 5
h = n // 2
bits = [MathTex("0") for k in range(n)]
bits2 = [MathTex(f"b_{{{k+1}}}") for k in range(n)]
dt = 20
comparisons = [[MathTex(r"\stackrel{?}{=}") for k in range(n - 1)] for _ in range(dt)]
bits[h].center()
bits[h].shift(np.array([0, 3, 0]))
for k in range(h + 1, n):
bits[k].next_to(bits[k - 1], RIGHT, 2)
for k in range(h)[::-1]:
bits[k].next_to(bits[k + 1], LEFT, 2)
for k in range(n):
bits2[k].move_to(bits[k])
times = [MathTex(f"t={t+1}").scale(0.5).next_to(bits[0], LEFT, 0.5) for t in range(dt)]
for d in range(dt):
for k in range(n - 1):
comparisons[d][k].next_to(bits[k], RIGHT, 1)
results_eq = [MathTex("=") for k in range(n - 1)]
results_neq = [MathTex(r"\neq").set_color(RED) for k in range(n - 1)]
for k in range(n - 1):
results_eq[k].move_to(comparisons[0][k])
results_neq[k].move_to(comparisons[0][k])
self.play(*[Create(bits[k]) for k in range(n)])
self.play(*[bits[k].animate.become(bits2[k]) for k in range(n)])
error = Circle(radius=0.5, color=RED).set_fill(color=RED, opacity=0.5).move_to(bits[1])
error2 = Circle(radius=0.5, color=RED).set_fill(color=RED, opacity=0.5).move_to(bits[2])
error3 = Circle(radius=0.5, color=RED).set_fill(color=RED, opacity=0.5).move_to(bits[0])
for d1 in range(dt):
v1 = [Create(comparisons[d1][k]) for k in range(n - 1)]
if d1 > 0:
v1.extend(comparisons[d1 - 1][k].animate.become(results_neq[k]
if (3 <= d1 < 13 if k == 0
else 3 <= d1 < 8 if k == 1
else 8 <= d1 if k == 2
else False if k == 3
else False)
else results_eq[k]).shift(np.array([0, -0.5, 0])) for k in range(n - 1))
for d2 in range(d1 - 1):
v1.extend(comparisons[d2][k].animate.shift(np.array([0, -0.5, 0])) for k in range(n - 1))
if d1 == 3:
v1.append(Succession(GrowFromCenter(error).set_run_time(0.1), FadeOut(error).set_run_time(0.6)))
if d1 == 8:
v1.append(Succession(GrowFromCenter(error2).set_run_time(0.1), FadeOut(error2).set_run_time(0.6)))
if d1 == 13:
v1.append(Succession(GrowFromCenter(error3).set_run_time(0.1), FadeOut(error3).set_run_time(0.6)))
v1.append(Create(times[d1]))
for d2 in range(d1):
v1.append(times[d2].animate.shift(np.array([0, -0.5, 0])))
self.play(*v1)
self.wait(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment