本动画通过一个可动态调整斜率的直线 ,直观展示斜率 的变化对直线倾斜程度的影响,并同步观察 与 的关系。
动画围绕两个核心概念动态展开:
- 变化率 :通过可移动的两点,实时观察纵坐标变化量与横坐标变化量的比值
动画结构
第一部分:基础建立
第二部分:动态斜率展示
第三部分:两点与变化量可视化
第四部分:斜率变化演示
视觉设计亮点
- 实时更新:斜率数值、两点位置、 和 线段均动态刷新
完整代码
from utils import *
classv5(Scene):
defconstruct(self):
# 定义颜色常量
DX_COLOR = RED
DY_COLOR = PURPLE
# ============ 1. 坐标轴和函数图形 ============
ax, ax_x_label, ax_y_label = axes_func()
self.play(FadeIn(ax, ax_x_label, ax_y_label))
self.wait()
# ============ 2. 绘制直线,斜率随 a 值变动 ============
a = ValueTracker(0.5) # 斜率控制器
fixed_point = (6.5, 5.25) # 直线过定点
deff(x):
return a.get_value() * (x - fixed_point[0]) + fixed_point[1]
gr = always_redraw(lambda: ax.plot(f, x_range=[-1, 13], stroke_width=4, color=GREEN))
gr_label = MathTex("y = ax + b", color=BLUE).to_corner(UL, buff=0.2)
gr_label[0][2].set_color(YELLOW) # 高亮斜率 a
self.play(FadeIn(gr, gr_label))
self.wait()
# ============ 3. 上方显示斜率变化值 ============
t2 = MathTex(r"a = \frac{\Delta y}{\Delta x}").to_edge(UP)
t2[0][0].set_color(YELLOW) # 高亮 a
t2[0][2:4].set_color(DY_COLOR) # Δy 紫色
t2[0][5:7].set_color(DX_COLOR) # Δx 红色
t3_1 = MathTex(r"=").next_to(t2, RIGHT, buff=0.25)
t3_2 = always_redraw(lambda: MathTex(
f"{a.get_value():.1f}").scale(0.9).next_to(t3_1, RIGHT, buff=0.2))
t_sr = SurroundingRectangle(VGroup(t2, t3_2)).set_color(BLACK).set_stroke(
width=0).set_opacity(0.8)
# ============ 4. 动态点与 Δx、Δy 线段 ============
x = ValueTracker(5.5) # 第一个点的 x 坐标
dx = ValueTracker(2) # Δx 的值
dot_1 = always_redraw(lambda: dot_func(ax, f, x.get_value()).set_z_index(6))
dot_2 = always_redraw(lambda: dot_func(ax, f, x.get_value() + dx.get_value()).set_z_index(6))
delta_x_line = always_redraw(lambda: delta_x_line_func(
ax, f, x.get_value(), dx.get_value(), color=DX_COLOR))
delta_x_label = always_redraw(lambda: delta_x_label_func(
ax, f, x.get_value(), dx.get_value(), r"\Delta x", color=DX_COLOR))
delta_y_line = always_redraw(lambda: delta_y_line_func(
ax, f, x.get_value(), dx.get_value(), color=DY_COLOR))
delta_y_label = always_redraw(lambda: delta_y_label_func(
ax, f, x.get_value(), dx.get_value(), r"\Delta y", color=DY_COLOR))
self.play(FadeIn(delta_y_line, delta_x_line, delta_y_label,
delta_x_label, dot_1, dot_2, t_sr, t2))
# ============ 5. 动态展示斜率变化 ============
self.play(FadeIn(t3_1, t3_2))
self.wait(2)
# 斜率从 0.5 变为 2
self.play(a.animate.set_value(2), dx.animate.set_value(1.5), run_time=5)
self.wait(2)
# 斜率从 2 变为 0.2
self.play(a.animate.set_value(0.2), dx.animate.set_value(2.5), run_time=5)
self.wait(2)
# 斜率从 0.2 变为 0
self.play(a.animate.set_value(0), dx.animate.set_value(2.5), run_time=5)
self.wait(2)
# 斜率从 0 变为 -1.5
a.set_value(-0.1)
self.play(a.animate.set_value(-1.5), x.animate.set_value(6),
dx.animate.set_value(2), run_time=5)
self.wait(2)
# 重置斜率为 0.5,点移到最左端
a.set_value(0.5)
x.set_value(-1)
self.wait(2)
# 点从左向右滑动,展示整个函数
self.play(x.animate.set_value(11), run_time=7)
self.wait(2)
self.play(FadeOut(*self.mobjects))
self.wait(2)
%manim -ql -v WARNING v5
文章首发:微信公众号:数与理 | 发布日期: 2026 年 3 月 26 日