🎞️ Как с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python Π΄Π΅Π»Π°Ρ‚ΡŒ красивыС матСматичСскиС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π²Ρ‹ΠΊΠΈ Python, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ красивыС матСматичСскиС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π² Π΄ΡƒΡ…Π΅ YouTube-ΠΊΠ°Π½Π°Π»Π° 3Blue1Brown.

3Blue1Brown – популярный матСматичСский YouTube-ΠΊΠ°Π½Π°Π» Π“Ρ€Π°Π½Ρ‚Π° БандСрсона. ΠœΡ‹ ΠΈ сами любим 3Blue1Brown Π·Π° ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ объяснСния ΠΈ классныС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° конспСкты ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠΈ ΠΏΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Π΅, матСматичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ ΠΈ наглядному ввСдСнию Π² нСйросСти. НиТС прСдставлСн Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСнный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π₯ΡƒΠ΅Π½ Π’Ρ€Π°Π½ ΠΎ создании ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python.

***

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ ΠΈΠ· Π½Π°ΡƒΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π° своим Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰Π°ΠΌ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΈΠ»ΠΈ подписчикам. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π°Π²Ρ‚ΠΎΡ€ ΠΊΠ°Π½Π°Π»Π° собрал ΠΏΠ°ΠΊΠ΅Ρ‚ manim (сокр. mathematical animation), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ матСматичСскиС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ построСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ manim

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° стала довольно популярной: ΠΎΡ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ вСрсии, созданной Π“Ρ€Π°Π½Ρ‚ΠΎΠΌ, сообщСством Manim Π±Ρ‹Π» сдСлан Ρ„ΠΎΡ€ΠΊ. Π­Ρ‚Π° вСрсия обновляСтся Ρ‡Π°Ρ‰Π΅ ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ тСстируСтся, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘. ВСрсия Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для Python 3.6+ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ установки Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ всё ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ:

pip install manim

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊ созданию Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ

Анимация растущСго ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

НачнСм с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… ΠΈΠ· Ρ†Π΅Π½Ρ‚Ρ€Π° экрана. Код для создания Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° construct Π² классС, наслСдованном ΠΎΡ‚ Scene.

start.py
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. Запустив Π΅Π³ΠΎ, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ двиТСния ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° использовались ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ:

  • -p: воспроизвСсти Π²ΠΈΠ΄Π΅ΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ сгСнСрировано.
  • -ql: ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²ΠΈΠ΄Π΅ΠΎ Π² Π½ΠΈΠ·ΠΊΠΎΠΌ качСствС (мСньший Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°). Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² высоком качСствС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ -qh.

Π§Ρ‚ΠΎΠ±Ρ‹ вмСсто Π²ΠΈΠ΄Π΅ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΈΡ„ΠΊΡƒ, добавляСм -i, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

$ manim -p -ql -i start.py PointMovingOnShapes

ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ интСрСсно. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠΌ Π΅Π³ΠΎ Π² ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ.

Врансформация Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
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.

ИзмСняСм Ρ„ΠΎΠ½ с Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Π½Π° сСрый
from manim import * 

config.background_color = DARK_GRAY

Π”Ρ€ΡƒΠ³ΠΈΠ΅ возмоТности кастомизации описаны здСсь.

Π”Π΅Π»Π°Π΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π°ΠΌΠΊΡƒ для частСй уравнСния

ПодвиТная Ρ€Π°ΠΌΠΊΠ° для выдСлСния частСй Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹
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()

МоТно ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ пошагово Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅:

ПошаговоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅
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.

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 ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ².

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
Анимация осСй статичного Π³Ρ€Π°Ρ„ΠΈΠΊΠ°

БовмСстноС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… вмСстС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ VGroup.

Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π³Ρ€ΡƒΠΏΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
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:

Врассировка двиТСния Ρ„ΠΈΠ³ΡƒΡ€Ρ‹
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, тСстированиС ΠΊΠΎΠ΄Π° ΠΈ Π΄Π°ΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ процСсс обучСния стал Π±ΠΎΠ»Π΅Π΅ интСрСсным ΠΈ ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½Ρ‹ΠΌ, студСнты ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΎΡ‚ нас ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь. ΠšΡƒΡ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΠΈ курса отвСтят Π½Π° всС вопросы ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΈ практичСских занятий.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
08 октября 2017

13 рСсурсов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ

Π‘Ρ€Π΅Π΄ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ споры ΠΎ Ρ‚ΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Π΅...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...