3Blue1Brown β ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ YouTube-ΠΊΠ°Π½Π°Π» ΠΡΠ°Π½ΡΠ° Π‘Π°Π½Π΄Π΅ΡΡΠΎΠ½Π°. ΠΡ ΠΈ ΡΠ°ΠΌΠΈ Π»ΡΠ±ΠΈΠΌ 3Blue1Brown Π·Π° ΠΎΡΠ»ΠΈΡΠ½ΡΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΡ ΠΈ ΠΊΠ»Π°ΡΡΠ½ΡΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° ΠΊΠΎΠ½ΡΠΏΠ΅ΠΊΡΡ ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΠ΄Π±ΠΎΡΠΊΠΈ ΠΏΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΠ΅, ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ Π°Π½Π°Π»ΠΈΠ·Ρ ΠΈ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΠΌΡ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ Π² Π½Π΅ΠΉΡΠΎΡΠ΅ΡΠΈ. ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ Π₯ΡΠ΅Π½ Π’ΡΠ°Π½ ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Python.
ΠΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ ΠΈΠ΄Π΅ΠΈ ΠΈΠ· Π½Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡΠ° ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ²Π°ΡΠΈΡΠ°ΠΌ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°ΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°ΠΌ. Π ΡΡΠ°ΡΡΡΡ, Π°Π²ΡΠΎΡ ΠΊΠ°Π½Π°Π»Π° ΡΠΎΠ±ΡΠ°Π» ΠΏΠ°ΠΊΠ΅Ρ manim (ΡΠΎΠΊΡ. mathematical animation), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Python.
![ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ manim](https://media.proglib.io/posts/2021/04/14/d7ff452617a6eec3bb1c70fcfbe0ab07.gif)
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΡΠ°Π»Π° Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠΉ: ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΠΡΠ°Π½ΡΠΎΠΌ, ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΠΌ Manim Π±ΡΠ» ΡΠ΄Π΅Π»Π°Π½ ΡΠΎΡΠΊ. ΠΡΠ° Π²Π΅ΡΡΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΠ΅ ΠΈ Π»ΡΡΡΠ΅ ΡΠ΅ΡΡΠΈΡΡΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Ρ. ΠΠ΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ Python 3.6+ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. Π ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΌ Π²ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ:
pip install manim
ΠΡΠΈΡΡΡΠΏΠΈΠΌ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ
ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ ΡΠ°ΡΡΡΡΠ΅Π³ΠΎ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ°
ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ°, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ Π² ΡΠ°Π·ΠΌΠ΅ΡΠ°Ρ
ΠΈΠ· ΡΠ΅Π½ΡΡΠ° ΡΠΊΡΠ°Π½Π°. ΠΠΎΠ΄ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° construct
Π² ΠΊΠ»Π°ΡΡΠ΅, Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΎΡ Scene
.
from manim import *
class PointMovingOnShapes(Scene):
def construct(self):
square = Square(color=BLUE) # CΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ²Π°Π΄ΡΠ°Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ°
square.flip(RIGHT)
square.rotate(-3 * TAU / 8) # ΠΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠ²Π°Π΄ΡΠ°Ρ Π½Π° -3/8 * 2*PI
# ΠΡΠΎΠΈΠ³ΡΡΠ²Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ
self.play(GrowFromCenter(square))
Π‘ΠΎΡ
ΡΠ°Π½ΠΈΠΌ ΡΠΊΡΠΈΠΏΡ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ start.py
ΠΈ Π·Π°ΠΏΡΡΡΠΈΠΌ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΡΠΎΠ±Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ:
$ manim -p -ql start.py PointMovingOnShapes
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠΊΡΠΈΠΏΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ PointMovingOnShapes.mp4
. ΠΠ°ΠΏΡΡΡΠΈΠ² Π΅Π³ΠΎ, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.
![Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ°](https://media.proglib.io/posts/2021/04/14/c3ae831072147eb2a784d465f6282a48.gif)
Π ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π΄Π»Ρ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ:
-p
: Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ.-ql
: ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π²ΠΈΠ΄Π΅ΠΎ Π² Π½ΠΈΠ·ΠΊΠΎΠΌ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ (ΠΌΠ΅Π½ΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π°). ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π² Π²ΡΡΠΎΠΊΠΎΠΌ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ-qh
.
Π§ΡΠΎΠ±Ρ Π²ΠΌΠ΅ΡΡΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π³ΠΈΡΠΊΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ -i
, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
$ manim -p -ql -i start.py PointMovingOnShapes
ΠΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΊΠ²Π°Π΄ΡΠ°Ρ Π² ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ° Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ. ΠΡΠ΅Π²ΡΠ°ΡΠΈΠΌ Π΅Π³ΠΎ Π² ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ.
![Π’ΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΈΠ³ΡΡΡ](https://media.proglib.io/posts/2021/04/14/b46f6130871306295c1157d9717cd72c.gif)
from manim import *
class PointMovingOnShapes(Scene):
def construct(self):
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ²Π°Π΄ΡΠ°Ρ
square = Square(color=BLUE)
square.flip(RIGHT)
square.rotate(-3 * TAU / 8)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ
circle = Circle()
circle.set_fill(PINK, opacity=0.5) # ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ²Π΅Ρ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡ
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
self.play(GrowFromCenter(square))
self.play(Transform(square, circle)) # ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΊΠ²Π°Π΄ΡΠ°Ρ Π² ΠΊΡΡΠ³
self.wait() # ΠΆΠ΄Π΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° Π½Π΅ ΡΡΠ°Π·Ρ ΠΈΡΡΠ΅Π·Π°Π»Π°
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠ³ΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠΎΠ½
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΠ½ ΠΈΠΌΠ΅Π» Π΄ΡΡΠ³ΠΎΠΉ ΡΠ²Π΅Ρ, Π·Π°Π΄Π°Π΅ΠΌ config.background_color
.
![ΠΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠΎΠ½ Ρ ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π½Π° ΡΠ΅ΡΡΠΉ](https://media.proglib.io/posts/2021/04/14/e496c59e5ef549dc432abfa5856bc742.gif)
from manim import *
config.background_color = DARK_GRAY
ΠΡΡΠ³ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠ°ΡΡΠΎΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π·Π΄Π΅ΡΡ.
ΠΠ΅Π»Π°Π΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ ΡΠ°ΠΌΠΊΡ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΠΉ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
![ΠΠΎΠ΄Π²ΠΈΠΆΠ½Π°Ρ ΡΠ°ΠΌΠΊΠ° Π΄Π»Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°ΡΡΠ΅ΠΉ ΡΠΎΡΠΌΡΠ»Ρ](https://media.proglib.io/posts/2021/04/14/1ec14dc41d7dc16d61b773a0c3da97ec.gif)
class MovingFrame(Scene):
def construct(self):
# ΠΠΈΡΠ΅ΠΌ ΡΠΎΡΠΌΡΠ»Ρ
equation = MathTex("2x^2-5x+2", "=", "(x-2)(2x-1)")
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ
self.play(Write(equation))
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ°ΠΌΠΊΡ
framebox1 = SurroundingRectangle(equation[0], buff=.1)
framebox2 = SurroundingRectangle(equation[2], buff=.1)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
self.play(Create(framebox1)) # ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°ΠΌΠΊΡ
self.wait()
# replace frame 1 with frame 2
self.play(ReplacementTransform(framebox1, framebox2))
self.wait()
ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎ ΡΠ΅ΡΠΈΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅:
![ΠΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅](https://media.proglib.io/posts/2021/04/14/5650c330a0e918d57c6d70212630fa15.gif)
class MathematicalEquation(Scene):
def construct(self):
# ΠΠΈΡΠ΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
equation1 = MathTex("2x^2-5x+2")
eq_sign_1 = MathTex("=")
equation2 = MathTex("2x^2-4x-x+2")
eq_sign_2 = MathTex("=")
equation3 = MathTex("(x-2)(2x-1)")
# Π Π°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π½Π°ΠΊ ΠΏΠΎ ΡΠ²ΠΎΠΈΠΌ ΠΌΠ΅ΡΡΠ°ΠΌ
equation1.next_to(eq_sign_1, LEFT)
equation2.next_to(eq_sign_1, RIGHT)
eq_sign_2.shift(DOWN)
equation3.shift(DOWN)
# ΠΠΡΡΠ°Π²Π½Π΅ΠΈΠ²Π°Π΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΏΠΎ Π·Π½Π°ΠΊΡ ΡΠ°Π²Π΅Π½ΡΡΠ²Π°
eq_sign_2.align_to(eq_sign_1, LEFT)
equation3.align_to(equation2, LEFT)
# ΠΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
eq_group = VGroup(equation1, eq_sign_1, equation2, eq_sign_2, equation3)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ
self.play(Write(eq_group))
self.wait()
ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌ ΡΠΎΡΠΌΡΠ»Ρ
ΠΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β«ΠΊΠ°ΠΌΠ΅ΡΡΒ» ΠΈ ΠΎΠ±Π»Π°ΡΡΡ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΠΎΡ MovingCameraScene
.
![ποΈ ΠΠ°ΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Python Π΄Π΅Π»Π°ΡΡ ΠΊΡΠ°ΡΠΈΠ²ΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ](https://media.proglib.io/posts/2021/04/14/243e7fccfd8a323014e8ee2ba69698c5.gif)
class MovingAndZoomingCamera(MovingCameraScene):
def construct(self):
# ΠΠΈΡΠ΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
equation = MathTex("2x^2-5x+2", "=", "(x-2)(2x-1)")
self.add(equation)
self.play(self.camera.frame.animate.move_to(equation[0]).set(width=equation[0].width*2))
self.wait(0.3)
self.play(self.camera.frame.animate.move_to(equation[2]).set(width=equation[2].width*2))
Π ΠΈΡΡΠ΅ΠΌ Π³ΡΠ°ΡΠΈΠΊΠΈ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ manim ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ².
![ποΈ ΠΠ°ΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Python Π΄Π΅Π»Π°ΡΡ ΠΊΡΠ°ΡΠΈΠ²ΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ](https://media.proglib.io/posts/2021/04/14/09132abcb6fe6a63502d91c84d1bc1b8.png)
class Graph(GraphScene):
def __init__(self, **kwargs):
GraphScene.__init__(
self,
x_min=-3.5,
x_max=3.5,
y_min=-5,
y_max=5,
graph_origin=ORIGIN,
axes_color=BLUE,
x_labeled_nums=range(-4, 4, 2), # x tickers
y_labeled_nums=range(-5, 5, 2), # y tickers
**kwargs
)
def construct(self):
self.setup_axes(animate=False)
# Π ΠΈΡΡΠ΅ΠΌ Π³ΡΠ°ΡΠΈΠΊΠΈ
func_graph_cube = self.get_graph(lambda x: x**3, RED)
func_graph_ncube = self.get_graph(lambda x: -x**3, GREEN)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠ΅ΡΠΊΠΈ
graph_lab = self.get_graph_label(func_graph_cube, label="x^3")
graph_lab2 = self.get_graph_label(func_graph_ncube, label="-x^3", x_val=-3)
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ
vert_line = self.get_vertical_line_to_graph(1.5, func_graph_cube, color=YELLOW)
label_coord = self.input_to_graph_point(1.5, func_graph_cube)
text = MathTex(r"x=1.5")
text.next_to(label_coord)
self.add(func_graph_cube, func_graph_ncube, graph_lab, graph_lab2, vert_line, text)
self.wait()
ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΊΠ°Π΄ΡΠ° ΡΡΠ΅Π½Ρ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ -s
:
manim -p -qh -s more.py Graph
ΠΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΎΡΠ΅ΠΉ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² animate = True
.
def construct(self):
self.setup_axes(animate=True)
################### ΠΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ###################
manim -p -qh more.py Graph
![ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ ΠΎΡΠ΅ΠΉ ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ³ΠΎ Π³ΡΠ°ΡΠΈΠΊΠ°](https://media.proglib.io/posts/2021/04/14/77581b947682c4c0be137c8a520789eb.gif)
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
Π§ΡΠΎΠ±Ρ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΠΈΡ
Π²ΠΌΠ΅ΡΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ VGroup
.
![ΠΠ²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡΡ
Π³ΡΡΠΏΠΏ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²](https://media.proglib.io/posts/2021/04/14/2a571a3559d26dc537adf142db11f829.gif)
class GroupCircles(Scene):
def construct(self):
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΡΡΠ³ΠΈ
circle_green = Circle(color=GREEN)
circle_blue = Circle(color=BLUE)
circle_red = Circle(color=RED)
# Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ
circle_green.shift(LEFT)
circle_blue.shift(RIGHT)
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ
gr = VGroup(circle_green, circle_red)
gr2 = VGroup(circle_blue)
self.add(gr, gr2) # Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π³ΡΡΠΏΠΏΡ Π½Π° ΡΡΠ΅Π½Ρ
self.wait()
self.play((gr + gr2).animate.shift(DOWN)) # ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΎΠ±Π΅ Π³ΡΡΠΏΠΏΡ Π²Π½ΠΈΠ·
self.play(gr.animate.shift(RIGHT)) # ΡΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΎΠ΄Π½Ρ Π³ΡΡΠΏΠΏΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ
self.play(gr.animate.shift(UP))
self.play((gr + gr2).animate.shift(RIGHT)) # ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ Π²ΠΏΡΠ°Π²ΠΎ
self.play(circle_red.animate.shift(RIGHT))
self.wait()
Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΡΠΈΠ³ΡΡΡ
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»Π΅Π΄Π° Π΄Π²ΠΈΠΆΡΡΠ΅Π³ΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ TracedPath
:
![Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΡΠΈΠ³ΡΡΡ](https://media.proglib.io/posts/2021/04/14/9ea9d2f10d98c86da0e4714b86f43a90.gif)
class TracedPathExample(Scene):
def construct(self):
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ ΠΈ ΡΠΎΡΠΊΡ
circ = Circle(color=BLUE).shift(4*LEFT)
dot = Dot(color=BLUE).move_to(circ.get_start())
# ΠΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ ΡΠΎΡΠΊΡ ΠΈ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ
rolling_circle = VGroup(circ, dot)
trace = TracedPath(circ.get_start)
rolling_circle.add_updater(lambda m: m.rotate(-0.3)) # ΠΡΠ°ΡΠ°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ
self.add(trace, rolling_circle) # add trace and rolling circle to the scene
# Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ½ΠΎΡΡΡ Π½Π° 8 ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ Π²ΠΏΡΠ°Π²ΠΎ
self.play(rolling_circle.animate.shift(8*RIGHT), run_time=4, rate_func=linear)
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌ ΡΡΡΠΎΡΠΈΠ°Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ manim
. ΠΠ· ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ
ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ manim
ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΈ Π²ΠΈΠ΄Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²:
- Mobjects: ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π½Π° ΡΠΊΡΠ°Π½Π΅:
Circle
,Square
,Matrix
,Angle
ΠΈ Ρ. Π΄. - Scenes: ΡΡΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ:
Scene
,MovingCameraScene
ΠΈ Π΄Ρ. - Animations: Π°Π½ΠΈΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΊ
Mobjects
β ΡΠ°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊWrite
,Create
,GrowFromCenter
,Transform
.
ΠΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°ΡΡΠΈΡΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ β Π΄Π΅Π»Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ. ΠΡΡΠ³ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΏΠΎ manim.
Π‘ΠΊΡΠΈΠΏΡΡ ΠΈΠ· ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² GitHub-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
ΠΠ° Python ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΈΡΡΡ ΡΠ΅ΡΡΡ ΠΈ Π±ΡΠΊΠ΅Π½Π΄ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΡΡ Π·Π°Π΄Π°ΡΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΌ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π² Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π±ΠΎΠ»ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ . Π―Π·ΡΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ Π½Π° ΡΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠΎΡΡΠ°ΡΠΈΡΡ Π½Π΅ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π±ΡΡΡΡΠΎ ΠΏΠΎΠ½ΡΡΡ ΠΎΡΠ½ΠΎΠ²Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° Python, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠ½Π»Π°ΠΉΠ½-ΠΊΡΡΡ Β«ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°Β». ΠΠ° 30 ΡΡΠΎΠΊΠΎΠ² (15 ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈ 15 ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π½ΡΡΠΈΠΉ) ΠΏΠΎΠ΄ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠΌ ΠΏΡΠ°ΠΊΡΠΈΠΊΡΡΡΠΈΡ ΡΠΊΡΠΏΠ΅ΡΡΠΎΠ² Π²Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΡΡΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°, Π½ΠΎ ΠΈ ΠΎΡΠ²ΠΎΠΈΡΠ΅ Π΄Π²Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ (PyCharm ΠΈ Jupyter Notebook), ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΡΠΌΠΈ, ΠΏΠ°ΡΡΠΈΠ½Π³ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΠΎΡΠΎΠ² Π΄Π»Ρ Telegram ΠΈ Instagram, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ Π΄Π°ΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½ΡΡ . Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π» Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ ΠΈ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΡΠΌ, ΡΡΡΠ΄Π΅Π½ΡΡ ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΎΡ Π½Π°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ. ΠΡΡΠ°ΡΠΎΡΡ ΠΈ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»ΠΈ ΠΊΡΡΡΠ° ΠΎΡΠ²Π΅ΡΡΡ Π½Π° Π²ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ ΠΏΠΎ ΡΠ΅ΠΌΠ΅ Π»Π΅ΠΊΡΠΈΠΉ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π½ΡΡΠΈΠΉ.
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ