aboutsummaryrefslogtreecommitdiffstats
path: root/vorlesungen/punktgruppen
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--vorlesungen/punktgruppen/.gitignore20
-rw-r--r--vorlesungen/punktgruppen/Makefile18
-rw-r--r--vorlesungen/punktgruppen/crystals.py611
-rw-r--r--vorlesungen/punktgruppen/media/images/nosignal.jpgbin0 -> 711846 bytes
-rw-r--r--vorlesungen/punktgruppen/poetry.lock743
-rw-r--r--vorlesungen/punktgruppen/pyproject.toml15
-rw-r--r--vorlesungen/punktgruppen/script.pdfbin0 -> 44991 bytes
-rw-r--r--vorlesungen/punktgruppen/script.tex214
-rw-r--r--vorlesungen/punktgruppen/slides.pdfbin0 -> 790926 bytes
-rw-r--r--vorlesungen/punktgruppen/slides.tex895
10 files changed, 2516 insertions, 0 deletions
diff --git a/vorlesungen/punktgruppen/.gitignore b/vorlesungen/punktgruppen/.gitignore
new file mode 100644
index 0000000..3633a3d
--- /dev/null
+++ b/vorlesungen/punktgruppen/.gitignore
@@ -0,0 +1,20 @@
+# directories
+__pycache__
+media/Tex
+
+media/images/crystal
+media/images/freezeframes
+
+media/videos
+media/audio
+
+media/Punktgruppen
+media/Punktgruppen.mp4
+
+build
+
+# files
+script.log
+slides.log
+slides.vrb
+missfont.log
diff --git a/vorlesungen/punktgruppen/Makefile b/vorlesungen/punktgruppen/Makefile
new file mode 100644
index 0000000..302e976
--- /dev/null
+++ b/vorlesungen/punktgruppen/Makefile
@@ -0,0 +1,18 @@
+TEX=xelatex
+TEXARGS=--output-directory=build --halt-on-error --shell-escape
+
+all: slides.pdf script.pdf media
+
+.PHONY: clean
+clean:
+ @rm -rfv build
+
+%.pdf: %.tex
+ mkdir -p build
+ $(TEX) $(TEXARGS) $<
+ $(TEX) $(TEXARGS) $<
+ cp build/$@ .
+
+media:
+ poetry install
+ poetry run manim -ql crystals.py
diff --git a/vorlesungen/punktgruppen/crystals.py b/vorlesungen/punktgruppen/crystals.py
new file mode 100644
index 0000000..4a9836a
--- /dev/null
+++ b/vorlesungen/punktgruppen/crystals.py
@@ -0,0 +1,611 @@
+from manim import *
+
+import math as m
+import numpy as np
+import itertools as it
+
+# configure style
+config.background_color = '#202020'
+config.tex_template.add_to_preamble(
+ r"\usepackage[p,osf]{scholax}"
+ r"\usepackage{amsmath}"
+ r"\usepackage[scaled=1.075,ncf,vvarbb]{newtxmath}"
+)
+
+# scenes
+class Geometric2DSymmetries(Scene):
+ def construct(self):
+ self.wait(5)
+
+ self.intro()
+ self.cyclic()
+ self.dihedral()
+ self.circle()
+
+ def intro(self):
+ # create square
+ square = Square()
+ square.set_fill(PINK, opacity=.5)
+ self.play(SpinInFromNothing(square))
+ self.wait()
+
+ # the action of doing nothing
+ action = MathTex(r"\mathbb{1}")
+ self.play(Write(action))
+ self.play(ApplyMethod(square.scale, 1.2))
+ self.play(ApplyMethod(square.scale, 1/1.2))
+ self.play(FadeOut(action))
+ self.wait()
+
+ # show some reflections
+ axis = DashedLine(2 * LEFT, 2 * RIGHT)
+ sigma = MathTex(r"\sigma")
+ sigma.next_to(axis, RIGHT)
+
+ self.play(Create(axis))
+ self.play(Write(sigma))
+ self.play(ApplyMethod(square.flip, RIGHT))
+
+ for d in [UP + RIGHT, UP]:
+ self.play(
+ Rotate(axis, PI/4),
+ Rotate(sigma, PI/4, about_point=ORIGIN))
+
+ self.play(Rotate(sigma, -PI/4), run_time=.5)
+ self.play(ApplyMethod(square.flip, d))
+
+ self.play(FadeOutAndShift(sigma), Uncreate(axis))
+
+ # show some rotations
+ dot = Dot(UP + RIGHT)
+ figure = VGroup(square, dot)
+
+ rot = MathTex(r"r")
+ self.play(Write(rot), Create(dot))
+
+ last = rot
+ for newrot in map(MathTex, [r"r", r"r^2", r"r^3"]):
+ self.play(
+ ReplacementTransform(last, newrot),
+ Rotate(figure, PI/2, about_point=ORIGIN))
+ self.wait(.5)
+ last = newrot
+
+ self.play(Uncreate(dot), FadeOut(square), FadeOut(last))
+
+
+ def cyclic(self):
+ # create symmetric figure
+ figure = VGroup()
+ prev = [1.5, 0, 0]
+ for i in range(1,6):
+ pos = [
+ 1.5*m.cos(2 * PI/5 * i),
+ 1.5*m.sin(2 * PI/5 * i),
+ 0
+ ]
+
+ if prev:
+ line = Line(prev, pos)
+ figure.add(line)
+
+ dot = Dot(pos, radius=.1)
+ if i == 5:
+ dot.set_fill(RED)
+
+ prev = pos
+ figure.add(dot)
+
+ group = MathTex(r"G = \langle r \rangle")
+ self.play(Write(group), run_time = 2)
+ self.wait(3)
+
+ self.play(ApplyMethod(group.to_edge, UP))
+
+ actions = map(MathTex, [
+ r"\mathbb{1}", r"r", r"r^2",
+ r"r^3", r"r^4", r"\mathbb{1}", r"r"])
+
+ action = next(actions, MathTex(r"r"))
+
+ self.play(Create(figure))
+ self.play(Write(action))
+ self.wait()
+
+ for i in range(5):
+ newaction = next(actions, MathTex(r"r"))
+ self.play(
+ ReplacementTransform(action, newaction),
+ Rotate(figure, 2*PI/5, about_point=ORIGIN))
+ action = newaction
+
+ self.wait()
+ newaction = next(actions, MathTex(r"r"))
+ self.play(
+ ReplacementTransform(action, newaction),
+ Rotate(figure, 2*PI/5, about_point=ORIGIN))
+ action = newaction
+ self.wait(2)
+
+ self.play(Uncreate(figure), FadeOut(action))
+
+ whole_group = MathTex(
+ r"G = \langle r \rangle"
+ r"= \left\{\mathbb{1}, r, r^2, r^3, r^4 \right\}")
+
+ self.play(ApplyMethod(group.move_to, ORIGIN))
+ self.play(ReplacementTransform(group, whole_group))
+ self.wait(5)
+
+ cyclic = MathTex(
+ r"C_n = \langle r \rangle"
+ r"= \left\{\mathbb{1}, r, r^2, \dots, r^{n-1} \right\}")
+
+ cyclic_title = Tex(r"Zyklische Gruppe")
+ cyclic_title.next_to(cyclic, UP * 2)
+
+ cyclic.scale(1.2)
+ cyclic_title.scale(1.2)
+
+ self.play(ReplacementTransform(whole_group, cyclic))
+ self.play(FadeInFrom(cyclic_title, UP))
+
+ self.wait(5)
+ self.play(FadeOut(cyclic), FadeOut(cyclic_title))
+
+ def dihedral(self):
+ # create square
+ square = Square()
+ square.set_fill(PINK, opacity=.5)
+
+ # generator equation
+ group = MathTex(
+ r"G = \langle \sigma, r \,|\,",
+ r"\sigma^2 = \mathbb{1},",
+ r"r^4 = \mathbb{1},",
+ r"(\sigma r)^2 = \mathbb{1} \rangle")
+
+ self.play(Write(group), run_time = 2)
+ self.wait(5)
+
+ self.play(ApplyMethod(group.to_edge, UP))
+ self.play(FadeIn(square))
+ self.wait()
+
+ # flips
+ axis = DashedLine(2 * LEFT, 2 * RIGHT)
+ sigma = MathTex(r"\sigma^2 = \mathbb{1}")
+ sigma.next_to(axis, RIGHT)
+ self.play(Create(axis), Write(sigma))
+ self.play(ApplyMethod(square.flip, RIGHT))
+ self.play(ApplyMethod(square.flip, RIGHT))
+ self.play(Uncreate(axis), FadeOut(sigma))
+
+ # rotations
+ dot = Dot(UP + RIGHT)
+ rot = MathTex(r"r^4 = \mathbb{1}")
+ rot.next_to(square, DOWN * 3)
+
+ figure = VGroup(dot, square)
+
+ self.play(Write(rot), Create(dot))
+ for i in range(4):
+ self.play(Rotate(figure, PI/2))
+ self.play(FadeOut(rot), Uncreate(dot))
+
+ # rotation and flip
+ action = MathTex(r"(\sigma r)^2 = \mathbb{1}")
+ action.next_to(square, DOWN * 5)
+
+ dot = Dot(UP + RIGHT)
+ axis = DashedLine(2 * LEFT, 2 * RIGHT)
+ self.play(Create(dot), Create(axis), Write(action))
+
+ figure = VGroup(dot, square)
+
+ for i in range(2):
+ self.play(Rotate(figure, PI/2))
+ self.play(ApplyMethod(figure.flip, RIGHT))
+ self.wait()
+
+ self.play(Uncreate(dot), Uncreate(axis), FadeOut(action))
+ self.play(FadeOut(square))
+
+ # equation for the whole
+ whole_group = MathTex(
+ r"G &= \langle \sigma, r \,|\,"
+ r"\sigma^2 = r^4 = (\sigma r)^2 = \mathbb{1} \rangle \\"
+ r"&= \left\{"
+ r"\mathbb{1}, r, r^2, r^3, \sigma, \sigma r, \sigma r^2, \sigma r^3"
+ r"\right\}")
+
+ self.play(ApplyMethod(group.move_to, ORIGIN))
+ self.play(ReplacementTransform(group, whole_group))
+ self.wait(2)
+
+ dihedral = MathTex(
+ r"D_n &= \langle \sigma, r \,|\,"
+ r"\sigma^2 = r^n = (\sigma r)^2 = \mathbb{1} \rangle \\"
+ r"&= \left\{"
+ r"\mathbb{1}, r, r^2, \dots, \sigma, \sigma r, \sigma r^2, \dots"
+ r"\right\}")
+
+ dihedral_title = Tex(r"Diedergruppe: Symmetrien eines \(n\)-gons")
+ dihedral_title.next_to(dihedral, UP * 2)
+
+ dihedral.scale(1.2)
+ dihedral_title.scale(1.2)
+
+ self.play(ReplacementTransform(whole_group, dihedral))
+ self.play(FadeInFrom(dihedral_title, UP))
+
+ self.wait(5)
+ self.play(FadeOut(dihedral), FadeOut(dihedral_title))
+
+ def circle(self):
+ circle = Circle(radius=2)
+ dot = Dot()
+ dot.move_to(2 * RIGHT)
+
+ figure = VGroup(circle, dot)
+ group_name = MathTex(r"C_\infty")
+
+ # create circle
+ self.play(Create(circle))
+ self.play(Create(dot))
+
+ # move it around
+ self.play(Rotate(figure, PI/3))
+ self.play(Rotate(figure, PI/6))
+ self.play(Rotate(figure, -PI/3))
+
+ # show name
+ self.play(Rotate(figure, PI/4), Write(group_name))
+ self.wait()
+ self.play(Uncreate(figure))
+
+ nsphere = MathTex(r"C_\infty \cong S^1 = \left\{z \in \mathbb{C} : |z| = 1\right\}")
+ nsphere_title = Tex(r"Kreisgruppe")
+ nsphere_title.next_to(nsphere, 2 * UP)
+
+ nsphere.scale(1.2)
+ nsphere_title.scale(1.2)
+
+ self.play(ReplacementTransform(group_name, nsphere))
+ self.play(FadeInFrom(nsphere_title, UP))
+
+ self.wait(5)
+ self.play(FadeOut(nsphere_title), FadeOut(nsphere))
+ self.wait(2)
+
+
+class Geometric3DSymmetries(ThreeDScene):
+ def construct(self):
+ self.improper_rotation()
+ self.tetrahedron()
+
+ def improper_rotation(self):
+ # changes the source of the light and camera
+ self.renderer.camera.light_source.move_to(3*IN)
+ self.set_camera_orientation(phi=0, theta=0)
+
+ # initial square
+ square = Square()
+ square.set_fill(PINK, opacity=.5)
+
+ self.play(SpinInFromNothing(square))
+ self.wait(2)
+
+ for i in range(4):
+ self.play(Rotate(square, PI/2))
+ self.wait(.5)
+
+ self.move_camera(phi= 75 * DEGREES, theta = -80 * DEGREES)
+
+ # create rotation axis
+ axis = Line3D(start=[0,0,-2.5], end=[0,0,2.5])
+
+ axis_name = MathTex(r"r \in C_4")
+ # move to yz plane
+ axis_name.rotate(PI/2, axis = RIGHT)
+ axis_name.next_to(axis, OUT)
+
+ self.play(Create(axis))
+ self.play(Write(axis_name))
+ self.wait()
+
+ # create sphere from slices
+ cyclic_slices = []
+ for i in range(4):
+ colors = [PINK, RED] if i % 2 == 0 else [BLUE_D, BLUE_E]
+ cyclic_slices.append(ParametricSurface(
+ lambda u, v: np.array([
+ np.sqrt(2) * np.cos(u) * np.cos(v),
+ np.sqrt(2) * np.cos(u) * np.sin(v),
+ np.sqrt(2) * np.sin(u)
+ ]),
+ v_min=PI/4 + PI/2 * i,
+ v_max=PI/4 + PI/2 * (i + 1),
+ u_min=-PI/2, u_max=PI/2,
+ checkerboard_colors=colors, resolution=(10,5)))
+
+ self.play(FadeOut(square), *map(Create, cyclic_slices))
+
+ cyclic_sphere = VGroup(*cyclic_slices)
+ for i in range(4):
+ self.play(Rotate(cyclic_sphere, PI/2))
+ self.wait()
+
+ new_axis_name = MathTex(r"r \in D_4")
+ # move to yz plane
+ new_axis_name.rotate(PI/2, axis = RIGHT)
+ new_axis_name.next_to(axis, OUT)
+ self.play(ReplacementTransform(axis_name, new_axis_name))
+
+ # reflection plane
+ self.play(FadeOut(cyclic_sphere), FadeIn(square))
+ plane = ParametricSurface(
+ lambda u, v: np.array([u, 0, v]),
+ u_min = -2, u_max = 2,
+ v_min = -2, v_max = 2,
+ fill_opacity=.3, resolution=(1,1))
+
+ plane_name = MathTex(r"\sigma \in D_4")
+ # move to yz plane
+ plane_name.rotate(PI/2, axis = RIGHT)
+ plane_name.next_to(plane, OUT + RIGHT)
+
+ self.play(Create(plane))
+ self.play(Write(plane_name))
+ self.wait()
+
+ self.move_camera(phi = 25 * DEGREES, theta = -75 * DEGREES)
+ self.wait()
+
+ condition = MathTex(r"(\sigma r)^2 = \mathbb{1}")
+ condition.next_to(square, DOWN);
+
+ self.play(Write(condition))
+ self.play(Rotate(square, PI/2))
+ self.play(Rotate(square, PI, RIGHT))
+
+ self.play(Rotate(square, PI/2))
+ self.play(Rotate(square, PI, RIGHT))
+ self.play(FadeOut(condition))
+
+ self.move_camera(phi = 75 * DEGREES, theta = -80 * DEGREES)
+
+ # create sphere from slices
+ dihedral_slices = []
+ for i in range(4):
+ for j in range(2):
+ colors = [PINK, RED] if i % 2 == 0 else [BLUE_D, BLUE_E]
+ dihedral_slices.append(ParametricSurface(
+ lambda u, v: np.array([
+ np.sqrt(2) * np.cos(u) * np.cos(v),
+ np.sqrt(2) * np.cos(u) * np.sin(v),
+ np.sqrt(2) * np.sin(u)
+ ]),
+ v_min=PI/2 * j + PI/4 + PI/2 * i,
+ v_max=PI/2 * j + PI/4 + PI/2 * (i + 1),
+ u_min=-PI/2 if j == 0 else 0,
+ u_max=0 if j == 0 else PI/2,
+ checkerboard_colors=colors, resolution=(10,5)))
+
+ dihedral_sphere = VGroup(*dihedral_slices)
+
+ self.play(FadeOut(square), Create(dihedral_sphere))
+
+ for i in range(2):
+ self.play(Rotate(dihedral_sphere, PI/2))
+ self.play(Rotate(dihedral_sphere, PI, RIGHT))
+ self.wait()
+
+ self.wait(2)
+ self.play(*map(FadeOut, [dihedral_sphere, plane, plane_name, new_axis_name]), FadeIn(square))
+ self.wait(3)
+ self.play(*map(FadeOut, [square, axis]))
+ self.wait(3)
+
+ def tetrahedron(self):
+ tet = Tetrahedron(edge_length=2)
+ self.play(FadeIn(tet))
+
+ self.move_camera(phi = 75 * DEGREES, theta = -100 * DEGREES)
+ self.begin_ambient_camera_rotation(rate=.1)
+
+ axes = []
+ for coord in tet.vertex_coords:
+ axes.append((-2 * coord, 2 * coord))
+
+ lines = [
+ Line3D(start=s, end=e) for s, e in axes
+ ]
+
+ self.play(*map(Create, lines))
+ self.wait()
+
+ for axis in axes:
+ self.play(Rotate(tet, 2*PI/3, axis=axis[1]))
+ self.play(Rotate(tet, 2*PI/3, axis=axis[1]))
+
+ self.wait(5)
+ self.stop_ambient_camera_rotation()
+ self.wait()
+ self.play(*map(Uncreate, lines))
+ self.play(FadeOut(tet))
+ self.wait(5)
+
+
+class AlgebraicSymmetries(Scene):
+ def construct(self):
+ self.wait(5)
+ self.cyclic()
+ # self.matrices()
+
+ def cyclic(self):
+ # show the i product
+ product = MathTex(
+ r"1", r"\cdot i &= i \\",
+ r"i \cdot i &= -1 \\",
+ r"-1 \cdot i &= -i \\",
+ r"-i \cdot i &= 1")
+ product.scale(1.5)
+
+ for part in product:
+ self.play(Write(part))
+ self.wait()
+
+ self.play(ApplyMethod(product.scale, 1/1.5))
+
+ # gather in group
+ group = MathTex(r"G = \left\{ 1, i, -1, -i \right\}")
+ self.play(ReplacementTransform(product, group))
+ self.wait(2)
+
+ # show C4
+ grouppow = MathTex(
+ r"G &= \left\{ 1, i, i^2, i^3 \right\} \\",
+ r"C_4 &= \left\{ \mathbb{1}, r, r^2, r^3 \right\}")
+ self.play(ReplacementTransform(group, grouppow[0]))
+ self.wait(2)
+
+ self.play(Write(grouppow[1]))
+ self.wait(4)
+
+ self.play(ApplyMethod(grouppow.to_edge, UP))
+
+ # define morphisms
+ morphism = MathTex(r"\phi: C_4 \to G \\")
+ morphism.shift(UP)
+ self.play(Write(morphism))
+ self.wait()
+
+ # show an example
+ mappings = MathTex(
+ r"\phi(\mathbb{1}) &= 1 \\",
+ r"\phi(r) &= i \\",
+ r"\phi(r^2) &= i^2 \\",
+ r"\phi(r^3) &= i^3 \\")
+ mappings.next_to(morphism, 2 * DOWN)
+
+ self.play(Write(mappings))
+ self.wait(3)
+ self.play(FadeOutAndShift(mappings, DOWN))
+
+ # more general definition
+ homomorphism = MathTex(
+ r"\phi(r\circ \mathbb{1}) &= \phi(r)\cdot\phi(\mathbb{1}) \\",
+ r"&= i\cdot 1")
+ homomorphism.next_to(morphism, DOWN).align_to(morphism, LEFT)
+ for part in homomorphism:
+ self.play(Write(part))
+ self.wait()
+
+ hom_bracegrp = VGroup(morphism, homomorphism)
+
+ self.play(
+ ApplyMethod(grouppow.shift, 3 * LEFT),
+ ApplyMethod(hom_bracegrp.shift, 3 * LEFT))
+
+ hom_brace = Brace(hom_bracegrp, direction=RIGHT)
+ hom_text = Tex("Homomorphismus").next_to(hom_brace.get_tip(), RIGHT)
+ hom_text_short = MathTex(r"\mathrm{Hom}(C_4, G)").next_to(hom_brace.get_tip(), RIGHT)
+
+ self.play(Create(hom_brace))
+ self.play(Write(hom_text))
+ self.wait()
+ self.play(ReplacementTransform(hom_text, hom_text_short))
+ self.wait()
+
+ # add the isomorphism part
+ isomorphism = Tex(r"\(\phi\) ist bijektiv")
+ isomorphism.next_to(homomorphism, DOWN).align_to(homomorphism, LEFT)
+ self.play(Write(isomorphism))
+
+ iso_bracegrp = VGroup(hom_bracegrp, isomorphism)
+
+ iso_brace = Brace(iso_bracegrp, RIGHT)
+ iso_text = Tex("Isomorphismus").next_to(iso_brace.get_tip(), RIGHT)
+ iso_text_short = MathTex("C_4 \cong G").next_to(iso_brace.get_tip(), RIGHT)
+
+ self.play(
+ ReplacementTransform(hom_brace, iso_brace),
+ ReplacementTransform(hom_text_short, iso_text))
+ self.wait()
+
+ self.play(ReplacementTransform(iso_text, iso_text_short))
+ self.wait()
+
+ # create a group for the whole
+ morphgrp = VGroup(iso_bracegrp, iso_brace, iso_text_short)
+
+ self.play(
+ ApplyMethod(grouppow.to_edge, LEFT),
+ ApplyMethod(morphgrp.to_edge, LEFT))
+
+ # draw a complex plane
+ plane = ComplexPlane(x_range = [-2.5, 2.5])
+ coordinates = plane.get_coordinate_labels(1, -1, 1j, -1j)
+
+ roots = list(map(lambda p: Dot(p, fill_color=PINK), (
+ [1, 0, 0], [0, 1, 0], [-1, 0, 0], [0, -1, 0]
+ )))
+
+ arrow = CurvedArrow(
+ 1.5 * np.array([m.cos(10 * DEGREES), m.sin(10 * DEGREES), 0]),
+ 1.5 * np.array([m.cos(80 * DEGREES), m.sin(80 * DEGREES), 0]))
+ arrowtext = MathTex("\cdot i")
+ arrowtext.move_to(2 / m.sqrt(2) * (UP + RIGHT))
+
+ square = Square().rotate(PI/4).scale(1/m.sqrt(2))
+ square.set_fill(PINK).set_opacity(.4)
+
+ figuregrp = VGroup(plane, square, arrow, arrowtext, *coordinates, *roots)
+ figuregrp.to_edge(RIGHT)
+
+ self.play(Create(plane))
+ self.play(
+ *map(Create, roots),
+ *map(Write, coordinates))
+ self.wait()
+ self.play(FadeIn(square), Create(arrow), Write(arrowtext))
+
+ for _ in range(4):
+ self.play(Rotate(square, PI/2))
+ self.wait(.5)
+
+ self.play(
+ *map(FadeOut, (square, arrow, arrowtext)),
+ *map(FadeOut, coordinates),
+ *map(FadeOut, roots))
+ self.play(Uncreate(plane))
+ self.play(
+ FadeOutAndShift(grouppow, RIGHT),
+ FadeOutAndShift(morphgrp, RIGHT))
+
+ modulo = MathTex(
+ r"\phi: C_4 &\to (\mathbb{Z}/4\mathbb{Z}, +) \\"
+ r"\phi(\mathbb{1} \circ r^2) &= 0 + 2 \pmod 4").scale(1.5)
+ self.play(Write(modulo))
+ self.wait(2)
+
+ self.play(FadeOut(modulo))
+ self.wait(3)
+
+ def matrices(self):
+ question = MathTex(
+ r"D_n &\cong \,? \\"
+ r"S_n &\cong \,? \\"
+ r"A_n &\cong \,?").scale(1.5)
+
+ answer = MathTex(
+ r"D_n &\cong \,?\\"
+ r"S_4 &\cong \mathrm{Aut}(Q_8) \\"
+ r"A_5 &\cong \mathrm{PSL}_2 (5)").scale(1.5)
+
+ self.play(Write(question))
+ self.wait()
+ self.play(ReplacementTransform(question, answer))
+
+ self.wait(3)
diff --git a/vorlesungen/punktgruppen/media/images/nosignal.jpg b/vorlesungen/punktgruppen/media/images/nosignal.jpg
new file mode 100644
index 0000000..2beeb8b
--- /dev/null
+++ b/vorlesungen/punktgruppen/media/images/nosignal.jpg
Binary files differ
diff --git a/vorlesungen/punktgruppen/poetry.lock b/vorlesungen/punktgruppen/poetry.lock
new file mode 100644
index 0000000..069d270
--- /dev/null
+++ b/vorlesungen/punktgruppen/poetry.lock
@@ -0,0 +1,743 @@
+[[package]]
+name = "certifi"
+version = "2020.12.5"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "chardet"
+version = "4.0.0"
+description = "Universal encoding detector for Python 2 and 3"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "click"
+version = "7.1.2"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "click-default-group"
+version = "1.2.2"
+description = "Extends click.Group to invoke a command without explicit subcommand name"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+click = "*"
+
+[[package]]
+name = "cloup"
+version = "0.7.1"
+description = "Option groups and subcommand help sections for pallets/click"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+click = ">=7.0,<9.0"
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "colour"
+version = "0.1.5"
+description = "converts and manipulates various color representation (HSL, RVB, web, X11, ...)"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+test = ["nose"]
+
+[[package]]
+name = "commonmark"
+version = "0.9.1"
+description = "Python parser for the CommonMark Markdown spec"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"]
+
+[[package]]
+name = "decorator"
+version = "4.4.2"
+description = "Decorators for Humans"
+category = "main"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*"
+
+[[package]]
+name = "glcontext"
+version = "2.3.3"
+description = "Portable OpenGL Context"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "idna"
+version = "2.10"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "importlib-metadata"
+version = "4.0.1"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "manim"
+version = "0.6.0"
+description = "Animation engine for explanatory math videos."
+category = "main"
+optional = false
+python-versions = ">=3.6.2,<4.0.0"
+
+[package.dependencies]
+click = ">=7.1,<8.0"
+click-default-group = "*"
+cloup = ">=0.7.0,<0.8.0"
+colour = "*"
+decorator = "<5.0.0"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+manimpango = ">=0.2.4,<0.3.0"
+mapbox-earcut = ">=0.12.10,<0.13.0"
+moderngl = ">=5.6.3,<6.0.0"
+moderngl-window = ">=2.3.0,<3.0.0"
+networkx = ">=2.5,<3.0"
+numpy = ">=1.9,<2.0"
+Pillow = "*"
+pycairo = ">=1.19,<2.0"
+pydub = "*"
+pygments = "*"
+requests = "*"
+rich = ">=6.0,<7.0"
+scipy = "*"
+tqdm = "*"
+watchdog = "*"
+
+[package.extras]
+webgl_renderer = ["grpcio (>=1.33.0,<1.34.0)", "grpcio-tools (>=1.33.0,<1.34.0)"]
+jupyterlab = ["jupyterlab (>=3.0,<4.0)"]
+
+[[package]]
+name = "manimpango"
+version = "0.2.6"
+description = "Bindings for Pango for using with Manim."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "mapbox-earcut"
+version = "0.12.10"
+description = "Python bindings for the mapbox earcut C++ polygon triangulation library."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+numpy = "*"
+
+[[package]]
+name = "moderngl"
+version = "5.6.4"
+description = "ModernGL: High performance rendering for Python 3"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+glcontext = ">=2,<3"
+
+[[package]]
+name = "moderngl-window"
+version = "2.3.0"
+description = "A cross platform helper library for ModernGL making window creation and resource loading simple"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+moderngl = "<6"
+numpy = ">=1.16,<2"
+Pillow = ">=5"
+pyglet = ">=1.5.8,<2"
+pyrr = ">=0.10.3,<1"
+
+[package.extras]
+pysdl2 = ["pysdl2"]
+pyside2 = ["PySide2 (<6)"]
+glfw = ["glfw"]
+pygame = ["pygame (==2.0.0.dev10)"]
+pyqt5 = ["pyqt5"]
+pywavefront = ["pywavefront (>=1.2.0,<2)"]
+tk = ["pyopengltk (>=0.0.3)"]
+trimesh = ["trimesh (>=3.2.6,<4)", "scipy (>=1.3.2)"]
+
+[[package]]
+name = "multipledispatch"
+version = "0.6.0"
+description = "Multiple dispatch"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+name = "networkx"
+version = "2.5.1"
+description = "Python package for creating and manipulating graphs and networks"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+decorator = ">=4.3,<5"
+
+[package.extras]
+all = ["numpy", "scipy", "pandas", "matplotlib", "pygraphviz", "pydot", "pyyaml", "lxml", "pytest"]
+gdal = ["gdal"]
+lxml = ["lxml"]
+matplotlib = ["matplotlib"]
+numpy = ["numpy"]
+pandas = ["pandas"]
+pydot = ["pydot"]
+pygraphviz = ["pygraphviz"]
+pytest = ["pytest"]
+pyyaml = ["pyyaml"]
+scipy = ["scipy"]
+
+[[package]]
+name = "numpy"
+version = "1.20.2"
+description = "NumPy is the fundamental package for array computing with Python."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "pillow"
+version = "8.2.0"
+description = "Python Imaging Library (Fork)"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "pycairo"
+version = "1.20.0"
+description = "Python interface for cairo"
+category = "main"
+optional = false
+python-versions = ">=3.6, <4"
+
+[[package]]
+name = "pydub"
+version = "0.25.1"
+description = "Manipulate audio with an simple and easy high level interface"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pyglet"
+version = "1.5.16"
+description = "Cross-platform windowing and multimedia library"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pygments"
+version = "2.9.0"
+description = "Pygments is a syntax highlighting package written in Python."
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "pyrr"
+version = "0.10.3"
+description = "3D mathematical functions using NumPy"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+multipledispatch = "*"
+numpy = "*"
+
+[[package]]
+name = "requests"
+version = "2.25.1"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+chardet = ">=3.0.2,<5"
+idna = ">=2.5,<3"
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
+socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+
+[[package]]
+name = "rich"
+version = "6.2.0"
+description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
+category = "main"
+optional = false
+python-versions = ">=3.6,<4.0"
+
+[package.dependencies]
+colorama = ">=0.4.0,<0.5.0"
+commonmark = ">=0.9.0,<0.10.0"
+pygments = ">=2.6.0,<3.0.0"
+typing-extensions = ">=3.7.4,<4.0.0"
+
+[package.extras]
+jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
+
+[[package]]
+name = "scipy"
+version = "1.6.1"
+description = "SciPy: Scientific Library for Python"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+numpy = ">=1.16.5"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "tqdm"
+version = "4.60.0"
+description = "Fast, Extensible Progress Meter"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[package.extras]
+dev = ["py-make (>=0.1.0)", "twine", "wheel"]
+notebook = ["ipywidgets (>=6)"]
+telegram = ["requests"]
+
+[[package]]
+name = "typing-extensions"
+version = "3.10.0.0"
+description = "Backported and Experimental Type Hints for Python 3.5+"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "urllib3"
+version = "1.26.4"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+brotli = ["brotlipy (>=0.6.0)"]
+
+[[package]]
+name = "watchdog"
+version = "2.1.0"
+description = "Filesystem events monitoring"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+watchmedo = ["PyYAML (>=3.10)", "argh (>=0.24.1)"]
+
+[[package]]
+name = "zipp"
+version = "3.4.1"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.7"
+content-hash = "2d2a6db16cffc7cb06ce7290ad490f9555d4d7172f11fd77783e7a1f4fd933ed"
+
+[metadata.files]
+certifi = [
+ {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"},
+ {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"},
+]
+chardet = [
+ {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
+ {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
+]
+click = [
+ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
+ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
+]
+click-default-group = [
+ {file = "click-default-group-1.2.2.tar.gz", hash = "sha256:d9560e8e8dfa44b3562fbc9425042a0fd6d21956fcc2db0077f63f34253ab904"},
+]
+cloup = [
+ {file = "cloup-0.7.1-py2.py3-none-any.whl", hash = "sha256:947c881ada77ea2f7b2876f7b5bb2fc7e5406daac5a045342acf8de35bcce5d7"},
+ {file = "cloup-0.7.1.tar.gz", hash = "sha256:f26cc500dda4e4c9444ac1008b82376df8d72ecfa43a6310a9b3d54ef98add7b"},
+]
+colorama = [
+ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+colour = [
+ {file = "colour-0.1.5-py2.py3-none-any.whl", hash = "sha256:33f6db9d564fadc16e59921a56999b79571160ce09916303d35346dddc17978c"},
+ {file = "colour-0.1.5.tar.gz", hash = "sha256:af20120fefd2afede8b001fbef2ea9da70ad7d49fafdb6489025dae8745c3aee"},
+]
+commonmark = [
+ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"},
+ {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"},
+]
+decorator = [
+ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"},
+ {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"},
+]
+glcontext = [
+ {file = "glcontext-2.3.3-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:f518379551a2b60d45c1eec23759cb1ee85517d4b943fc31530b6ab13e304fe4"},
+ {file = "glcontext-2.3.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:d3a8fbc27f43766d168bae02474790459f4050adeb25832ff0a227cc5006c933"},
+ {file = "glcontext-2.3.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aa1d9e4f9bd6eda3d195f39c47c849b3721caf65813a4ad1e006a20fa02d33e4"},
+ {file = "glcontext-2.3.3-cp35-cp35m-win32.whl", hash = "sha256:8b4ee9cb5573e2ae313e1681fdfe2c5ac5b8780b20e857daf8f95e318c36aa2f"},
+ {file = "glcontext-2.3.3-cp35-cp35m-win_amd64.whl", hash = "sha256:b92ca447a04c3a05afb3974a6e94f584e60f55444c3e55ecd31fbfacad6ee07a"},
+ {file = "glcontext-2.3.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b102a00e7bbce03a5e8bb02692197f96fcb77c51dbe133859b70afa361eef5b7"},
+ {file = "glcontext-2.3.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ea3975a9d86a97b49f9524713c8e3f0df92044715cfbe5a24102e10762673b23"},
+ {file = "glcontext-2.3.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5f2e7fb61ea1f69c44db0799f8929ea66ad207619c18063ae60cfb26ad0f447f"},
+ {file = "glcontext-2.3.3-cp36-cp36m-win32.whl", hash = "sha256:bf8c3fa5f3a8962c9bcc03a869a0bb178bd1681619225b9f0a070a65ff3f766d"},
+ {file = "glcontext-2.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:e0b637f2ac1c2dd1e0dbfcbad6d7be2dae75290f9af8f82aa67aa55b977766e1"},
+ {file = "glcontext-2.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2002d29dee90e9ba800c8699e13e1ff8b0fa1292a7c5bb0a98ef50b5f6cd3f14"},
+ {file = "glcontext-2.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:941be8972ad64e70080ad4702c037c64c09d1378ddd9b1b4576b957bc2d7f1c2"},
+ {file = "glcontext-2.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0eb69c4add7f724017169bcefc2a8ef8ce053183e9384cc4770162e934090592"},
+ {file = "glcontext-2.3.3-cp37-cp37m-win32.whl", hash = "sha256:f63aed2116907225f7392921df790a391fd1a843cd1af0756dcd533e9d3ecf2b"},
+ {file = "glcontext-2.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2fa9b939c15f5f7e63110a1021e8d20341c03921b8d3aebbb4bb191f11414d86"},
+ {file = "glcontext-2.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:44f95953bbd6a26caa9489b4f838b106470ede432c5ef837cd3e0d3657ca2a06"},
+ {file = "glcontext-2.3.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:843d3361bf46aec487f268bb7f680700166640995a82424fa86e53f428dc43ae"},
+ {file = "glcontext-2.3.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:be3e25a8595976699b6d30a2619ca4faf7bd5e60ff38dcd4445fa38a8f3b2cf9"},
+ {file = "glcontext-2.3.3-cp38-cp38-win32.whl", hash = "sha256:7abbd227bf9e4e62ec196360fa0f440143a66b7aae3d3deb7960b87aac654043"},
+ {file = "glcontext-2.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:b91010d033789d1f876789e4aa4e6498e87cd284b4d0cb7a4aa1b7e620caaf57"},
+ {file = "glcontext-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0a851f569f165a13f8fedf60dd4f2831f7c2ffbb9bc9f867d6e0e3fdd1846c8d"},
+ {file = "glcontext-2.3.3-cp39-cp39-win32.whl", hash = "sha256:f36935ba84e8c52ed22bb9f683875bdf1690abd318ae704f40511f1afca5f71a"},
+ {file = "glcontext-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:69e3a04c677e4925c0b6daf5efc5469a86d0982b05bb1d0ca29bce57f4aaf7d1"},
+ {file = "glcontext-2.3.3.tar.gz", hash = "sha256:f86a6c4ad99f941623911f964da74c443dc3f833fac7eb03cd485fae82acb80c"},
+]
+idna = [
+ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
+ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
+]
+importlib-metadata = [
+ {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"},
+ {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"},
+]
+manim = [
+ {file = "manim-0.6.0-py3-none-any.whl", hash = "sha256:402cb91b5a472204491086ca079163dcefdc491acb0559c098156b08f4e62d8b"},
+ {file = "manim-0.6.0.tar.gz", hash = "sha256:08bd27389f58312ab6d994e3a2910e77fa668c867c06da67135efe637f81c4a1"},
+]
+manimpango = [
+ {file = "ManimPango-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2a2d0ba8ca06e761650076a0e0050743acb2f1fb163f9b7db52decf95d91ced8"},
+ {file = "ManimPango-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:05c1d1af85d2016819f4ce40758d0ef6564baa121238ef6a88240ad96220a7a8"},
+ {file = "ManimPango-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ed9cc957df9513d31b450acdb8f9bc76885ed5eae1a71d71e939c3133c14eb09"},
+ {file = "ManimPango-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e094d1f136f99408bb10bf4748ee6b51efba68e54e310096e75a8d38bb7ef111"},
+ {file = "ManimPango-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:b2062fac21e968930cb91945a8bfcf4593a3152f8bea5d6950c6aa304eb831a7"},
+ {file = "ManimPango-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:76d1ab6c131389e91cc84e0d3c4f746978cd301237ddd1e463f9463ff872d17f"},
+ {file = "ManimPango-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88bdd9c2714b94ee85da28002fd28122e4b26cb7ef74a48fe93d50cb06e8a35b"},
+ {file = "ManimPango-0.2.6-cp38-cp38-win32.whl", hash = "sha256:28165fd23d8cfe7e260affa8d240d63bf66808f96154507ba534548b47834208"},
+ {file = "ManimPango-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:e74690f948c5fe2cc5e13f22683c1875155fee4a4a75c4e24ce1dc6e4f9f9883"},
+ {file = "ManimPango-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2297b1c829cfff6d91f5d32a7a8e903e30d0b28be8006e9f61fd653981ce7827"},
+ {file = "ManimPango-0.2.6-cp39-cp39-win32.whl", hash = "sha256:de974e2435d445b1244a713b7b6ce4383bc6c574e0a1b59a6f33b8a16d1a147e"},
+ {file = "ManimPango-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:59a575fb28183fe68f3d8f5e93c98b7afa8e495eb0124ec09c660eef15adfcbb"},
+ {file = "ManimPango-0.2.6.tar.gz", hash = "sha256:64028b62b151bc80b047cc1757b27943498416dc4a85f073892a524b4d90ab41"},
+]
+mapbox-earcut = [
+ {file = "mapbox_earcut-0.12.10-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:2aaf7bdb002d36d38d1412088329a9176de3fcadc24a53951b76e49a27e34d78"},
+ {file = "mapbox_earcut-0.12.10-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddda755c63cf5f9bff338cd375e4e937035898827fef960102e2f4c8984cb068"},
+ {file = "mapbox_earcut-0.12.10-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3475382dd573986d0dfe3f6b6fd3b1f576e74af7fd7d95066d2506ce8f4b38e5"},
+ {file = "mapbox_earcut-0.12.10-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f2b9079df53258766c3108a1c46a7942963c26f216f9bc2d216f93eeed1da76c"},
+ {file = "mapbox_earcut-0.12.10-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:124cc27486d0e9c9b185a6d80e551e736e2bc81d28e077e297ac39980c14e588"},
+ {file = "mapbox_earcut-0.12.10-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:04228ff704d5edc49d71ba3fd07c4a8621a4f416d2ad5c2504a80d0cabd51c18"},
+ {file = "mapbox_earcut-0.12.10-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:9a15cb52f3f6d5980e41b6ca31976cc2048acf290f2e5159d7527e16e5c5d748"},
+ {file = "mapbox_earcut-0.12.10-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:6b083a065afd40961cc311b425c54275f531d91a27bdd34a2049993a68d8a651"},
+ {file = "mapbox_earcut-0.12.10-cp35-cp35m-win32.whl", hash = "sha256:fa3355248d3beaab67438373315e55a37ecc2694a4a4b1965e9d8f582a210479"},
+ {file = "mapbox_earcut-0.12.10-cp35-cp35m-win_amd64.whl", hash = "sha256:90b2977a9eda2a1873e44d7821ecf3b18062aa0878e957cb306e6018aba105c9"},
+ {file = "mapbox_earcut-0.12.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:553688de45e73fa7d192fd6c29b87a4c5ea60a728b3c7b4c5f1715a89e6a8e54"},
+ {file = "mapbox_earcut-0.12.10-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:498b7f35c6a7c5c25829bcf1a79015ae64e94e8e36b84bd06e93131352b409f0"},
+ {file = "mapbox_earcut-0.12.10-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:8b9c6147249edf5049ccf7a7bca5bb29c9d512b3a5b62510659cfc51f1b8f806"},
+ {file = "mapbox_earcut-0.12.10-cp36-cp36m-win32.whl", hash = "sha256:4eaf2a9e86bbf808bf045eb587ec93a393e9d75ab87e7c1c9c8a5d9e122e30ac"},
+ {file = "mapbox_earcut-0.12.10-cp36-cp36m-win_amd64.whl", hash = "sha256:cb82e4ea9a67a9cdd46c9fc39bcb24e11f49569010368f9c5d376489bb2d0317"},
+ {file = "mapbox_earcut-0.12.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:619a31a4d9748a30fbea82fd45beec6ab9e7f8a7ae7818be46f09d03ea0d9185"},
+ {file = "mapbox_earcut-0.12.10-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:054cd56cf8adf179d0aa0e8a061774e5afa767aaf6507851f4d2731b58f03d43"},
+ {file = "mapbox_earcut-0.12.10-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ebeef32d504bf7e1ba986f86d87a8d3c96a54b6e03b0535ccdf0ce8f2f56e563"},
+ {file = "mapbox_earcut-0.12.10-cp37-cp37m-win32.whl", hash = "sha256:62a8787e30f7bbc6e1ebe8b11591119ed85aa5044b2cf3f6afb058e6fffeb8a3"},
+ {file = "mapbox_earcut-0.12.10-cp37-cp37m-win_amd64.whl", hash = "sha256:5f854a887f854bdea62c4b58785b82cf70056d53dc3bf23146ce68c125ceed96"},
+ {file = "mapbox_earcut-0.12.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:19f16be13a40d20419362f8ce27cf2dca8f0b8f4c7caa24caaff8351bcdf853e"},
+ {file = "mapbox_earcut-0.12.10-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cac7c8c332d1e802f478b5b79166ab38005b6d1bd908fb96857a8941e702f70d"},
+ {file = "mapbox_earcut-0.12.10-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:24cc595987932b5d47b93ddb733c6bd084d91ff0af66ff2205aa717f0a5a13b8"},
+ {file = "mapbox_earcut-0.12.10-cp38-cp38-win32.whl", hash = "sha256:fe4b4e1c53fe0fde8e5fee86d868344f47d4d9fd89d9599548ea4b98349f10d6"},
+ {file = "mapbox_earcut-0.12.10-cp38-cp38-win_amd64.whl", hash = "sha256:6f4601b949ab43cf21dca86ffb6b4e2b30974ab3112f089d16b5f365e8b446f4"},
+ {file = "mapbox_earcut-0.12.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ca00bdcb162b6a543f3061f49e2dcde42d6b780a545b5054da437e4ff5e33905"},
+ {file = "mapbox_earcut-0.12.10-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:031132cdfa4d20e640f24d6817b65a91e3292c34ed527b4309617c9992284133"},
+ {file = "mapbox_earcut-0.12.10-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f284c0fc7f3c84664e9dddabae4eae729e6458e96ec5f30c9d7000c9b0dadca7"},
+ {file = "mapbox_earcut-0.12.10-cp39-cp39-win32.whl", hash = "sha256:c94a263767a841a5f7e8f03c725bdf41c87b8936c1a5fe18a5a77f3b9344d68f"},
+ {file = "mapbox_earcut-0.12.10-cp39-cp39-win_amd64.whl", hash = "sha256:742bd1f94113f44f1adcb5f3e2dca6e288695645b7eeab5d94f589dacda092af"},
+ {file = "mapbox_earcut-0.12.10-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:ad76defd6188e71023e43e5aed32ab5d540c0452a74918fc5de9bcccdee6c053"},
+ {file = "mapbox_earcut-0.12.10-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:a3a9a81f696627f3c331f16c8d628b494949fa68067a42d2f1a6a56ee115eb0d"},
+ {file = "mapbox_earcut-0.12.10-pp27-pypy_73-win32.whl", hash = "sha256:044f70ed230bdb94f08356ec84f4bd30e4ea493d63700c3cc6fa86c5cf57623e"},
+ {file = "mapbox_earcut-0.12.10-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e352482e6022cc113dd008886012f0966bd2511933f888805fa87f070423d5b1"},
+ {file = "mapbox_earcut-0.12.10-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:41a282c485e96135ff15c01e0e1eb334cf1a05235edde8154b7b6e30187e54f4"},
+ {file = "mapbox_earcut-0.12.10-pp36-pypy36_pp73-win32.whl", hash = "sha256:5e1e3cf5a881eafeba7a7e5c4b1b9e7376710c48513513894e2a082ebf870326"},
+ {file = "mapbox_earcut-0.12.10-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7b6c2bfc28dc82a27071079885ffbe0836c0ad5dbd4ab47a5edaa24a86218daf"},
+ {file = "mapbox_earcut-0.12.10-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6e6614f7b437b4b0a69ab642cf35569079408ac25c193013d5ad26e82c71fc01"},
+ {file = "mapbox_earcut-0.12.10-pp37-pypy37_pp73-win32.whl", hash = "sha256:d016823e863309b9cc542bb1d3bcdc274ec65fb23f2566de298188dcd4a75c0e"},
+ {file = "mapbox_earcut-0.12.10.tar.gz", hash = "sha256:50d995673ac9ce8cb9abb7ab64b709d611c1d27557907e00b631b5272345c453"},
+]
+moderngl = [
+ {file = "moderngl-5.6.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:bc3764d67f037b67051871345a1d0b7a3d2c19cb5c0c0af0a84c532e802d6642"},
+ {file = "moderngl-5.6.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:90006d9dfd5333da604a7d26b2a5e70e1a570f291cd745b8bf80e4833d8821b6"},
+ {file = "moderngl-5.6.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af44437545380a840dafd09658eb56592831dbd4fb481d320249d0d42c591bae"},
+ {file = "moderngl-5.6.4-cp35-cp35m-win32.whl", hash = "sha256:b5023633bcbfbab90be6a6f4edcde75f9c1e244d9acbda94678f3e3fb238b363"},
+ {file = "moderngl-5.6.4-cp35-cp35m-win_amd64.whl", hash = "sha256:ffc48fc4deeb525ed33a828d13ca4c12c5af8e5cb0449011f1802e18b5fc3c25"},
+ {file = "moderngl-5.6.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:331fd4bce60b10a08eed81a3ed4c70b7c297c38f981fdf3968d03a1c892af247"},
+ {file = "moderngl-5.6.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1bd864b5cc2fc1255785e33575cec98fa5ded698503c4f8f3fa9230abeaa3a04"},
+ {file = "moderngl-5.6.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b22534529f5bc52c1fe43336787c06d51123ae978fb56e74e47cabd85056c934"},
+ {file = "moderngl-5.6.4-cp36-cp36m-win32.whl", hash = "sha256:ee5b1eced39d7f6dc68782c2abf01c1130a40b6d83d333d175ee71adbea7c721"},
+ {file = "moderngl-5.6.4-cp36-cp36m-win_amd64.whl", hash = "sha256:52ee915a559762f0e992344961b35e0d241be32f8aa7464494e958f777e0534c"},
+ {file = "moderngl-5.6.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f83f6ab1fafdba2d9c06a7a1c8a4e460689ea1d514146606acc74f14e0831d93"},
+ {file = "moderngl-5.6.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c350e06affea9fabc636b2350cf6e58d83ee2e7264527eee0f5d142c167f5463"},
+ {file = "moderngl-5.6.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3eb65afc8ec4a1d4a4c48696fb0f4f6cf7a7ada6bef97818d717dbca73c57b11"},
+ {file = "moderngl-5.6.4-cp37-cp37m-win32.whl", hash = "sha256:4fd721eb83e73d34c3f7b5a11aec656fef461b51bbe7503b07ea27370c593cbd"},
+ {file = "moderngl-5.6.4-cp37-cp37m-win_amd64.whl", hash = "sha256:01c71d94dbd59b5d37ead463991e2998c0924426cffa393b9da2b8334551c998"},
+ {file = "moderngl-5.6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2ec6ecd845f21ba44a08c11521cb71f2a9c2ea2ec189b7ed30d17837d392d70"},
+ {file = "moderngl-5.6.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:40f74a2246e5302f93f2d46f76c0d2a26cbed1eb29731674c4052476f1e9c9ea"},
+ {file = "moderngl-5.6.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5e158e6881034c7e1d0c583d7c82ff608439606f2359dc6098e4be4fd93cef9d"},
+ {file = "moderngl-5.6.4-cp38-cp38-win32.whl", hash = "sha256:a28dc741469eeb69549ee85b4ddbf8e9cfca6a2b19ce0406df9fde20f78082c8"},
+ {file = "moderngl-5.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:ce87962b91635d857cac4a753c5d5f647d94dc66dcb0f090bb8d758fd226c3e8"},
+ {file = "moderngl-5.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fb139bcdd25eae2c546e5788e9d8719f6c4b18a2ba68a9df31699b4ac57d62d"},
+ {file = "moderngl-5.6.4-cp39-cp39-win32.whl", hash = "sha256:fc5cc1601a3df8f45f1901c6b9960731e0619d1781b0d036e12341fbf2ef55d3"},
+ {file = "moderngl-5.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:1c74b71c9acee9f0e69807a086d76e92f37c1960c3bb1d6a6e2472fd03f7be5b"},
+ {file = "moderngl-5.6.4.tar.gz", hash = "sha256:8c6d04559f5e3bf75a18525cd46d213c0f3a8409363718978e6de691bdb551fb"},
+]
+moderngl-window = [
+ {file = "moderngl_window-2.3.0-py3-none-any.whl", hash = "sha256:79056e6b6a1e8c540031166d2ec308a40806baf461e5d492730966c3cf372a31"},
+]
+multipledispatch = [
+ {file = "multipledispatch-0.6.0-py2-none-any.whl", hash = "sha256:407e6d8c5fa27075968ba07c4db3ef5f02bea4e871e959570eeb69ee39a6565b"},
+ {file = "multipledispatch-0.6.0-py3-none-any.whl", hash = "sha256:a55c512128fb3f7c2efd2533f2550accb93c35f1045242ef74645fc92a2c3cba"},
+ {file = "multipledispatch-0.6.0.tar.gz", hash = "sha256:a7ab1451fd0bf9b92cab3edbd7b205622fb767aeefb4fb536c2e3de9e0a38bea"},
+]
+networkx = [
+ {file = "networkx-2.5.1-py3-none-any.whl", hash = "sha256:0635858ed7e989f4c574c2328380b452df892ae85084144c73d8cd819f0c4e06"},
+ {file = "networkx-2.5.1.tar.gz", hash = "sha256:109cd585cac41297f71103c3c42ac6ef7379f29788eb54cb751be5a663bb235a"},
+]
+numpy = [
+ {file = "numpy-1.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e9459f40244bb02b2f14f6af0cd0732791d72232bbb0dc4bab57ef88e75f6935"},
+ {file = "numpy-1.20.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a8e6859913ec8eeef3dbe9aed3bf475347642d1cdd6217c30f28dee8903528e6"},
+ {file = "numpy-1.20.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9cab23439eb1ebfed1aaec9cd42b7dc50fc96d5cd3147da348d9161f0501ada5"},
+ {file = "numpy-1.20.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9c0fab855ae790ca74b27e55240fe4f2a36a364a3f1ebcfd1fb5ac4088f1cec3"},
+ {file = "numpy-1.20.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:61d5b4cf73622e4d0c6b83408a16631b670fc045afd6540679aa35591a17fe6d"},
+ {file = "numpy-1.20.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d15007f857d6995db15195217afdbddfcd203dfaa0ba6878a2f580eaf810ecd6"},
+ {file = "numpy-1.20.2-cp37-cp37m-win32.whl", hash = "sha256:d76061ae5cab49b83a8cf3feacefc2053fac672728802ac137dd8c4123397677"},
+ {file = "numpy-1.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bad70051de2c50b1a6259a6df1daaafe8c480ca98132da98976d8591c412e737"},
+ {file = "numpy-1.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:719656636c48be22c23641859ff2419b27b6bdf844b36a2447cb39caceb00935"},
+ {file = "numpy-1.20.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:aa046527c04688af680217fffac61eec2350ef3f3d7320c07fd33f5c6e7b4d5f"},
+ {file = "numpy-1.20.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2428b109306075d89d21135bdd6b785f132a1f5a3260c371cee1fae427e12727"},
+ {file = "numpy-1.20.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e8e4fbbb7e7634f263c5b0150a629342cc19b47c5eba8d1cd4363ab3455ab576"},
+ {file = "numpy-1.20.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:edb1f041a9146dcf02cd7df7187db46ab524b9af2515f392f337c7cbbf5b52cd"},
+ {file = "numpy-1.20.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:c73a7975d77f15f7f68dacfb2bca3d3f479f158313642e8ea9058eea06637931"},
+ {file = "numpy-1.20.2-cp38-cp38-win32.whl", hash = "sha256:6c915ee7dba1071554e70a3664a839fbc033e1d6528199d4621eeaaa5487ccd2"},
+ {file = "numpy-1.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:471c0571d0895c68da309dacee4e95a0811d0a9f9f532a48dc1bea5f3b7ad2b7"},
+ {file = "numpy-1.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4703b9e937df83f5b6b7447ca5912b5f5f297aba45f91dbbbc63ff9278c7aa98"},
+ {file = "numpy-1.20.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:abc81829c4039e7e4c30f7897938fa5d4916a09c2c7eb9b244b7a35ddc9656f4"},
+ {file = "numpy-1.20.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:377751954da04d4a6950191b20539066b4e19e3b559d4695399c5e8e3e683bf6"},
+ {file = "numpy-1.20.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6e51e417d9ae2e7848314994e6fc3832c9d426abce9328cf7571eefceb43e6c9"},
+ {file = "numpy-1.20.2-cp39-cp39-win32.whl", hash = "sha256:780ae5284cb770ade51d4b4a7dce4faa554eb1d88a56d0e8b9f35fca9b0270ff"},
+ {file = "numpy-1.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:924dc3f83de20437de95a73516f36e09918e9c9c18d5eac520062c49191025fb"},
+ {file = "numpy-1.20.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:97ce8b8ace7d3b9288d88177e66ee75480fb79b9cf745e91ecfe65d91a856042"},
+ {file = "numpy-1.20.2.zip", hash = "sha256:878922bf5ad7550aa044aa9301d417e2d3ae50f0f577de92051d739ac6096cee"},
+]
+pillow = [
+ {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"},
+ {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"},
+ {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"},
+ {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"},
+ {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"},
+ {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"},
+ {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"},
+ {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"},
+ {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"},
+ {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"},
+ {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"},
+ {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"},
+ {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"},
+ {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"},
+ {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"},
+ {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"},
+ {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"},
+ {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"},
+ {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"},
+ {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"},
+ {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"},
+ {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"},
+ {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"},
+ {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"},
+ {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"},
+ {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"},
+ {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"},
+ {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"},
+ {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"},
+]
+pycairo = [
+ {file = "pycairo-1.20.0-cp36-cp36m-win32.whl", hash = "sha256:e5a3433690c473e073a9917dc8f1fc7dc8b9af7b201bf372894b8ad70d960c6d"},
+ {file = "pycairo-1.20.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a942614923b88ae75c794506d5c426fba9c46a055d3fdd3b8db7046b75c079cc"},
+ {file = "pycairo-1.20.0-cp37-cp37m-win32.whl", hash = "sha256:8cfa9578b745fb9cf2915ec580c2c50ebc2da00eac2cf4c4b54b63aa19da4b77"},
+ {file = "pycairo-1.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:273a33c56aba724ec42fe1d8f94c86c2e2660c1277470be9b04e5113d7c5b72d"},
+ {file = "pycairo-1.20.0-cp38-cp38-win32.whl", hash = "sha256:2088100a099c09c5e90bf247409ce6c98f51766b53bd13f96d6aac7addaa3e66"},
+ {file = "pycairo-1.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:ceb1edcbeb48dabd5fbbdff2e4b429aa88ddc493d6ebafe78d94b050ac0749e2"},
+ {file = "pycairo-1.20.0-cp39-cp39-win32.whl", hash = "sha256:57a768f4edc8a9890d98070dd473a812ac3d046cef4bc1c817d68024dab9a9b4"},
+ {file = "pycairo-1.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:57166119e424d71eccdba6b318bd731bdabd17188e2ba10d4f315f7bf16ace3f"},
+ {file = "pycairo-1.20.0.tar.gz", hash = "sha256:5695a10cb7f9ae0d01f665b56602a845b0a8cb17e2123bfece10c2e58552468c"},
+]
+pydub = [
+ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
+ {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
+]
+pyglet = [
+ {file = "pyglet-1.5.16-py3-none-any.whl", hash = "sha256:37cced6f4f7e30e7ace73779d068c86b3dc26f1a28b602016d37113ae830d7f8"},
+ {file = "pyglet-1.5.16.zip", hash = "sha256:ad4a02d6fbebdaa748f8af6d2d388d64d446b6ccdfb9c0d7dfd49d7164913400"},
+]
+pygments = [
+ {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"},
+ {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"},
+]
+pyrr = [
+ {file = "pyrr-0.10.3-py3-none-any.whl", hash = "sha256:d8af23fb9bb29262405845e1c98f7339fbba5e49323b98528bd01160a75c65ac"},
+ {file = "pyrr-0.10.3.tar.gz", hash = "sha256:3c0f7b20326e71f706a610d58f2190fff73af01eef60c19cb188b186f0ec7e1d"},
+]
+requests = [
+ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
+ {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
+]
+rich = [
+ {file = "rich-6.2.0-py3-none-any.whl", hash = "sha256:fa55d5d6ba9a0df1f1c95518891b57b13f1d45548a9a198a87b093fceee513ec"},
+ {file = "rich-6.2.0.tar.gz", hash = "sha256:f99c877277906e1ff83b135c564920590ba31188f424dcdb5d1cae652a519b4b"},
+]
+scipy = [
+ {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"},
+ {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"},
+ {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"},
+ {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"},
+ {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"},
+ {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"},
+ {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"},
+ {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"},
+ {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"},
+ {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"},
+ {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"},
+ {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"},
+ {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"},
+ {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"},
+ {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"},
+ {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"},
+ {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"},
+ {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"},
+ {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"},
+]
+six = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+tqdm = [
+ {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"},
+ {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"},
+]
+typing-extensions = [
+ {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
+ {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
+ {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
+]
+urllib3 = [
+ {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"},
+ {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"},
+]
+watchdog = [
+ {file = "watchdog-2.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af1d42ac65bf3f851d787e723a950d9c878c4ef0ff3381a2196d36b0c4b6d39c"},
+ {file = "watchdog-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8a75022cacbd0ad66ab8a9059322a76a43164ea020b373cbc28ddbacf9410b14"},
+ {file = "watchdog-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37bf90ef22b666fb0b5c1ea4375c9cbf43f1ff72489a91bf6f0370ba13e09b2a"},
+ {file = "watchdog-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:66193c811498ff539d0312091bdcbd98cce03b5425b8fa918c80f21a278e8358"},
+ {file = "watchdog-2.1.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5472ee2d23eaedf16c4b5088897cd9f50cd502074f508011180466d678cdf62a"},
+ {file = "watchdog-2.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a079aceede99b83a4cf4089f6e2243c864f368b60f4cce7bf46286f3cfcc8947"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:da1ca0845bbc92606b08a08988d8dbcba514a16c209be29d211b13cf0d5be2fd"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:5a62491c035646130c290a4cb773d7de103ac0202ac8305404bdb7db17ab5c3f"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_i686.whl", hash = "sha256:8c8ff287308a2ba5148aa450d742198d838636b65de52edd3eccfa4c86bf8004"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:05544fdd1cdc00b5231fb564f17428c5d502756419008cb8045be5b297eac21c"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:8ab111b71fba4f8f77baa39d42bf923d085f64869396497518c43297fe1ec4e7"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:06ee7b77a8169f9828f8d24fc3d3d99b2216e1d2f7085b5913022a55161da758"},
+ {file = "watchdog-2.1.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c2d37a9df96d8f9ea560c0824f179168d8501f3e614b5e9f2168b38fe6ef3c12"},
+ {file = "watchdog-2.1.0-py3-none-win32.whl", hash = "sha256:6c6fa079abddea664f7ecda0a02636ca276f095bd26f474c23b3f968f1e938ec"},
+ {file = "watchdog-2.1.0-py3-none-win_amd64.whl", hash = "sha256:80afa2b32aac3abc7fb6ced508fc612997a0c8fb0f497217d54c524ff52e9e3a"},
+ {file = "watchdog-2.1.0-py3-none-win_ia64.whl", hash = "sha256:b8fb08629f52d3e0a060b93d711824f2b06fb8e0d09ad453f2a93d0c97d6b1ec"},
+ {file = "watchdog-2.1.0.tar.gz", hash = "sha256:55316efab52f659b8b7b59730680bfb27ac003522f24c44f6bcd60c4e3736ccd"},
+]
+zipp = [
+ {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
+ {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
+]
diff --git a/vorlesungen/punktgruppen/pyproject.toml b/vorlesungen/punktgruppen/pyproject.toml
new file mode 100644
index 0000000..527eb57
--- /dev/null
+++ b/vorlesungen/punktgruppen/pyproject.toml
@@ -0,0 +1,15 @@
+[tool.poetry]
+name = "presentation"
+version = "0.1.0"
+description = ""
+authors = ["Nao Pross <np@0hm.ch>"]
+
+[tool.poetry.dependencies]
+python = "^3.7"
+manim = "^0.6.0"
+
+[tool.poetry.dev-dependencies]
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/vorlesungen/punktgruppen/script.pdf b/vorlesungen/punktgruppen/script.pdf
new file mode 100644
index 0000000..91993fb
--- /dev/null
+++ b/vorlesungen/punktgruppen/script.pdf
Binary files differ
diff --git a/vorlesungen/punktgruppen/script.tex b/vorlesungen/punktgruppen/script.tex
new file mode 100644
index 0000000..bc50e21
--- /dev/null
+++ b/vorlesungen/punktgruppen/script.tex
@@ -0,0 +1,214 @@
+\documentclass[a4paper]{article}
+
+\usepackage{amsmath}
+\usepackage{amssymb}
+
+\usepackage[cm]{manuscript}
+\usepackage{xcolor}
+
+\newcommand{\scene}[1]{\par\noindent[ #1 ]\par}
+\newenvironment{totranslate}{\color{blue!70!black}}{}
+
+\begin{document}
+\section{Das sind wir}
+\scene{Camera}
+
+\section{Ablauf}
+Zuerst werden wir Symmetrien in 2 Dimensionen anschauen, dann \"uberlegen wir
+kurz was es heisst f\"ur eine Symmetrie ``algebraisch'' zu sein. Von da aus
+kommt die dritte Dimension hinzu, die man besser mit Matrizen verstehen kann.
+Mit der aufgebauten Theorie werden wir versuchen Kristalle zu klassifizieren.
+Und zum Schluss kommen wir zu Anwendungen, welche f\"ur Ingenieure von
+Interesse sind.
+
+\section{intro}
+\scene{Spontan}
+
+\section{2D Geometrie}
+\scene{Intro}
+Wir fangen mit den 2 dimensionalen Symmetrien an, da man sie sich am
+einfachsten vorstellen kann. Eine Symmetrie eines Objektes beschreibt eine
+Aktion, welche nachdem sie auf das Objekt wirkt, das Objekt wieder gleich
+aussehen l\"asst.
+
+\scene{Viereck}
+Die einfachste Aktion, ist das Viereck zu nehmen, und wieder hinzulegen.
+Eine andere Aktion k\"onnte sein, das Objekt um eine Achse zu spiegeln,
+oder eine Rotation um 90 Grad.
+
+\scene{Zyklische Gruppe}
+Fokussieren wir uns auf die einfachste Klassen von Symmetrien: diejenigen die
+von einer reinen Drehung generiert werden. Wir sammeln diese in einer Gruppe
+\(G\), und notieren das sie von eine Rotation \(r\) generiert worden sind, mit
+diesen spitzen Klammern.
+
+Nehmen wir als Beispiel dieses Pentagon. Wenn wir \(r\) 5-mal anwenden, ist es
+dasselbe als wenn wir nichts gemacht h\"atten. Wenn wir es noch ein 6. mal
+drehen, entspricht dies dasselbe wie \(r\) nur 1 mal zu nutzen.
+
+\scene{Notation}
+So, die Gruppe setzt sich zusammen aus dem neutralen Element, und den Potenzen
+1 bis 4 von \(r\). Oder im allgemein Gruppen mit dieser Struktur, in welcher die
+Aktion \(n-1\) mal angewendet werden kann, heissen ``Zyklische Gruppe''.
+
+\scene{Diedergruppe}
+Nehmen wir nun auch noch die Spiegeloperation \(\sigma\) dazu. Weil wir jetzt 2
+Operationen haben, m\"ussen wir auch im Generator schreiben wie sie
+zusammenh\"angen. Schauen wir dann uns genauer diesen Ausdr\"uck an. Zweimal
+Spielegeln ist \"aquivalent zum neutralen Element, sowie 4 mal um 90 Grad
+drehen und 2 Drehspiegelungen, welche man auch Inversion nennt.
+
+\scene{Notation}
+Daraus k\"onnen wir wieder die ganze Gruppe erzeugen, die im allgemeinen den
+Symmetrien eines \(n\)-gons entsprechen.
+
+\scene{Kreisgruppe}
+Bis jetzt hatten wir nur diskrete Symmetrien, was nicht zwingend der Fall sein
+muss. Ein Ring kann man kontinuierlich drehen, und sieht dabei immer gleich
+aus.
+
+Diese Symmetrie ist auch als Kreisgruppe bekannt, die man sch\"on mit dem
+komplexen Einheitskreis definieren kann.
+
+\section{Algebra}
+\scene{Produkt mit \(i\)}
+\"Uberlegen wir uns eine spezielle algebraische Operation: Multiplikation mit
+der imagin\"aren Einheit. \(1\) mal \(i\) ist gleich \(i\). Wieder mal \(i\)
+ist \(-1\), dann \(-i\) und schliesslich kommen wir z\"uruck auf \(1\). Diese
+fassen wir in eine Gruppe \(G\) zusammen. Oder sch\"oner geschrieben:. Sieht das
+bekannt aus?
+
+\scene{Morphismen}
+Das Gefühl, dass es sich um dasselbe handelt, kann wie folgt formalisiert
+werden. Sei \(\phi\) eine Funktion von \(C_4\) zu \(G\) und ordnen wir zu
+jeder Symmetrieoperation ein Element aus \(G\). Wenn man die Zuordnung richtig
+definiert, dann sieht man die folgende Eigenschaft: Eine Operation nach eine
+andere zu nutzen, und dann die Funktion des Resultats zu nehmen, ist gleich wie
+die Funktion der einzelnen Operazionen zu nehmen und die Resultate zu
+multiplizieren. Dieses Ergebnis ist so bemerkenswert, dass es in der Mathematik
+einen Namen bekommen hat: Homorphismus, von griechisch "homos" dasselbe und
+"morphe" Form. Manchmal auch so geschrieben. Ausserdem, wenn \(\phi\) eins zu
+eins ist, heisst es \emph{Iso}morphismus: "iso" gleiche Form. Was man
+typischerweise mit diesem Symbol schreibt.
+
+\scene{Animation}
+Sie haben wahrscheinlich schon gesehen, worauf das hinausläuft. Dass die
+zyklische Gruppe \(C_4\) und \(G\) isomorph sind ist nicht nur Fachjargon der
+mathematik, sondern sie haben wirklich die selbe Struktur.
+
+\scene{Modulo}
+Das Beispiel mit der komplexen Einheit, war wahrscheinlich nicht so
+\"uberraschend. Aber was merkw\"urdig ist, ist das Beziehungen zwischen
+Symmetrien und Algebra auch in Bereichen gefunden werden, welche auf den ersten
+Blick, nicht geomerisch erscheinen. Ein R\"atsel für die Neugierigen: die Summe
+in der Modulo-Arithmetik. Als Hinweis: Um die Geometrie zu finden denken Sie
+an einer Uhr.
+
+\section{3D Geometrie}
+2 Dimensionen sind einfacher zu zeichnen, aber leider leben wir im 3
+dimensionalen Raum.
+
+\scene{Zyklische Gruppe}
+Wenn wir unser bekanntes Viereck mit seiner zyklischer Symmetrie in 3
+Dimensionen betrachten, k\"onnen wir seine Drehachse sehen.
+
+\scene{Diedergruppe}
+Um auch noch die andere Symmetrie des Rechteckes zu sehen, ben\"otigen wir eine
+Spiegelachse \(\sigma\), die hier eine Spiegelebene ist.
+
+\scene{Transition}
+Um die Punktsymmetrien zu klassifizieren orientiert man sich an einer Achse, um
+welche sich die meisten Symmetrien drehen. Das geht aber nicht immer, wie beim
+Tetraeder.
+
+\scene{Tetraedergruppe}
+Diese Geometrie hat 4 gleichwertige Symmetrieachsen, die eben eine
+Symmetriegruppe aufbauen, welche kreativer weise Tetraedergruppe genannt wird.
+Vielleicht fallen Ihnnen weitere Polygone ein mit dieser Eigenschaft, bevor wir
+zum n\"achsten Thema weitergehen.
+
+\section{Matrizen}
+\scene{Titelseite}
+Nun gehen wir kurz auf den Thema unseres Seminars ein: Matrizen. Das man mit
+Matrizen Dinge darstellen kann, ist keine Neuigkeit mehr, nach einem
+Semester MatheSeminar. Also überrascht es wohl auch keinen, das man alle
+punktsymmetrischen Operationen auch mit Matrizen Formulieren kann.
+
+\scene{Matrizen}
+
+Sei dann \(G\) unsere Symmetrie Gruppe, die unsere abstrakte Drehungen und
+Spiegelungen enth\"ahlt. Die Matrix Darstellung dieser Gruppe, ist eine
+Funktion gross \(\Phi\), von \(G\) zur orthogonalen Gruppe \(O(3)\), die zu
+jeder Symmetrie Operation klein \(g\) eine Matrix gross \(\Phi_g\) zuordnet.
+
+Zur Erinnerung, die Orthogonale Gruppe ist definiert als die Matrizen, deren
+transponierte auch die inverse ist. Da diese Volumen und Distanzen erhalten,
+natuerlich nur bis zu einer Vorzeichenumkehrung, macht es Sinn, dass diese
+Punksymmetrien genau beschreiben.
+
+Nehmen wir die folgende Operationen als Beispiele. Die Matrix der trivialen
+Operation, dass heisst nichts zu machen, ist die Einheitsmatrix. Eine
+Spiegelung ist dasselbe aber mit einem Minus, und Drehungen sind uns schon
+dank Herrn M\"uller bekannt.
+
+\section{Kristalle}
+\scene{Spontan}
+
+\section{Piezo}
+\scene{Spontan}
+
+\section{Licht}
+Als Finale, haben wir ein schwieriges Problem aus der Physik. Das Ziel dieser
+Folie ist nicht jedes Zeichen zu versehen, sondern zu zeigen wie man von hier
+weiter gehen kann. Wir mochten sehen wie sich Licht in einem Kristall verhaltet.
+Genauer, wir m\"ochten die Amplitude einer
+elektromagnetischer Welle in einem Kristall beschreiben.
+
+Das Beispiel richtet sich mehr an Elektrotechnik Studenten, aber die Theorie
+ist die gleiche bei mechanischen Wellen in Materialien mit einer
+Spannungstensor wie dem, den wir letzte Woche gesehen haben.
+% Ganz grob gesagt, ersetzt man E durch Xi und epsilon durch das Sigma.
+
+Um eine Welle zu beschreiben, verwenden wir die Helmholtz-Gleichung, die einige
+von uns bereits in anderen Kursen gel\"ost haben. Schwierig wird aber dieses
+Problem, wenn der Term vor der Zeitableitung ein Tensor ist (f\"ur uns eine Matrix).
+
+Zur Vereinfachung werden wir eine ebene Welle verwenden. Setzt man dieses E in
+die Helmholtz-Gleichung ein, erhält man folgendes zurück: ein Eigenwertproblem.
+
+Physikalisch bedeutet dies, dass die Welle in diesem Material ihre Amplitude in
+Abhängigkeit von der Ausbreitungsrichtung ändert. Und die Eigenwerte sagen
+aus, wie stark die Amplitude der Welle in jeder Richtung skaliert wird.
+
+Ich sagte, in jede Richtung skaliert, aber welche Richtungen genau?
+Physikalisch hängt das von der kristallinen Struktur des Materials ab, aber
+mathematisch können wir sagen: in Richtung der Eigenvektoren! Aber diesen
+Eigenraum zu finden, in dem die Eigenvektoren wohnen, ist beliebig schwierig.
+
+Hier kommt unsere Gruppentheorie zu Hilfe. Wir können die Symmetrien unseres
+Kristalls zur Hilfe nehmen. Zu jeder dieser Symmetrien lässt sich bekanntlich eine
+einfache Matrix finden, deren Eigenraum ebenfalls relativ leicht zu finden ist.
+Zum Beispiel ist der Eigenraum der Rotation \(r\), die Rotationsachse, für die
+Reflexion \(\sigma\) eine Ebene, und so weiter.
+
+Nun ist die Frage, ob man diese Eingenraume der Symmetrienoperationen
+kombinieren kann um den Eigenraum des physikalisches Problems zu finden.
+
+Aber leider ist meine Zeit abgelaufen in der Recherche, also müssen Sie mir 2
+Dingen einfach glauben, erstens dass es einen Weg gibt, und zweitens dass eher
+nicht so schlimm ist, wenn man die Notation einmal gelernt hat.
+
+Nachdem wir an, wir haben den Eigenraum U gefunden, dann können wir einen
+(Eigen)Vektor E daraus nehmen und in ihm direkt lambda ablesen. Das sagt uns,
+wie die Amplitude der Welle, in diese Richtung gedämpft wurde.
+
+Diese Methode ist nicht spezifisch für dieses Problem, im Gegenteil, ich habe
+gesehen, dass sie in vielen Bereichen eingesetzt wird, wie z.B.:
+Kristallographie, Festkörperphysik, Molekülschwingungen in der Quantenchemie
+und numerische Simulationen von Membranen.
+
+\section{Outro}
+\scene{Camera}
+
+\end{document}
+% vim:et ts=2 sw=2:
diff --git a/vorlesungen/punktgruppen/slides.pdf b/vorlesungen/punktgruppen/slides.pdf
new file mode 100644
index 0000000..e1769f8
--- /dev/null
+++ b/vorlesungen/punktgruppen/slides.pdf
Binary files differ
diff --git a/vorlesungen/punktgruppen/slides.tex b/vorlesungen/punktgruppen/slides.tex
new file mode 100644
index 0000000..cd3d7d7
--- /dev/null
+++ b/vorlesungen/punktgruppen/slides.tex
@@ -0,0 +1,895 @@
+\documentclass[12pt, xcolor, aspectratio=169, handout]{beamer}
+
+% language
+\usepackage{polyglossia}
+\setmainlanguage{german}
+
+% pretty drawings
+\usepackage{tikz}
+\usepackage{tikz-3dplot}
+
+\usetikzlibrary{positioning}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{shapes.misc}
+\usetikzlibrary{calc}
+
+\usetikzlibrary{external}
+\tikzexternalize[
+ mode = graphics if exists,
+ figure list = true,
+ prefix=build/
+]
+
+% Theme
+\beamertemplatenavigationsymbolsempty
+
+% set look
+\usetheme{default}
+\usecolortheme{fly}
+\usefonttheme{serif}
+
+%% Set font
+\usepackage[p,osf]{scholax}
+\usepackage{amsmath}
+\usepackage[scaled=1.075,ncf,vvarbb]{newtxmath}
+
+% set colors
+\definecolor{background}{HTML}{202020}
+
+\setbeamercolor{normal text}{fg=white, bg=background}
+\setbeamercolor{structure}{fg=white}
+
+\setbeamercolor{item projected}{use=item,fg=background,bg=item.fg!35}
+
+\setbeamercolor*{palette primary}{use=structure,fg=white,bg=structure.fg}
+\setbeamercolor*{palette secondary}{use=structure,fg=white,bg=structure.fg!75}
+\setbeamercolor*{palette tertiary}{use=structure,fg=white,bg=structure.fg!50}
+\setbeamercolor*{palette quaternary}{fg=white,bg=background}
+
+\setbeamercolor*{block title}{parent=structure}
+\setbeamercolor*{block body}{fg=background, bg=}
+
+\setbeamercolor*{framesubtitle}{fg=white}
+
+\setbeamertemplate{section page}
+{
+ \begin{center}
+ \Huge
+ \insertsection
+ \end{center}
+}
+\AtBeginSection{\frame{\sectionpage}}
+
+% Macros
+\newcommand{\ten}[1]{#1}
+
+% Metadata
+\title{\LARGE \scshape Punktgruppen und Kristalle}
+\author[N. Pross, T. T\"onz]{Naoki Pross, Tim T\"onz}
+\institute{Hochschule f\"ur Technik OST, Rapperswil}
+\date{10. Mai 2021}
+
+% Slides
+\begin{document}
+\frame{
+ \titlepage
+ \vfill
+ \begin{center}
+ \small \color{gray}
+ Slides: \texttt{s.0hm.ch/ctBsD}
+ \end{center}
+}
+\frame{\tableofcontents}
+
+\frame{
+ \begin{itemize}
+ \item Was heisst \emph{Symmetrie} in der Mathematik? \pause
+ \item Wie kann ein Kristall modelliert werden? \pause
+ \item Aus der Physik: Licht, Piezoelektrizit\"at \pause
+ \end{itemize}
+ \begin{center}
+ \begin{tikzpicture}
+ \begin{scope}[
+ node distance = 0cm
+ ]
+ \node[
+ rectangle, fill = gray!40!background,
+ minimum width = 3cm, minimum height = 2cm,
+ ] (body) {\(\vec{E}_p = \vec{0}\)};
+
+ \node[
+ draw, rectangle, thick, white, fill = red!50,
+ minimum width = 3cm, minimum height = 1mm,
+ above = of body
+ ] (pos) {};
+
+ \node[
+ draw, rectangle, thick, white, fill = blue!50,
+ minimum width = 3cm, minimum height = 1mm,
+ below = of body
+ ] (neg) {};
+
+ \draw[white, very thick, -Circle] (pos.east) to ++ (1,0) node (p) {};
+ \draw[white, very thick, -Circle] (neg.east) to ++ (1,0) node (n) {};
+
+ \draw[white, thick, ->] (p) to[out = -70, in = 70] node[midway, right] {\(U = 0\)} (n);
+ \end{scope}
+ \begin{scope}[
+ node distance = 0cm,
+ xshift = 7cm
+ ]
+ \node[
+ rectangle, fill = gray!40!background,
+ minimum width = 3cm, minimum height = 1.5cm,
+ ] (body) {\(\vec{E}_p = \vec{0}\)};
+
+ \node[
+ draw, rectangle, thick, white, fill = red!50,
+ minimum width = 3cm, minimum height = 1mm,
+ above = of body
+ ] (pos) {};
+
+ \node[
+ draw, rectangle, thick, white, fill = blue!50,
+ minimum width = 3cm, minimum height = 1mm,
+ below = of body
+ ] (neg) {};
+
+ \draw[orange, very thick, <-] (pos.north) to node[near end, right] {\(\vec{F}\)} ++(0,1);
+ \draw[orange, very thick, <-] (neg.south) to node[near end, right] {\(\vec{F}\)} ++(0,-1);
+
+ \draw[white, very thick, -Circle] (pos.east) to ++ (1,0) node (p) {};
+ \draw[white, very thick, -Circle] (neg.east) to ++ (1,0) node (n) {};
+
+ \draw[white, thick, ->] (p) to[out = -70, in = 70] node[midway, right] {\(U > 0\)} (n);
+ \end{scope}
+ \end{tikzpicture}
+ \end{center}
+}
+
+\section{2D Symmetrien}
+%% Made in video
+{
+ \usebackgroundtemplate{
+ \includegraphics[height=\paperheight]{media/images/nosignal}}
+ \frame{}
+}
+
+\section{Algebraische Symmetrien}
+%% Made in video
+\frame{
+ \begin{columns}[T]
+ \begin{column}{.5\textwidth}
+ Produkt mit \(i\)
+ \begin{align*}
+ 1 \cdot i &= i \\
+ i \cdot i &= -1 \\
+ -1 \cdot i &= -i \\
+ -i \cdot i &= 1
+ \end{align*}
+ \pause
+ %
+ Gruppe
+ \begin{align*}
+ G &= \left\{
+ 1, i, -1, -i
+ \right\} \\
+ &= \left\{
+ 1, i, i^2, i^3
+ \right\} \\
+ C_4 &= \left\{
+ \mathbb{1}, r, r^2, r^3
+ \right\}
+ \end{align*}
+ \pause
+ \end{column}
+ \begin{column}{.5\textwidth}
+ Darstellung \(\phi : C_4 \to G\)
+ \begin{align*}
+ \phi(\mathbb{1}) &= 1 & \phi(r^2) &= i^2 \\
+ \phi(r) &= i & \phi(r^3) &= i^3
+ \end{align*}
+ \pause
+ %
+ Homomorphismus
+ \begin{align*}
+ \phi(r \circ \mathbb{1}) &= \phi(r) \cdot \phi(\mathbb{1}) \\
+ &= i \cdot 1
+ \end{align*}
+ \pause
+ %
+ \(\phi\) ist bijektiv \(\implies C_4 \cong G\)
+ \pause
+ %
+ \begin{align*}
+ \psi : C_4 &\to (\mathbb{Z}/4\mathbb{Z}, +) \\
+ \psi(\mathbb{1}\circ r^2) &= 0 + 2 \pmod{4}
+ \end{align*}
+ \end{column}
+ \end{columns}
+}
+
+\section{3D Symmetrien}
+%% Made in video
+{
+ \usebackgroundtemplate{
+ \includegraphics[height=\paperheight]{media/images/nosignal}}
+ \frame{}
+}
+
+\section{Matrizen}
+\frame{
+ \begin{columns}[T]
+ \begin{column}{.5\textwidth}
+ Symmetriegruppe
+ \[
+ G = \left\{\mathbb{1}, r, \sigma, \dots \right\}
+ \]
+ \pause
+ Matrixdarstellung
+ \begin{align*}
+ \Phi : G &\to O(3) \\
+ g &\mapsto \Phi_g
+ \end{align*}
+ \pause
+ Orthogonale Gruppe
+ \[
+ O(n) = \left\{ Q : QQ^t = Q^tQ = I \right\}
+ \]
+ \end{column}
+ \pause
+ \begin{column}{.5\textwidth}
+ \begin{align*}
+ \Phi_\mathbb{1} &= \begin{pmatrix}
+ 1 & 0 & 0 \\
+ 0 & 1 & 0 \\
+ 0 & 0 & 1
+ \end{pmatrix} = I \\[1em]
+ \Phi_\sigma &= \begin{pmatrix}
+ 1 & 0 & 0 \\
+ 0 & -1 & 0 \\
+ 0 & 0 & 1
+ \end{pmatrix} \\[1em]
+ \Phi_r &= \begin{pmatrix}
+ \cos \alpha & -\sin \alpha & 0 \\
+ \sin \alpha & \cos \alpha & 0 \\
+ 0 & 0 & 1
+ \end{pmatrix}
+ \end{align*}
+ \end{column}
+ \end{columns}
+}
+
+\section{Kristalle}
+\begin{frame}[fragile]{}
+ \begin{columns}
+ \onslide<1->{
+ \begin{column}{.5\textwidth}
+ \begin{center}
+ \begin{tikzpicture}[
+ dot/.style = {
+ draw, circle, thick, white, fill = gray!40!background,
+ minimum size = 2mm,
+ inner sep = 0pt,
+ outer sep = 1mm,
+ },
+ ]
+
+ \begin{scope}
+ \clip (-2,-2) rectangle (3,4);
+ \foreach \y in {-7,-6,...,7} {
+ \foreach \x in {-7,-6,...,7} {
+ \node[dot, xshift=3mm*\y] (N\x\y) at (\x, \y) {};
+ }
+ }
+ \end{scope}
+ \draw[white, thick] (-2, -2) rectangle (3,4);
+
+ \draw[red!80!background, thick, ->]
+ (N00) to node[midway, below] {\(\vec{a}_1\)} (N10);
+ \draw[cyan!80!background, thick, ->]
+ (N00) to node[midway, left] {\(\vec{a}_2\)} (N01);
+ \end{tikzpicture}
+ \end{center}
+ \end{column}
+ }
+ \begin{column}{.5\textwidth}
+ \onslide<2->{
+ Kristallgitter:
+ \(n_i \in \mathbb{Z}\),
+ }
+ \onslide<3->{
+ \(\vec{a}_i \in \mathbb{R}^3\)
+ }
+ \onslide<2->{
+ \[
+ \vec{r} = n_1 \vec{a}_1 + n_2 \vec{a}_2 \onslide<3->{+ n_3 \vec{a}_3}
+ \]
+ }
+ \vspace{1cm}
+
+ \onslide<4->{
+ Invariant unter Translation
+ \[
+ Q_i(\vec{r}) = \vec{r} + \vec{a}_i
+ \]
+ }
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{frame}[fragile]{}
+ \begin{columns}[T]
+ \begin{column}{.5\textwidth}
+ \onslide<1->{
+ Wie kombiniert sich \(Q_i\) mit der anderen Symmetrien?
+ }
+ \begin{center}
+ \begin{tikzpicture}[
+ dot/.style = {
+ draw, circle, thick, white, fill = gray!40!background,
+ minimum size = 2mm,
+ inner sep = 0pt,
+ outer sep = 1mm,
+ },
+ ]
+
+ \onslide<2->{
+ \node[dot] (A1) at (0,0) {};
+ \node[below left] at (A1) {\(A\)};
+ }
+
+ \onslide<3->{
+ \node[dot] (A2) at (2.5,0) {};
+ \node[below right] at (A2) {\(A'\)};
+
+ \draw[red!80!background, thick, ->]
+ (A1) to node[midway, below] {\(\vec{Q}\)} (A2);
+ }
+
+ \onslide<4->{
+ \node[dot] (B1) at (120:2.5) {};
+ \node[above left] at (B1) {\(B\)};
+
+ \draw[green!70!background, thick, ->]
+ (A1) ++(.5,0) arc (0:120:.5)
+ node[midway, above, xshift=1mm] {\(C_n\)};
+ \draw[red!80!background, dashed, thick, ->] (A1) to (B1);
+ }
+
+ \onslide<5->{
+ \node[dot] (B2) at ($(A2)+(60:2.5)$) {};
+ \node[above right] at (B2) {\(B'\)};
+
+ \draw[green!70!background, thick, dashed, ->]
+ (A2) ++(-.5,0) arc (180:60:.5);
+ \draw[red!80!background, dashed, thick, ->] (A2) to (B2);
+ }
+
+ \onslide<6->{
+ \draw[yellow!80!background, thick, ->]
+ (B1) to node[above, midway] {\(\vec{Q}'\)} (B2);
+ }
+
+ \onslide<10->{
+ \draw[gray, dashed, thick] (A1) to (A1 |- B1) node (Xl) {};
+ \draw[gray, dashed, thick] (A2) to (A2 |- B2) node (Xr) {};
+ \node[above left, xshift=-2mm] at (Xl) {\(x\)};
+ \node[above right, xshift= 2mm] at (Xr) {\(x\)};
+ }
+ \end{tikzpicture}
+ \end{center}
+ \end{column}
+ \begin{column}{.5\textwidth}
+ \onslide<7->{
+ Sei \(q = |\vec{Q}|\), \(\alpha = 2\pi/n\) und \(n \in \mathbb{N}\)
+ }
+ \begin{align*}
+ \onslide<9->{q' = n q \onslide<10->{&= q + 2x \\}}
+ \onslide<11->{nq &= q + 2q\sin(\alpha - \pi/2) \\}
+ \onslide<12->{n &= 1 - 2\cos\alpha}
+ \end{align*}
+ \onslide<13->{
+ Somit muss
+ \begin{align*}
+ \alpha &= \cos^{-1}\left(\frac{1-n}{2}\right) \\[1em]
+ \alpha &\in \left\{ 0, 60^\circ, 90^\circ, 120^\circ, 180^\circ \right\} \\
+ n &\in \left\{ 1, 2, 3, 4, 6 \right\}
+ \end{align*}
+ }
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{frame}[fragile]{M\"ogliche Kristallstrukturen}
+ \begin{center}
+ \begin{tikzpicture}[]
+ \node[circle, dashed, draw = gray,
+ thick, fill = background,
+ minimum size = 4cm] {};
+ \node[gray] at (.9,-1.2) {674};
+
+ \node[circle, draw = white, thick,
+ fill = orange!40!background,
+ xshift = -3mm, yshift = 2mm,
+ minimum size = 2.75cm,
+ outer sep = 1mm] (A) {};
+ \node[white, yshift = 2mm] at (A) {230};
+ \node[white, font=\large, above right = of A] (Al) {Raumgruppe};
+ \draw[white, thick, ->] (Al.west) to[out=180, in=60] (A);
+
+ \node[circle, draw = white, thick,
+ fill = red!20!background,
+ xshift = -5mm, yshift = -5mm,
+ minimum size = 1cm,
+ outer sep = 1mm] (B) {32};
+ \node[white, font=\large, below left = of B, xshift=-4mm] (Bl) {Kristallklassen};
+ \draw[white, thick, ->] (Bl.east) to[out = 0, in = 180] (B);
+ \end{tikzpicture}
+ \end{center}
+\end{frame}
+
+{
+ \usebackgroundtemplate[fragile]{
+ \begin{tikzpicture}[
+ overlay,
+ xshift = .45\paperwidth,
+ yshift = .47\paperheight,
+ classcirc/.style = {
+ draw = gray, thick, circle,
+ minimum size = 12mm,
+ inner sep = 0pt, outer sep = 0pt,
+ },
+ classlabel/.style = {
+ below right = 5mm
+ },
+ round/.style = {
+ draw = yellow, thick, circle,
+ minimum size = 1mm,
+ inner sep = 0pt, outer sep = 0pt,
+ },
+ cross/.style = {
+ cross out, draw = magenta, thick,
+ minimum size = 1mm,
+ inner sep = 0pt, outer sep = 0pt
+ },
+ ]
+ \matrix [row sep = 3mm, column sep = 0mm] {
+ \node[classcirc] (C1) {} node[classlabel] {\(C_{1}\)}; &
+ \node[classcirc] (C2) {} node[classlabel] {\(C_{2}\)}; &
+ \node[classcirc] (C3) {} node[classlabel] {\(C_{3}\)}; &
+ \node[classcirc] (Ci) {} node[classlabel] {\(C_{i}\)}; &
+
+ \node[classcirc] (Cs) {} node[classlabel] {\(C_{s}\)}; &
+ \node[classcirc] (C3i) {} node[classlabel] {\(C_{3i}\)}; &
+ \node[classcirc] (C2h) {} node[classlabel] {\(C_{2h}\)}; &
+ \node[classcirc] (D2) {} node[classlabel] {\(D_{2}\)}; \\
+
+ \node[classcirc] (D3d) {} node[classlabel] {\(D_{3d}\)}; &
+ \node[classcirc] (C2v) {} node[classlabel] {\(C_{2v}\)}; &
+ \node[classcirc] (D2h) {} node[classlabel] {\(D_{2h}\)}; &
+ \node[classcirc] (D3) {} node[classlabel] {\(D_{3}\)}; &
+
+ \node[classcirc] (C4) {} node[classlabel] {\(C_{4}\)}; &
+ \node[classcirc] (C6) {} node[classlabel] {\(C_{6}\)}; &
+ \node[classcirc] (D3dP) {} node[classlabel] {\(D_{3d}\)}; &
+ \node[classcirc] (S4) {} node[classlabel] {\(S_{4}\)}; \\
+
+ \node[classcirc] (S3) {} node[classlabel] {\(S_{3}\)}; &
+ \node[classcirc, dashed] (T) {} node[classlabel] {\(T_{}\)}; &
+ \node[classcirc] (C4h) {} node[classlabel] {\(C_{4h}\)}; &
+ \node[classcirc] (C6h) {} node[classlabel] {\(C_{6h}\)}; &
+
+ \node[classcirc, dashed] (Th) {} node[classlabel] {\(T_{h}\)}; &
+ \node[classcirc] (C4v) {} node[classlabel] {\(C_{4v}\)}; &
+ \node[classcirc] (C6v) {} node[classlabel] {\(C_{6v}\)}; &
+ \node[classcirc, dashed] (Td) {} node[classlabel] {\(T_{d}\)}; \\
+
+ \node[classcirc] (D2d) {} node[classlabel] {\(D_{2d}\)}; &
+ \node[classcirc] (D3h) {} node[classlabel] {\(D_{3h}\)}; &
+ \node[classcirc, dashed] (O) {} node[classlabel] {\(O_{}\)}; &
+ \node[classcirc] (D4) {} node[classlabel] {\(D_{4}\)}; &
+
+ \node[classcirc] (D6) {} node[classlabel] {\(D_{6}\)}; &
+ \node[classcirc, dashed] (Oh) {} node[classlabel] {\(O_{h}\)}; &
+ \node[classcirc] (D4h) {} node[classlabel] {\(D_{4h}\)}; &
+ \node[classcirc] (D6h) {} node[classlabel] {\(D_{6h}\)}; \\
+ };
+
+
+ \node[cross] at ($(C1)+(4mm,0)$) {};
+
+
+ \node[cross] at ($(C2)+(4mm,0)$) {};
+ \node[cross] at ($(C2)-(4mm,0)$) {};
+
+
+ \node[cross] at ($(C3)+( 0:4mm)$) {};
+ \node[cross] at ($(C3)+(120:4mm)$) {};
+ \node[cross] at ($(C3)+(240:4mm)$) {};
+
+
+ \node[cross] at ($(Ci)+(4mm,0)$) {};
+ \node[round] at ($(Ci)-(4mm,0)$) {};
+
+
+ \node[cross] at ($(Cs)+(4mm,0)$) {};
+ \node[round] at ($(Cs)+(4mm,0)$) {};
+
+
+ \node[cross] at ($(C3i)+( 0:4mm)$) {};
+ \node[cross] at ($(C3i)+(120:4mm)$) {};
+ \node[cross] at ($(C3i)+(240:4mm)$) {};
+ \node[round] at ($(C3i)+( 60:4mm)$) {};
+ \node[round] at ($(C3i)+(180:4mm)$) {};
+ \node[round] at ($(C3i)+(300:4mm)$) {};
+
+
+ \node[cross] at ($(C2h)+(4mm,0)$) {};
+ \node[cross] at ($(C2h)-(4mm,0)$) {};
+ \node[round] at ($(C2h)+(4mm,0)$) {};
+ \node[round] at ($(C2h)-(4mm,0)$) {};
+
+
+ \node[cross] at ($(D2)+( 20:4mm)$) {};
+ \node[cross] at ($(D2)+(200:4mm)$) {};
+ \node[round] at ($(D2)+(160:4mm)$) {};
+ \node[round] at ($(D2)+(340:4mm)$) {};
+
+
+ \foreach \x in {0, 120, 240} {
+ \node[cross] at ($(D3d)+({\x+15}:4mm)$) {};
+ \node[cross] at ($(D3d)+({\x-15}:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 180} {
+ \node[cross] at ($(C2v)+({\x+15}:4mm)$) {};
+ \node[cross] at ($(C2v)+({\x-15}:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 180} {
+ \node[cross] at ($(D2h)+({\x+15}:4mm)$) {};
+ \node[cross] at ($(D2h)+({\x-15}:4mm)$) {};
+ \node[round] at ($(D2h)+({\x+15}:4mm)$) {};
+ \node[round] at ($(D2h)+({\x-15}:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 120, 240} {
+ \node[cross] at ($(D3)+({\x+15}:4mm)$) {};
+ \node[round] at ($(D3)+({\x-15}:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 90, 180, 270} {
+ \node[cross] at ($(C4)+(\x:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 60, 120, 180, 240, 300} {
+ \node[cross] at ($(C6)+(\x:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 120, 240} {
+ \node[cross] at ($(D3dP)+({\x+15}:4mm)$) {};
+ \node[cross] at ($(D3dP)+({\x-15}:4mm)$) {};
+ \node[round] at ($(D3dP)+({\x+15+60}:4mm)$) {};
+ \node[round] at ($(D3dP)+({\x-15+60}:4mm)$) {};
+ }
+
+
+ \node[cross] at ($(S4)+(4mm,0)$) {};
+ \node[cross] at ($(S4)-(4mm,0)$) {};
+ \node[round] at ($(S4)+(0,4mm)$) {};
+ \node[round] at ($(S4)-(0,4mm)$) {};
+
+
+ \foreach \x in {0, 120, 240} {
+ \node[cross] at ($(S3)+(\x:4mm)$) {};
+ \node[round] at ($(S3)+(\x:4mm)$) {};
+ }
+
+
+ %% TODO: T
+
+
+ \foreach \x in {0, 90, 180, 270} {
+ \node[cross] at ($(C4h)+(\x:4mm)$) {};
+ \node[round] at ($(C4h)+(\x:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 60, 120, 180, 240, 300} {
+ \node[cross] at ($(C6h)+(\x:4mm)$) {};
+ \node[round] at ($(C6h)+(\x:4mm)$) {};
+ }
+
+
+ %% TODO: Th
+
+
+ \foreach \x in {0, 90, 180, 270} {
+ \node[cross] at ($(C4v)+(\x+15:4mm)$) {};
+ \node[cross] at ($(C4v)+(\x-15:4mm)$) {};
+ }
+
+
+
+ \foreach \x in {0, 60, 120, 180, 240, 300} {
+ \node[cross] at ($(C6v)+(\x+10:4mm)$) {};
+ \node[cross] at ($(C6v)+(\x-10:4mm)$) {};
+ }
+
+
+ %% TODO: Td
+
+
+ \foreach \x in {0, 180} {
+ \node[cross] at ($(D2d)+({\x+15}:4mm)$) {};
+ \node[round] at ($(D2d)+({\x-15}:4mm)$) {};
+
+ \node[round] at ($(D2d)+({\x+15+90}:4mm)$) {};
+ \node[cross] at ($(D2d)+({\x-15+90}:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 120, 240} {
+ \node[cross] at ($(D3h)+({\x+15}:4mm)$) {};
+ \node[cross] at ($(D3h)+({\x-15}:4mm)$) {};
+ \node[round] at ($(D3h)+({\x+15}:4mm)$) {};
+ \node[round] at ($(D3h)+({\x-15}:4mm)$) {};
+ }
+
+
+ %% TODO: O
+
+
+ \foreach \x in {0, 90, 180, 270} {
+ \node[cross] at ($(D4)+({\x+15}:4mm)$) {};
+ \node[round] at ($(D4)+({\x-15}:4mm)$) {};
+ }
+
+ \foreach \x in {0, 60, 120, 180, 240, 300} {
+ \node[cross] at ($(D6)+({\x+10}:4mm)$) {};
+ \node[round] at ($(D6)+({\x-10}:4mm)$) {};
+ }
+
+
+ % TODO Oh
+
+
+ \foreach \x in {0, 90, 180, 270} {
+ \node[cross] at ($(D4h)+(\x+15:4mm)$) {};
+ \node[cross] at ($(D4h)+(\x-15:4mm)$) {};
+ \node[round] at ($(D4h)+(\x+15:4mm)$) {};
+ \node[round] at ($(D4h)+(\x-15:4mm)$) {};
+ }
+
+
+ \foreach \x in {0, 60, 120, 180, 240, 300} {
+ \node[cross] at ($(D6h)+({\x+10}:4mm)$) {};
+ \node[cross] at ($(D6h)+({\x-10}:4mm)$) {};
+ \node[round] at ($(D6h)+({\x+10}:4mm)$) {};
+ \node[round] at ($(D6h)+({\x-10}:4mm)$) {};
+ }
+ \end{tikzpicture}
+ }
+ \begin{frame}[fragile]{}
+ \end{frame}
+}
+
+\section{Anwendungen}
+\begin{frame}[fragile]{}
+ \centering
+ \begin{tikzpicture}[
+ box/.style = {
+ rectangle, thick, draw = white, fill = darkgray!50!background,
+ minimum height = 1cm, outer sep = 2mm,
+ },
+ ]
+
+ \matrix [nodes = {box, align = center}, column sep = 1cm, row sep = 1.5cm] {
+ & \node (A) {32 Kristallklassen}; \\
+ \node (B) {11 Mit\\ Inversionszentrum}; & \node (C) {21 Ohne\\ Inversionszentrum}; \\
+ & \node[fill=red!20!background] (D) {20 Piezoelektrisch}; & \node (E) {1 Nicht\\ piezoelektrisch}; \\
+ };
+
+ \draw[thick, ->] (A.west) to[out=180, in=90] (B.north);
+ \draw[thick, ->] (A.south) to (C);
+ \draw[thick, ->] (C.south) to (D.north);
+ \draw[thick, ->] (C.east) to[out=0, in=90] (E.north);
+ \end{tikzpicture}
+\end{frame}
+
+\begin{frame}[fragile]{}
+ \begin{tikzpicture}[
+ overlay, xshift = 1.5cm, yshift = 1.5cm,
+ node distance = 2mm,
+ charge/.style = {
+ circle, draw = white, thick,
+ minimum size = 5mm
+ },
+ positive/.style = { fill = red!50 },
+ negative/.style = { fill = blue!50 },
+ ]
+
+ \node[font = {\large\bfseries}, align = center] (title) at (5.5,0) {Mit und Ohne\\ Symmetriezentrum};
+ \pause
+
+ \begin{scope}
+ \matrix[nodes = { charge }, row sep = 8mm, column sep = 8mm] {
+ \node[positive] {}; & \node[negative] (N) {}; & \node [positive] {}; \\
+ \node[negative] (W) {}; & \node[positive] {}; & \node [negative] (E) {}; \\
+ \node[positive] {}; & \node[negative] (S) {}; & \node [positive] {}; \\
+ };
+ \draw[gray, dashed] (W) to (N) to (E) to (S) to (W);
+ \end{scope}
+ \pause
+
+ \begin{scope}[xshift=11cm]
+ \foreach \x/\t [count=\i] in {60/positive, 120/negative, 180/positive, 240/negative, 300/positive, 360/negative} {
+ \node[charge, \t] (C\i) at (\x:1.5cm) {};
+ }
+
+ \draw[white] (C1) to (C2) to (C3) to (C4) to (C5) to (C6) to (C1);
+ \node[circle, draw=gray, fill=gray, outer sep = 0, inner sep = 0, minimum size = 3mm] {};
+ % \draw[gray, dashed] (C2) to (C4) to (C6) to (C2);
+ \end{scope}
+ \pause
+
+ %%
+ \node[below = of title] {Polarisation Feld \(\vec{E}_p\)};
+
+ %% hex with vertical pressure
+ \begin{scope}[xshift=11cm, yshift=-4.5cm]
+ \node[charge, positive, yshift=-2.5mm] (C1) at ( 60:1.5cm) {};
+ \node[charge, negative, yshift=-2.5mm] (C2) at (120:1.5cm) {};
+ \node[charge, positive, xshift=-2.5mm] (C3) at (180:1.5cm) {};
+ \node[charge, negative, yshift= 2.5mm] (C4) at (240:1.5cm) {};
+ \node[charge, positive, yshift= 2.5mm] (C5) at (300:1.5cm) {};
+ \node[charge, negative, xshift= 2.5mm] (C6) at (360:1.5cm) {};
+
+ \draw[white] (C1) to (C2) to (C3) to (C4) to (C5) to (C6) to (C1);
+ % \draw[gray, dashed] (C2) to (C4) to (C6) to (C2);
+
+ \foreach \d in {C1, C2} {
+ \draw[orange, very thick, <-] (\d) to ++(0,.7);
+ }
+
+ \foreach \d in {C4, C5} {
+ \draw[orange, very thick, <-] (\d) to ++(0,-.7);
+ }
+
+ \node[white] (E) {\(\vec{E}_p\)};
+ \begin{scope}[node distance = .5mm]
+ \node[red!50, right = of E] {\(+\)};
+ \node[blue!50, left = of E] {\(-\)};
+ \end{scope}
+ % \draw[gray, thick, dotted] (E) to ++(0,2);
+ % \draw[gray, thick, dotted] (E) to ++(0,-2);
+ \end{scope}
+ \pause
+
+ %% square with vertical pressure
+ \begin{scope}[yshift=-4.5cm]
+ \matrix[nodes = { charge }, row sep = 5mm, column sep = 1cm] {
+ \node[positive] (NW) {}; & \node[negative] (N) {}; & \node [positive] (NE) {}; \\
+ \node[negative] (W) {}; & \node[positive] {}; & \node [negative] (E) {}; \\
+ \node[positive] (SW) {}; & \node[negative] (S) {}; & \node [positive] (SE) {}; \\
+ };
+
+ \foreach \d in {NW, N, NE} {
+ \draw[orange, very thick, <-] (\d) to ++(0,.7);
+ }
+
+ \foreach \d in {SW, S, SE} {
+ \draw[orange, very thick, <-] (\d) to ++(0,-.7);
+ }
+
+ \draw[gray, dashed] (W) to (N) to (E) to (S) to (W);
+ \end{scope}
+ \pause
+
+ %% hex with horizontal pressure
+ \begin{scope}[xshift=5.5cm, yshift=-4.5cm]
+ \node[charge, positive, yshift= 2.5mm] (C1) at ( 60:1.5cm) {};
+ \node[charge, negative, yshift= 2.5mm] (C2) at (120:1.5cm) {};
+ \node[charge, positive, xshift= 2.5mm] (C3) at (180:1.5cm) {};
+ \node[charge, negative, yshift=-2.5mm] (C4) at (240:1.5cm) {};
+ \node[charge, positive, yshift=-2.5mm] (C5) at (300:1.5cm) {};
+ \node[charge, negative, xshift=-2.5mm] (C6) at (360:1.5cm) {};
+
+ \draw[white] (C1) to (C2) to (C3) to (C4) to (C5) to (C6) to (C1);
+ % \draw[gray, dashed] (C2) to (C4) to (C6) to (C2);
+
+ \draw[orange, very thick, <-] (C6) to ++(.7,0);
+ \draw[orange, very thick, <-] (C3) to ++(-.7,0);
+
+ \node[white] (E) {\(\vec{E}_p\)};
+ \begin{scope}[node distance = .5mm]
+ \node[blue!50, right = of E] {\(-\)};
+ \node[red!50, left = of E] {\(+\)};
+ \end{scope}
+ % \draw[gray, thick, dotted] (E) to ++(0,2);
+ % \draw[gray, thick, dotted] (E) to ++(0,-2);
+ \end{scope}
+ \pause
+
+
+ \end{tikzpicture}
+\end{frame}
+
+\frame{
+ \frametitle{Licht in Kristallen}
+ \begin{columns}[T]
+ \begin{column}{.45\textwidth}
+ \onslide<2->{
+ Helmholtz Wellengleichung
+ \[
+ \nabla^2 \vec{E} = \ten{\varepsilon}\mu
+ \frac{\partial^2}{\partial t^2} \vec{E}
+ \]
+ }
+ \onslide<3->{
+ Ebene Welle
+ \[
+ \vec{E} = \vec{E}_0 \exp\left[i
+ \left(\vec{k}\cdot\vec{r} - \omega t \right)\right]
+ \]
+ }
+ \onslide<4->{
+ Anisotropisch Dielektrikum
+ \[
+ (\ten{K}\ten{\varepsilon})\vec{E}
+ = \frac{k^2}{\mu \omega^2} \vec{E}
+ \implies
+ \Phi \vec{E} = \lambda \vec{E}
+ \]
+ }
+ \end{column}
+ \begin{column}{.55\textwidth}
+ \onslide<5->{
+ Eingenraum
+ \begin{align*}
+ U_\lambda &= \left\{ v : \Phi v = \lambda v \right\}
+ = \mathrm{null}\left(\Phi - \lambda I\right)
+ \end{align*}
+ }\onslide<6->{
+ Symmetriegruppe und Darstellung
+ \begin{align*}
+ G &= \left\{\mathbb{1}, r, \sigma, \dots \right\} \\
+ &\Phi : G \to O(n)
+ \end{align*}
+ }\onslide<7->{
+ Kann man \(U_\lambda\) von \(G\) herauslesen?
+ \only<7>{
+ \[
+ U_\lambda \stackrel{?}{=} f\left(\bigoplus_{g \in G} \Phi_g\right)
+ \]
+ }\only<8>{
+ \begin{align*}
+ \mathrm{Tr}\left[\Phi_r(g)\right]
+ &= \sum_i n_i \mathrm{Tr}\left[\Psi_i(g)\right] \\
+ |G| &= \sum_i\mathrm{Tr}\left[\Psi_i(\mathbb{1})\right]
+ \end{align*}
+ }
+ }
+ \end{column}
+ \end{columns}
+}
+
+% \begin{frame}[fragile]
+% \centering
+% \tdplotsetmaincoords{70}{110}
+% \begin{tikzpicture}[scale=2, tdplot_main_coords]
+% \node[draw=white, thick, minimum size = 3cm, circle] {};
+% % \foreach \x in {0, 120, 240} {
+% % }
+% \end{tikzpicture}
+% \end{frame}
+
+
+\end{document}