动画实践:弧形变换求阴影面积
大家好!【Manim数学动画基础】系列课程又更新了一节!
这次通过一个具体的案例(弧形变换求阴影面积),来深入浅出地讲解如何使用Manim,将一个看似复杂的几何问题,通过动画一步步拆解、变换,最终呈现出清晰的解题思路。
一、题目与动画构思
本案例源自一道经典的几何题:已知大圆直径(例如 AB=8),求内部复杂弧形构成的阴影部分面积。

我们的动画设计分为以下几个核心阶段:
- 构建基本形状:绘制大圆、互相垂直的直径以及基础半圆弧。
- 移动水滴形状:将复杂的阴影部分拆解,通过动画展示其构成。
- 图形变换:核心难点,通过旋转和平移,将分散的弧形拼接成规则图形(如小圆),从而直观得出面积公式。
二、核心实现步骤
主要分为 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 的核心技术:
- 基础图形组件:
Circle:绘制圆形。Line:绘制直线(如直径)。ArcBetweenPoints:重点,用于绘制连接两点的圆弧,非常适合处理几何题中的半圆结构。
- 高级图形定制:
VMobject:向量图形对象,是所有 Manim 图形的基类,用于自定义形状。set_points()/get_points():直接操作图形的顶点数据,实现异构图形的拼接。VGroup:将多个对象组合成一个组,方便统一管理动画。
- 动画与文本:
TransformFromCopy:从一个对象复制并变换到另一个对象,适合展示图形演变。MathTex&Text:混排数学公式与普通文本,展示题目和解题过程。ReplacementTransform:平滑替换对象,常用于公式推导的最终结果显示。
四、效果预览
通过上述代码,我们最终实现了一个完整的动画流程:
- 动态绘制出复杂的几何图形。
- 高亮显示阴影部分。
- 通过旋转和平移动画,将阴影部分重组为易于计算的圆形。
- 最后动态显示计算公式与结果(如 $ 8\pi $)。

这种可视化方式不仅让解题过程一目了然,也极大地提升了数学学习的趣味性。
五、结语
本文仅展示了使用 Manim 制作数学动画的部分核心逻辑与代码片段。
如果希望进一步交流,欢迎添加微信。


浙公网安备 33010602011771号