动画实践:弧形变换求阴影面积

大家好!【Manim数学动画基础】系列课程又更新了一节!

这次通过一个具体的案例(弧形变换求阴影面积),来深入浅出地讲解如何使用Manim,将一个看似复杂的几何问题,通过动画一步步拆解、变换,最终呈现出清晰的解题思路。

一、题目与动画构思

本案例源自一道经典的几何题:已知大圆直径(例如 AB=8),求内部复杂弧形构成的阴影部分面积。

我们的动画设计分为以下几个核心阶段:

  1. 构建基本形状:绘制大圆、互相垂直的直径以及基础半圆弧。
  2. 移动水滴形状:将复杂的阴影部分拆解,通过动画展示其构成。
  3. 图形变换:核心难点,通过旋转和平移,将分散的弧形拼接成规则图形(如小圆),从而直观得出面积公式。

二、核心实现步骤

主要分为 step01(图形绘制与题目展示)和 step02(动画变换与求解)两步。

1. 绘制基础几何图形

我们需要绘制大圆、直径以及多个不同颜色的半圆弧。Manim 提供了丰富的基础图形类,但绘制两点之间的特定圆弧需要用到 ArcBetweenPoints

# 关键代码片段:绘制两点之间的半圆弧
# 以 OA 为直径绘制半圆弧,圆心为 OA 中点 E
self.semicircle_oa = ArcBetweenPoints(
    points["O"], points["A"], radius=1, color=YELLOW, stroke_width=2
)

2. 构建自定义填充形状(难点)

题目中的“水滴形”或特定阴影区域并非 Manim 的标准图形。我们需要利用 VMobject 向量图形对象,通过拼接多个圆弧的点数组来自定义形状。

这里用到了 NumPy 来合并点集,并使用 set_points 方法设置形状轮廓:

# 关键代码片段:自定义 VMobject 构建复杂填充形状
t_vm_a = VMobject()
t_vm_a.set_points(
    np.concatenate(
        [
            self.semicircle_ae.get_points(),
            self.semicircle_eo.get_points(),
            self.semicircle_oa.get_points(),
        ]
    )
)
t_vm_a.set_fill(color=YELLOW, opacity=0.5) # 设置填充颜色和透明度

3. 动画变换逻辑

为了展示面积的计算原理,我们需要将阴影部分通过动画变换为规则图形。代码中使用了 Rotate(旋转)和 shift(平移)来模拟几何中的割补过程。

# 关键代码片段:动画变换展示
# 旋转某个部分
self.play(Rotate(vm_c, angle=-PI / 2, about_point=points["O"]))
# 平移拼接
self.play(vm_c.animate.shift(LEFT * 2))

三、重点 Manim 技术点解析

通过这个项目,我们可以掌握以下 Manim 的核心技术:

  1. 基础图形组件:
    • Circle:绘制圆形。
    • Line:绘制直线(如直径)。
    • ArcBetweenPoints:重点,用于绘制连接两点的圆弧,非常适合处理几何题中的半圆结构。
  2. 高级图形定制:
    • VMobject:向量图形对象,是所有 Manim 图形的基类,用于自定义形状。
    • set_points() / get_points():直接操作图形的顶点数据,实现异构图形的拼接。
    • VGroup:将多个对象组合成一个组,方便统一管理动画。
  3. 动画与文本:
    • TransformFromCopy:从一个对象复制并变换到另一个对象,适合展示图形演变。
    • MathTex & Text:混排数学公式与普通文本,展示题目和解题过程。
    • ReplacementTransform:平滑替换对象,常用于公式推导的最终结果显示。

四、效果预览

通过上述代码,我们最终实现了一个完整的动画流程:

  1. 动态绘制出复杂的几何图形。
  2. 高亮显示阴影部分。
  3. 通过旋转和平移动画,将阴影部分重组为易于计算的圆形。
  4. 最后动态显示计算公式与结果(如 $ 8\pi $)。

这种可视化方式不仅让解题过程一目了然,也极大地提升了数学学习的趣味性。

五、结语

本文仅展示了使用 Manim 制作数学动画的部分核心逻辑与代码片段。
如果希望进一步交流,欢迎添加微信。

posted @ 2026-03-31 12:29  wang_yb  阅读(3)  评论(0)    收藏  举报