first commit

This commit is contained in:
tonitch 2025-03-07 10:16:29 +01:00
commit a430ca2bce
Signed by: tonitch
GPG Key ID: A78D6421F083D42E
4 changed files with 136 additions and 0 deletions

16
Makefile Normal file
View File

@ -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

64
main.py Normal file
View File

@ -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)

8
manim.cfg Normal file
View File

@ -0,0 +1,8 @@
[CLI]
frame_rate = 30
pixel_height = 1080
pixel_width = 1920
background_color = BLACK
background_opacity = 1
scene_names = snowflake

48
requirements.txt Normal file
View File

@ -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