Skip to content

三角函数

manim实现的六个三角函数。

预览

代码

from manim import *
import numpy as np
import math

class TrigFunctions(Scene):
    def construct(self):
        # 创建坐标轴
        axes = Axes(
            x_range=[-2 * np.pi, 2 * np.pi, np.pi / 2],
            y_range=[-5, 5, 1],
            axis_config={"color": BLUE, "include_ticks": True},
            x_length=10,
            y_length=6,
            tips=True
        )

        # 标记 x 轴刻度
        labels = [
            (-2 * np.pi, r"-2\pi"),
            (-3 * np.pi / 2, r"-\frac{3\pi}{2}"),
            (-np.pi, r"-\pi"),
            (-np.pi / 2, r"-\frac{\pi}{2}"),
            (0, "0"),
            (np.pi / 2, r"\frac{\pi}{2}"),
            (np.pi, r"\pi"),
            (3 * np.pi / 2, r"\frac{3\pi}{2}"),
            (2 * np.pi, r"2\pi")
        ]
        x_labels = VGroup(
            *[MathTex(tex).next_to(axes.c2p(x_val, 0), DOWN * 0.5) for x_val, tex in labels]
        )

        self.play(Create(axes), Write(x_labels))

        # 创建正切和正割的渐近线
        asymptote_positions = np.arange(-3 * np.pi / 2, 3 * np.pi / 2 + np.pi, np.pi)
        asymptotes = VGroup(*[
            DashedLine(
                start=axes.c2p(pos, -5),
                end=axes.c2p(pos, 5),
                color=GRAY
            ) for pos in asymptote_positions
        ])
        self.play(Create(asymptotes))

        # 正弦函数
        sin_graph = axes.plot(lambda x: np.sin(x), color=RED, x_range=[-2 * np.pi, 2 * np.pi])
        sin_label = MathTex("\\sin(x)").next_to(axes.c2p(2 * np.pi, np.sin(2 * np.pi)), UP).set_color(RED)
        self.play(Create(sin_graph), Write(sin_label))
        self.wait(1)
        self.play(FadeOut(sin_graph), FadeOut(sin_label))

        # 余弦函数
        cos_graph = axes.plot(lambda x: np.cos(x), color=GREEN, x_range=[-2 * np.pi, 2 * np.pi])
        cos_label = MathTex("\\cos(x)").next_to(axes.c2p(2 * np.pi, np.cos(2 * np.pi)), DOWN).set_color(GREEN)
        self.play(Create(cos_graph), Write(cos_label))
        self.wait(1)
        self.play(FadeOut(cos_graph), FadeOut(cos_label))

        # 正切函数
        tan_graph = axes.plot(lambda x: np.tan(x), color=YELLOW, x_range=[-np.pi / 2 + 0.3, np.pi / 2 - 0.3])
        tan_label = MathTex("\\tan(x)").next_to(axes.c2p(np.pi / 4, np.tan(np.pi / 4)), RIGHT).set_color(YELLOW)
        self.play(Create(tan_graph), Write(tan_label))
        self.wait(1)
        self.play(FadeOut(tan_graph), FadeOut(tan_label))

        # 余切函数
        cot_graph = axes.plot(lambda x: 1 / np.tan(x), color=ORANGE, x_range=[-np.pi + 0.3, -0.3])
        cot_label = MathTex("\\cot(x)").next_to(axes.c2p(-np.pi / 4, 1 / np.tan(-np.pi / 4)), LEFT).set_color(ORANGE)
        self.play(Create(cot_graph), Write(cot_label))
        self.wait(1)
        self.play(FadeOut(cot_graph), FadeOut(cot_label))

        # 正割函数
        sec_graph = axes.plot(lambda x: 1 / np.cos(x), color=PURPLE, x_range=[-np.pi / 2 + 0.3, np.pi / 2 - 0.3])
        sec_label = MathTex("\\sec(x)").next_to(axes.c2p(np.pi / 3, 1 / np.cos(np.pi / 3)), UP).set_color(PURPLE)
        self.play(Create(sec_graph), Write(sec_label))
        self.wait(1)
        self.play(FadeOut(sec_graph), FadeOut(sec_label))

        # 余割函数
        csc_graph = axes.plot(lambda x: 1 / np.sin(x), color=TEAL, x_range=[-np.pi + 0.3, -0.3])
        csc_label = MathTex("\\csc(x)").next_to(axes.c2p(-np.pi / 3, 1 / np.sin(-np.pi / 3)), DOWN).set_color(TEAL)
        self.play(Create(csc_graph), Write(csc_label))
        self.wait(1)
        self.play(FadeOut(csc_graph), FadeOut(csc_label))

        # 结束动画
        self.play(FadeOut(asymptotes), FadeOut(x_labels), FadeOut(axes))
        self.wait(2)