Zdrojové kódy k příkladům a úlohám 34. série KSP (Manim).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

473 lines
13 KiB

2 years ago
{
"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
}