commit a430ca2bcebd1abaec6623f22c47b29d900eb366 Author: tonitch Date: Fri Mar 7 10:16:29 2025 +0100 first commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1472b3f --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +.PHONY: all preview render opengl venv +all: preview + +preview: main.py + manim render main.py -pqm + +render: main.py + manim render main.py -qh + +opengl: main.py + manim render main.py -p --renderer=opengl + +venv: requirements.txt + python -m venv venv + source venv/bin/activate + pip install -r requirements diff --git a/main.py b/main.py new file mode 100644 index 0000000..1c794c9 --- /dev/null +++ b/main.py @@ -0,0 +1,64 @@ +from manim import * +import math + +def norm(vec): + return math.sqrt(sum([xi ** 2 for xi in vec])) + +def normalize(vec): + n = norm(vec) + return [xi / n for xi in vec] + +def plus(v1, v2): + return [x1 + x2 for x1, x2 in zip(v1, v2)] + +def minus(v1, v2): + return [x1 - x2 for x1, x2 in zip(v1, v2)] + +def mult(v, c): + return [xi * c for xi in v] + +def SegmentedLine(points): + assert(len(points) >= 2) + ret = [] + for p1, p2 in zip( points[:-1], points[1:] ): + vec = minus(p2, p1) + length = norm(vec) + normalized = normalize(vec) + rotated = [-normalized[1], normalized[0], 0] + + ret.append(p1) + ret.append(plus(p1, mult(normalized, length * 1/3))) + ret.append(plus(p1, plus(mult(normalized, length/2), mult(rotated, math.sqrt(3) * length / 6)))) + ret.append(plus(p1, mult(normalized, length * 2/3))) + ret.append(points[-1]) + return ret + +class snowflake(Scene): + def construct(self): + + points = [[-7, -1, 0], + [ 7, -1, 0]] + + segment = VMobject(stroke_width=1) + segment.set_points_as_corners(points) + + self.add(*[Dot(p) for p in points]) + + self.play(Create(segment)) + self.wait(1) + + vg = VGroup() + for i in range(3): + points = SegmentedLine(points) + vg.add(*[Dot(p) for p in points]) + self.play(Create(vg)) + self.play(segment.animate.set_points_as_corners(points)) + self.wait(1) + + self.play(Uncreate(vg)) + self.play(*[FadeOut(mob) for mob in self.mobjects]) + + +if __name__ == "__main__": + sc = snowflake() + sc.render(True) diff --git a/manim.cfg b/manim.cfg new file mode 100644 index 0000000..a5ac143 --- /dev/null +++ b/manim.cfg @@ -0,0 +1,8 @@ +[CLI] +frame_rate = 30 +pixel_height = 1080 +pixel_width = 1920 +background_color = BLACK +background_opacity = 1 +scene_names = snowflake + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..47106ad --- /dev/null +++ b/requirements.txt @@ -0,0 +1,48 @@ +asttokens==3.0.0 +audioop-lts==0.2.1 +av==13.1.0 +beautifulsoup4==4.13.3 +click==8.1.8 +cloup==3.0.6 +dearpygui==2.0.0 +decorator==5.2.1 +executing==2.2.0 +glcontext==3.0.0 +ipython==9.0.1 +ipython_pygments_lexers==1.1.1 +isosurfaces==0.1.2 +jedi==0.19.2 +manim==0.19.0 +ManimPango==0.6.0 +mapbox_earcut==1.0.3 +markdown-it-py==3.0.0 +matplotlib-inline==0.1.7 +mdurl==0.1.2 +moderngl==5.12.0 +moderngl-window==3.1.1 +networkx==3.4.2 +numpy==2.2.3 +parso==0.8.4 +pexpect==4.9.0 +pillow==11.1.0 +prompt_toolkit==3.0.50 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pycairo==1.27.0 +pydub==0.25.1 +pyglet==2.1.3 +pyglm==2.8.0 +Pygments==2.19.1 +rich==13.9.4 +scipy==1.15.2 +screeninfo==0.8.1 +skia-pathops==0.8.0.post2 +soupsieve==2.6 +srt==3.5.3 +stack-data==0.6.3 +svgelements==1.9.6 +tqdm==4.67.1 +traitlets==5.14.3 +typing_extensions==4.12.2 +watchdog==6.0.0 +wcwidth==0.2.13