diff options
-rw-r--r-- | buch/papers/punktgruppen/Makefile.inc | 12 | ||||
-rw-r--r-- | buch/papers/punktgruppen/main.tex | 58 | ||||
-rw-r--r-- | buch/papers/punktgruppen/packages.tex | 5 | ||||
-rw-r--r-- | buch/papers/punktgruppen/teil0.tex | 22 | ||||
-rw-r--r-- | buch/papers/punktgruppen/teil1.tex | 55 | ||||
-rw-r--r-- | buch/papers/punktgruppen/teil2.tex | 40 | ||||
-rw-r--r-- | buch/papers/punktgruppen/teil3.tex | 40 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/.gitignore | 20 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/Makefile | 18 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/crystals.py | 611 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/media/images/nosignal.jpg | bin | 0 -> 711846 bytes | |||
-rw-r--r-- | vorlesungen/punktgruppen/poetry.lock | 743 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/pyproject.toml | 15 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/script.pdf | bin | 0 -> 44991 bytes | |||
-rw-r--r-- | vorlesungen/punktgruppen/script.tex | 214 | ||||
-rw-r--r-- | vorlesungen/punktgruppen/slides.pdf | bin | 0 -> 790926 bytes | |||
-rw-r--r-- | vorlesungen/punktgruppen/slides.tex | 895 |
17 files changed, 2552 insertions, 196 deletions
diff --git a/buch/papers/punktgruppen/Makefile.inc b/buch/papers/punktgruppen/Makefile.inc index 7c6e70d..629abca 100644 --- a/buch/papers/punktgruppen/Makefile.inc +++ b/buch/papers/punktgruppen/Makefile.inc @@ -3,12 +3,8 @@ # # (c) 2021 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule # -dependencies-punktgruppen = \ - papers/punktgruppen/packages.tex \ - papers/punktgruppen/main.tex \ - papers/punktgruppen/references.bib \ - papers/punktgruppen/teil0.tex \ - papers/punktgruppen/teil1.tex \ - papers/punktgruppen/teil2.tex \ - papers/punktgruppen/teil3.tex +dependencies-punktgruppen = \ + papers/punktgruppen/packages.tex \ + papers/punktgruppen/main.tex \ + papers/punktgruppen/references.bib diff --git a/buch/papers/punktgruppen/main.tex b/buch/papers/punktgruppen/main.tex index fc91913..603f293 100644 --- a/buch/papers/punktgruppen/main.tex +++ b/buch/papers/punktgruppen/main.tex @@ -3,34 +3,38 @@ % % (c) 2020 Hochschule Rapperswil % -\chapter{Thema\label{chapter:punktgruppen}} -\lhead{Thema} +\chapter{Crystal M\rotatebox[origin=c]{180}{a}th\label{chapter:punktgruppen}} +\lhead{Crystal M\rotatebox[origin=c]{180}{a}th} \begin{refsection} -\chapterauthor{Hans Muster} - -Ein paar Hinweise für die korrekte Formatierung des Textes -\begin{itemize} -\item -Absätze werden gebildet, indem man eine Leerzeile einfügt. -Die Verwendung von \verb+\\+ ist nur in Tabellen und Arrays gestattet. -\item -Die explizite Platzierung von Bildern ist nicht erlaubt, entsprechende -Optionen werden gelöscht. -Verwenden Sie Labels und Verweise, um auf Bilder hinzuweisen. -\item -Beginnen Sie jeden Satz auf einer neuen Zeile. -Damit ermöglichen Sie dem Versionsverwaltungssysteme, Änderungen -in verschiedenen Sätzen von verschiedenen Autoren ohne Konflikt -anzuwenden. -\item -Bilden Sie auch für Formeln kurze Zeilen, einerseits der besseren -Übersicht wegen, aber auch um GIT die Arbeit zu erleichtern. -\end{itemize} - -\input{papers/punktgruppen/teil0.tex} -\input{papers/punktgruppen/teil1.tex} -\input{papers/punktgruppen/teil2.tex} -\input{papers/punktgruppen/teil3.tex} +\chapterauthor{Tim T\"onz, Naoki Pross} + +%% TODO: remove +%% Some ideas to motivate the topic: +%% - Physics in a crystal lattice structure +%% - Birifrencenge and scattering of light / Xray in Crystals +%% - Electron density function in a lattice +%% - Heat diffusion with lattice model +%% - Ising model for ferromagnetism (?? => H.D. Lang) +%% +%% - Homomorphic encryption (or lattice based cryptography) +%% + Q: Is it possible to edit encrypted data without decrypting it first? + +%% TODO: translated and move into a file {{{ + +\section{Motivation} +% birifrengence + +\section{Math} +% lattice group +% symmetry +% space group + +\section{Physics} +\subsection{Electromagnetic Waves} +\subsection{Crystal Lattice} + + +%% }}} \printbibliography[heading=subbibliography] \end{refsection} diff --git a/buch/papers/punktgruppen/packages.tex b/buch/papers/punktgruppen/packages.tex index 971bcfe..9953339 100644 --- a/buch/papers/punktgruppen/packages.tex +++ b/buch/papers/punktgruppen/packages.tex @@ -4,7 +4,4 @@ % (c) 2019 Prof Dr Andreas Müller, Hochschule Rapperswil % -% if your paper needs special packages, add package commands as in the -% following example -%\usepackage{packagename} - +\usepackage{tikz-3dplot} diff --git a/buch/papers/punktgruppen/teil0.tex b/buch/papers/punktgruppen/teil0.tex deleted file mode 100644 index 5a8278e..0000000 --- a/buch/papers/punktgruppen/teil0.tex +++ /dev/null @@ -1,22 +0,0 @@ -% -% einleitung.tex -- Beispiel-File für die Einleitung -% -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil -% -\section{Teil 0\label{punktgruppen:section:teil0}} -\rhead{Teil 0} -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam -erat, sed diam voluptua \cite{punktgruppen:bibtex}. -At vero eos et accusam et justo duo dolores et ea rebum. -Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum -dolor sit amet. - -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam -erat, sed diam voluptua. -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit -amet. - - diff --git a/buch/papers/punktgruppen/teil1.tex b/buch/papers/punktgruppen/teil1.tex deleted file mode 100644 index 228af33..0000000 --- a/buch/papers/punktgruppen/teil1.tex +++ /dev/null @@ -1,55 +0,0 @@ -% -% teil1.tex -- Beispiel-File für das Paper -% -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil -% -\section{Teil 1 -\label{punktgruppen:section:teil1}} -\rhead{Problemstellung} -Sed ut perspiciatis unde omnis iste natus error sit voluptatem -accusantium doloremque laudantium, totam rem aperiam, eaque ipsa -quae ab illo inventore veritatis et quasi architecto beatae vitae -dicta sunt explicabo. -Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit -aut fugit, sed quia consequuntur magni dolores eos qui ratione -voluptatem sequi nesciunt -\begin{equation} -\int_a^b x^2\, dx -= -\left[ \frac13 x^3 \right]_a^b -= -\frac{b^3-a^3}3. -\label{punktgruppen:equation1} -\end{equation} -Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, -consectetur, adipisci velit, sed quia non numquam eius modi tempora -incidunt ut labore et dolore magnam aliquam quaerat voluptatem. - -Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis -suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? -Quis autem vel eum iure reprehenderit qui in ea voluptate velit -esse quam nihil molestiae consequatur, vel illum qui dolorem eum -fugiat quo voluptas nulla pariatur? - -\subsection{De finibus bonorum et malorum -\label{punktgruppen:subsection:finibus}} -At vero eos et accusamus et iusto odio dignissimos ducimus qui -blanditiis praesentium voluptatum deleniti atque corrupti quos -dolores et quas molestias excepturi sint occaecati cupiditate non -provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga \eqref{000tempmlate:equation1}. - -Et harum quidem rerum facilis est et expedita distinctio -\ref{punktgruppen:section:loesung}. -Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil -impedit quo minus id quod maxime placeat facere possimus, omnis -voluptas assumenda est, omnis dolor repellendus -\ref{punktgruppen:section:folgerung}. -Temporibus autem quibusdam et aut officiis debitis aut rerum -necessitatibus saepe eveniet ut et voluptates repudiandae sint et -molestiae non recusandae. -Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis -voluptatibus maiores alias consequatur aut perferendis doloribus -asperiores repellat. - - diff --git a/buch/papers/punktgruppen/teil2.tex b/buch/papers/punktgruppen/teil2.tex deleted file mode 100644 index b48e785..0000000 --- a/buch/papers/punktgruppen/teil2.tex +++ /dev/null @@ -1,40 +0,0 @@ -% -% teil2.tex -- Beispiel-File für teil2 -% -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil -% -\section{Teil 2 -\label{punktgruppen:section:teil2}} -\rhead{Teil 2} -Sed ut perspiciatis unde omnis iste natus error sit voluptatem -accusantium doloremque laudantium, totam rem aperiam, eaque ipsa -quae ab illo inventore veritatis et quasi architecto beatae vitae -dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit -aspernatur aut odit aut fugit, sed quia consequuntur magni dolores -eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam -est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci -velit, sed quia non numquam eius modi tempora incidunt ut labore -et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima -veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, -nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure -reprehenderit qui in ea voluptate velit esse quam nihil molestiae -consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla -pariatur? - -\subsection{De finibus bonorum et malorum -\label{punktgruppen:subsection:bonorum}} -At vero eos et accusamus et iusto odio dignissimos ducimus qui -blanditiis praesentium voluptatum deleniti atque corrupti quos -dolores et quas molestias excepturi sint occaecati cupiditate non -provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis -est et expedita distinctio. Nam libero tempore, cum soluta nobis -est eligendi optio cumque nihil impedit quo minus id quod maxime -placeat facere possimus, omnis voluptas assumenda est, omnis dolor -repellendus. Temporibus autem quibusdam et aut officiis debitis aut -rerum necessitatibus saepe eveniet ut et voluptates repudiandae -sint et molestiae non recusandae. Itaque earum rerum hic tenetur a -sapiente delectus, ut aut reiciendis voluptatibus maiores alias -consequatur aut perferendis doloribus asperiores repellat. - - diff --git a/buch/papers/punktgruppen/teil3.tex b/buch/papers/punktgruppen/teil3.tex deleted file mode 100644 index 94abd74..0000000 --- a/buch/papers/punktgruppen/teil3.tex +++ /dev/null @@ -1,40 +0,0 @@ -% -% teil3.tex -- Beispiel-File für Teil 3 -% -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil -% -\section{Teil 3 -\label{punktgruppen:section:teil3}} -\rhead{Teil 3} -Sed ut perspiciatis unde omnis iste natus error sit voluptatem -accusantium doloremque laudantium, totam rem aperiam, eaque ipsa -quae ab illo inventore veritatis et quasi architecto beatae vitae -dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit -aspernatur aut odit aut fugit, sed quia consequuntur magni dolores -eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam -est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci -velit, sed quia non numquam eius modi tempora incidunt ut labore -et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima -veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, -nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure -reprehenderit qui in ea voluptate velit esse quam nihil molestiae -consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla -pariatur? - -\subsection{De finibus bonorum et malorum -\label{punktgruppen:subsection:malorum}} -At vero eos et accusamus et iusto odio dignissimos ducimus qui -blanditiis praesentium voluptatum deleniti atque corrupti quos -dolores et quas molestias excepturi sint occaecati cupiditate non -provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis -est et expedita distinctio. Nam libero tempore, cum soluta nobis -est eligendi optio cumque nihil impedit quo minus id quod maxime -placeat facere possimus, omnis voluptas assumenda est, omnis dolor -repellendus. Temporibus autem quibusdam et aut officiis debitis aut -rerum necessitatibus saepe eveniet ut et voluptates repudiandae -sint et molestiae non recusandae. Itaque earum rerum hic tenetur a -sapiente delectus, ut aut reiciendis voluptatibus maiores alias -consequatur aut perferendis doloribus asperiores repellat. - - 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 Binary files differnew file mode 100644 index 0000000..2beeb8b --- /dev/null +++ b/vorlesungen/punktgruppen/media/images/nosignal.jpg 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 Binary files differnew file mode 100644 index 0000000..91993fb --- /dev/null +++ b/vorlesungen/punktgruppen/script.pdf 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 Binary files differnew file mode 100644 index 0000000..e1769f8 --- /dev/null +++ b/vorlesungen/punktgruppen/slides.pdf 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} |