Created
March 8, 2023 22:12
-
-
Save Strilanc/b396bc0156e368cc2ed6ba29a56c5b56 to your computer and use it in GitHub Desktop.
Using manim to make a rep code animation.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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