473 lines
13 KiB
Text
473 lines
13 KiB
Text
|
{
|
||
|
"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
|
||
|
}
|