三角函数
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)