Đường Cycloid

SÁNG TẠO VIDEO VỚI MANIM https://www.facebook.com/groups/manimce
mail@pastecode.io avatar
unknown
python
3 years ago
4.5 kB
77
Indexable
Never
from typing_extensions import runtime
from manim import *
import math

class Move0(Scene):
    def construct(self):
        # Định nghĩa phương trình tham số đường Cycloid
        def cycloid(R,start,end):
            func = lambda t: np.array([R*(t-math.sin(t)),R*(1-math.cos(t)), 0])
            graph = ParametricFunction(
            func,
            t_range = np.array([start,end]),
            color=PURPLE)
            return graph
        # tạo đường Cycloid
        cyc = cycloid(1,-2*PI,2*PI)
        # Dịch chuyển phía dưới 1 đơn vị
        cyc.shift(DOWN)
        # text
        text=Text('Đường Cycloid',gradient=(BLUE, GREEN),font='Helvetica Neue',weight='ULTRALIGHT')
        # scale text
        text.scale(0.85)
        # Đưa text lên cạnh trên màn hình
        text.to_edge(UP,buff=1)
        # Xuất text ra màn hình
        self.play(FadeIn(text,scale=3))
        # Đợi 1 giây
        self.wait()
        # tạo biến hệ số scale để tùy chỉnh
        num_scale=1
        # tạo đường tròn
        cir=Circle().scale(num_scale)
        # gán màu cho đường tròn
        cir.set_color(BLUE)
        # Tạo biến chạy theta
        theta = ValueTracker(-2 * PI)
        # Tạo đường nối tâm và bán kính
        rad=Line(ORIGIN,num_scale*DOWN).rotate_about_origin(-theta.get_value())
        # Tạo Dot trên đường tròn
        dot=Dot().move_to(rad.get_end())
        # Đặt nhóm cho cir,dot,rad
        rolling_circle = VGroup(cir,dot,rad)
        # Thêm một text khác
        text1=Text('Cho một đường tròn và một điểm cố định nằm trên nó',gradient=(BLUE, GREEN),font='Helvetica Neue',weight='ULTRALIGHT')
        # Xuất đường tròn ra màn hình
        self.play(Create(cir))
        text1.scale(0.85)
        text1.to_edge(DOWN,buff=1)
        # Xuất text1 và dot ra màn hình
        self.play(FadeIn(text1,shift=UP))
        self.play(FadeIn(dot,scale=2))
        self.wait(2)
        # Xóa text1 khỏi màn hình
        self.play(FadeOut(text1,shift=DOWN))
        # thêm 1 text khác
        text1=Text('Đặt đường tròn trên một trục nằm ngang',gradient=(BLUE, GREEN),font='Helvetica Neue',weight='ULTRALIGHT')
        text1.scale(0.85)
        text1.to_edge(DOWN,buff=1)
        self.play(FadeIn(text1,shift=UP))
        # Tạo 1 đường thẳng nối từ mép trái đến mép phải màn hình
        line=Line(config.frame_width*LEFT/2,config.frame_width*RIGHT/2).shift(num_scale*DOWN)
        self.wait(2)
        # Di chuyển rolling_circle sang bên phải theta.get_value() * RIGHT đơn vị
        self.play(rolling_circle.animate.shift(theta.get_value() * RIGHT))
        # Đổi hướng đường thẳng từ phải sang trái (để làm hiệu ứng!)
        self.play(Create(line.reverse_direction()),runtime=2)
        self.wait()
        self.play(FadeOut(text1,shift=DOWN))
        # text1 kiểu VGroup cho đẹp!
        text1 = VGroup(
            Text('Cho đường tròn lăn trên trục',gradient=(BLUE, GREEN),font='Helvetica Neue',weight='ULTRALIGHT'),
            Text('Quỹ tích điểm đã cho ban đầu là đường Cycloid',gradient=(BLUE, GREEN),font='Helvetica Neue',weight='ULTRALIGHT')
            ).scale(0.85).arrange(direction = DOWN, buff = 0.125)
        text1.to_edge(DOWN,buff=1)
        self.play(FadeIn(text1,shift=UP))
        self.wait(2)
        # Thao tác nâng cao, tạo phương thức add_update
        def cupd(obj):
            ncirc = Circle().scale(num_scale).set_color(BLUE)
            nline = Line(ORIGIN,num_scale*DOWN).rotate_about_origin(-theta.get_value())
            ndot = Dot().move_to(nline.get_end())
            n_grp = VGroup(ncirc, nline, ndot)
            n_grp.shift(theta.get_value()* RIGHT)
            obj.become(n_grp)
        # Gán phương thức updater cho rolling_circle
        rolling_circle.add_updater(cupd)
        self.add(rolling_circle)
        self.play(
            AnimationGroup(
            theta.animate(run_time=10).increment_value(4 * PI),
            Create(cyc,run_time=10),
            lag_ratio=0
            )
        )
        self.wait(2)
        # remove phương thức updater
        rolling_circle.remove_updater(cupd)
        # Tạo hiệu ứng xóa toàn bộ màn hình
        picture= Group(*self.mobjects)
        self.play(FadeOut(picture,shift=3*LEFT,scale=3),run_time=1)