{ "cells": [ { "cell_type": "markdown", "id": "substantial-impact", "metadata": {}, "source": [ "# Vítej!" ] }, { "cell_type": "markdown", "id": "first-armenia", "metadata": {}, "source": [ "Tento dokument obsahuje zdrojové kódy animací k této sérii seriálu, které jdou upravovat a přehrávat bez toho, aby bylo potřeba cokoliv instalovat. Části dokumentu, u kterých je nalevo `In [ ]:` obsahují kód a jdou spustit - stačí je levým tlačítkem vybrat a nahoře zmáčkout `▶`." ] }, { "cell_type": "markdown", "id": "badc1af7", "metadata": {}, "source": [ "Zkuste to u následujícího příkazu, který pro zbytek dokumentu importuje všechno potřebné pro spouštění Manimu (bez něho animace nepoběží)." ] }, { "cell_type": "code", "execution_count": null, "id": "e03b150c", "metadata": {}, "outputs": [], "source": [ "from manim import *" ] }, { "cell_type": "markdown", "id": "honest-cruise", "metadata": {}, "source": [ "## KSP logo" ] }, { "cell_type": "markdown", "id": "governing-increase", "metadata": {}, "source": [ "Animace loga KSP z úvodu seriálu (je v pořádku, že některé jeho části vám ještě nedávají smysl)." ] }, { "cell_type": "code", "execution_count": null, "id": "wound-foundation", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm KSPLogo\n", "\n", "\n", "class KSPLogo(Scene):\n", " def construct(self):\n", " # na černém pozadí hrošík není vidět...\n", " self.camera.background_color = WHITE\n", "\n", " hroch = SVGMobject(\"serial1/hroch.svg\").scale(2)\n", " self.play(Write(hroch))\n", "\n", " logo = Tex(\"KSP\", color=BLACK).scale(2.5)\n", " self.bring_to_back(logo)\n", "\n", " self.play(logo.animate.shift(DOWN * 2.3), hroch.animate.shift(UP * 0.6))\n", "\n", " logo_expanded = Tex(\"Korespondenční Seminář z Programování\", color=BLACK) \\\n", " .scale(1.3) \\\n", " .move_to(logo)\n", " \n", " self.play(TransformMatchingShapes(logo, logo_expanded))\n", " \n", " self.play(FadeOut(logo_expanded), FadeOut(hroch))" ] }, { "cell_type": "markdown", "id": "e6050303", "metadata": {}, "source": [ "Příkaz `manim -v WARNING -qm KSPLogo` volá program Manim na scénu `KSPLogo`. Část `-v WARNING` tlumí výpis nedůležitých informací (zkuste pro zajímavost spustit kód bez něho) a `-qm` nastavuje kvalitu (`q`uality) videa na střední (`m`edium; další dostupné kvality jsou `l`ow, `h`igh a 4`k`)." ] }, { "cell_type": "markdown", "id": "1fa02f58", "metadata": {}, "source": [ "## Úvod" ] }, { "cell_type": "code", "execution_count": null, "id": "d63a1c09", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm Intro\n", "\n", "\n", "class Intro(Scene):\n", " def construct(self):\n", " # vytvoření objektů čtverce a kruhu (a jejich posunutí)\n", " square = Square(color=RED).shift(LEFT * 2)\n", " circle = Circle(color=BLUE).shift(RIGHT * 2)\n", "\n", " # napsaní čtverce a kruhu na scénu\n", " self.play(Write(square), Write(circle))\n", "\n", " # schování čtverce a kruhu ze scény\n", " self.play(FadeOut(square), FadeOut(circle), run_time=2)" ] }, { "cell_type": "markdown", "id": "ed91705e", "metadata": {}, "source": [ "## `animate` syntax" ] }, { "cell_type": "code", "execution_count": null, "id": "870dad88", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm Animate\n", "\n", "\n", "class Animate(Scene):\n", " def construct(self):\n", " square = Square(color=RED).shift(LEFT * 2)\n", " circle = Circle(color=BLUE).shift(RIGHT * 2)\n", "\n", " self.play(Write(square), Write(circle))\n", "\n", " # posunutí objektů\n", " self.play(square.animate.shift(UP * 0.5), circle.animate.shift(DOWN * 0.5))\n", "\n", " # otočení a vybarvení vnitřku čtverce (průhlednost 80%)\n", " # zvětšení a vybarvení vnitřku kruhu (průhlednost 80%)\n", " self.play(\n", " square.animate.rotate(PI / 2).set_fill(RED, 0.8),\n", " circle.animate.scale(2).set_fill(BLUE, 0.8),\n", " )\n", " \n", " # úplné přebarvení kruhu i čtverce (obrys i výplň)\n", " # stejné jako .set_fill() + .set_stroke()\n", " self.play(\n", " square.animate.set_color(GREEN),\n", " circle.animate.set_color(ORANGE),\n", " )\n", " \n", " self.play(FadeOut(square), FadeOut(circle))" ] }, { "cell_type": "markdown", "id": "f5464852", "metadata": {}, "source": [ "## Posouvání objektů" ] }, { "cell_type": "code", "execution_count": null, "id": "b1973f27", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm NextTo\n", "\n", "\n", "class NextTo(Scene):\n", " def construct(self):\n", " # vytvoření čtyřech menších kruhů\n", " c1, c2, c3, c4 = [Circle(radius=0.5, color=WHITE) for _ in range(4)]\n", "\n", " # a jednoho obélníku\n", " rectangle = Rectangle(width=5, height=3)\n", " \n", " # posunutí kruhů tak, aby byly okolo obdélníku\n", " c1.next_to(rectangle, LEFT) # nalevo od\n", " c2.next_to(rectangle, UP) # nahoře od\n", " c3.next_to(rectangle, RIGHT) # napravo od\n", " c4.next_to(rectangle, DOWN) # dolů od\n", "\n", " self.play(*[Write(o) for o in [c1, c2, c3, c4, rectangle]])" ] }, { "cell_type": "code", "execution_count": null, "id": "7f32d0db", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm MoveTo\n", "\n", "\n", "class MoveTo(Scene):\n", " def construct(self):\n", " s1, s2, s3 = [Square() for _ in range(3)]\n", " \n", " self.play(*[Write(o) for o in [s1, s2, s3]])\n", " \n", " # posunutí čtverců vedle sebe\n", " self.play(\n", " s1.animate.next_to(s2, LEFT),\n", " s3.animate.next_to(s2, RIGHT),\n", " )\n", " \n", " # jim odpovídající čísla\n", " t1, t2, t3 = [Tex(f\"${i}$\").scale(3) for i in range(3)]\n", " \n", " # posunutí čísel do středů čtverců\n", " t1.move_to(s1)\n", " t2.move_to(s2)\n", " t3.move_to(s3)\n", " \n", " self.play(*[Write(o) for o in [t1, t2, t3]])" ] }, { "cell_type": "code", "execution_count": null, "id": "54dc3698", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm AlignTo\n", "\n", "\n", "class AlignTo(Scene):\n", " def construct(self):\n", " # vytvoření tří různě velikých kruhů\n", " c1, c2, c3 = [Circle(radius=1.5 - i / 3, color=WHITE) for i in range(3)]\n", "\n", " self.play(*[Write(o) for o in [c1, c2, c3]])\n", "\n", " # c1 a c3 vedle c2\n", " self.play(\n", " c1.animate.next_to(c2, LEFT),\n", " c3.animate.next_to(c2, RIGHT),\n", " )\n", "\n", " # spodek c1 a c3 je stejný jako c2\n", " self.play(\n", " c1.animate.align_to(c2, DOWN),\n", " c3.animate.align_to(c2, DOWN),\n", " )\n", "\n", " # vršek c1, c2 a c3 je vyrovnaný s bodem\n", " point = Point([0, 2.5, 0])\n", "\n", " self.play(\n", " c1.animate.align_to(point, UP),\n", " c2.animate.align_to(point, UP),\n", " c3.animate.align_to(point, UP),\n", " )" ] }, { "cell_type": "markdown", "id": "53e6209b", "metadata": {}, "source": [ "## Sázení textu a matematiky" ] }, { "cell_type": "code", "execution_count": null, "id": "a0de016f", "metadata": { "scrolled": true }, "outputs": [], "source": [ "%%manim -v WARNING -qm TextAndMath\n", "\n", "\n", "class TextAndMath(Scene):\n", " def construct(self):\n", " text = Tex(\"Tohle je text!\").shift(LEFT * 2.5)\n", " \n", " # ke snazšímu psaní \\ používáme r-stringy (před stringem je 'r')\n", " # znamená to, že znaky '\\' jsou brány doslova (v normálním stringu by bylo potřeba psát \\\\)\n", " formula = MathTex(r\"\\sum_{i = 0}^\\infty \\frac{1}{2^i} = 2\").shift(RIGHT * 2.5)\n", "\n", " self.play(Write(formula), Write(text))\n", "\n", " self.play(FadeOut(formula), FadeOut(text))" ] }, { "cell_type": "markdown", "id": "98daca2b", "metadata": {}, "source": [ "## Kostry úloh" ] }, { "cell_type": "markdown", "id": "ec0a8c9a", "metadata": {}, "source": [ "### Míchání [4b]" ] }, { "cell_type": "code", "execution_count": null, "id": "d4d6c6e8", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm Shuffle\n", "\n", "\n", "class Shuffle(Scene):\n", " def construct(self):\n", " pass" ] }, { "cell_type": "code", "execution_count": null, "id": "b8327d92", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qh ShuffleExample\n", "\n", "class ShuffleExample(Scene):\n", " def construct(self):\n", " c11 = Circle(color=WHITE).shift(UP * 1.5 + LEFT * 2)\n", " c12 = Circle(color=WHITE).shift(UP * 1.5 + RIGHT * 2)\n", " c21 = Circle(color=WHITE).shift(DOWN * 1.5 + LEFT * 2)\n", " c22 = Circle(color=WHITE).shift(DOWN * 1.5 + RIGHT * 2)\n", "\n", " self.play(Write(c11), Write(c12), Write(c21), Write(c22))\n", "\n", " self.play(Swap(c11, c21))\n", "\n", " self.play(Swap(c12, c22, path_arc=160 * DEGREES))" ] }, { "cell_type": "markdown", "id": "6e2024fc", "metadata": {}, "source": [ "### Třízení [6b]" ] }, { "cell_type": "code", "execution_count": null, "id": "2736f1be", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm Sort\n", "\n", "\n", "class Sort(Scene):\n", " def construct(self):\n", " pass" ] }, { "cell_type": "code", "execution_count": null, "id": "54e8ed05", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm StretchToFitHeightExample\n", "\n", "\n", "class StretchToFitHeightExample(Scene):\n", " def construct(self):\n", " s1 = Square().shift(LEFT * 2.5)\n", " s2 = Square().shift(RIGHT * 2.5)\n", "\n", " self.play(Write(s1), Write(s2))\n", "\n", " self.play(\n", " s1.animate.stretch_to_fit_height(3.5),\n", " s2.animate.set_height(3.5),\n", " )" ] }, { "cell_type": "markdown", "id": "5e5ac98b", "metadata": {}, "source": [ "### Vyhledávání [5b]" ] }, { "cell_type": "code", "execution_count": null, "id": "cdcf26cc", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm Search\n", "\n", "\n", "class Search(Scene):\n", " def construct(self):\n", " pass" ] }, { "cell_type": "code", "execution_count": null, "id": "9f62d7a5", "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING -qm ArrowExample\n", "\n", "\n", "class ArrowExample(Scene):\n", " def construct(self):\n", " a1 = Arrow(start=UP, end=DOWN).shift(LEFT * 2)\n", " a2 = Arrow(start=DOWN, end=UP).shift(RIGHT * 2)\n", "\n", " self.play(Write(a1), Write(a2))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.9" } }, "nbformat": 4, "nbformat_minor": 5 }