动画实践:弧形变换求阴影面积
<p>大家好!【Manim数学动画基础】系列课程又更新了一节!</p><p>这次通过一个具体的案例(弧形变换求阴影面积),来深入浅出地讲解如何使用<code>Manim</code>,将一个看似复杂的几何问题,通过动画一步步拆解、变换,最终呈现出清晰的解题思路。</p>
<h1 id="一题目与动画构思">一、题目与动画构思</h1>
<p>本案例源自一道经典的几何题:已知大圆直径(例如 AB=8),求内部复杂弧形构成的阴影部分面积。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202603/83005-20260331122823055-665122243.png" alt="" loading="lazy"></p>
<p>我们的动画设计分为以下几个核心阶段:</p>
<ol>
<li><strong>构建基本形状</strong>:绘制大圆、互相垂直的直径以及基础半圆弧。</li>
<li><strong>移动水滴形状</strong>:将复杂的阴影部分拆解,通过动画展示其构成。</li>
<li><strong>图形变换</strong>:核心难点,通过旋转和平移,将分散的弧形拼接成规则图形(如小圆),从而直观得出面积公式。</li>
</ol>
<h1 id="二核心实现步骤">二、核心实现步骤</h1>
<p>主要分为 <code>step01</code>(图形绘制与题目展示)和 <code>step02</code>(动画变换与求解)两步。</p>
<h2 id="1-绘制基础几何图形">1. 绘制基础几何图形</h2>
<p>我们需要绘制大圆、直径以及多个不同颜色的半圆弧。Manim 提供了丰富的基础图形类,但绘制两点之间的特定圆弧需要用到 <code>ArcBetweenPoints</code>。</p>
<pre><code class="language-python"># 关键代码片段:绘制两点之间的半圆弧
# 以 OA 为直径绘制半圆弧,圆心为 OA 中点 E
self.semicircle_oa = ArcBetweenPoints(
points["O"], points["A"], radius=1, color=YELLOW, stroke_width=2
)
</code></pre>
<h2 id="2-构建自定义填充形状难点">2. 构建自定义填充形状(难点)</h2>
<p>题目中的“水滴形”或特定阴影区域并非 <code>Manim</code> 的标准图形。我们需要利用 <code>VMobject</code> 向量图形对象,通过拼接多个圆弧的点数组来自定义形状。</p>
<p>这里用到了 <code>NumPy</code> 来合并点集,并使用 <code>set_points</code> 方法设置形状轮廓:</p>
<pre><code class="language-python"># 关键代码片段:自定义 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) # 设置填充颜色和透明度
</code></pre>
<h2 id="3-动画变换逻辑">3. 动画变换逻辑</h2>
<p>为了展示面积的计算原理,我们需要将阴影部分通过动画变换为规则图形。代码中使用了 <code>Rotate</code>(旋转)和 <code>shift</code>(平移)来模拟几何中的割补过程。</p>
<pre><code class="language-python"># 关键代码片段:动画变换展示
# 旋转某个部分
self.play(Rotate(vm_c, angle=-PI / 2, about_point=points["O"]))
# 平移拼接
self.play(vm_c.animate.shift(LEFT * 2))
</code></pre>
<h1 id="三重点-manim-技术点解析">三、重点 Manim 技术点解析</h1>
<p>通过这个项目,我们可以掌握以下 <code>Manim</code> 的核心技术:</p>
<ol>
<li>基础图形组件:
<ul>
<li><code>Circle</code>:绘制圆形。</li>
<li><code>Line</code>:绘制直线(如直径)。</li>
<li><code>ArcBetweenPoints</code>:重点,用于绘制连接两点的圆弧,非常适合处理几何题中的半圆结构。</li>
</ul>
</li>
<li>高级图形定制:
<ul>
<li><code>VMobject</code>:向量图形对象,是所有 Manim 图形的基类,用于自定义形状。</li>
<li><code>set_points()</code> / <code>get_points()</code>:直接操作图形的顶点数据,实现异构图形的拼接。</li>
<li><code>VGroup</code>:将多个对象组合成一个组,方便统一管理动画。</li>
</ul>
</li>
<li>动画与文本:
<ul>
<li><code>TransformFromCopy</code>:从一个对象复制并变换到另一个对象,适合展示图形演变。</li>
<li><code>MathTex</code> & <code>Text</code>:混排数学公式与普通文本,展示题目和解题过程。</li>
<li><code>ReplacementTransform</code>:平滑替换对象,常用于公式推导的最终结果显示。</li>
</ul>
</li>
</ol>
<h2 id="四效果预览">四、效果预览</h2>
<p>通过上述代码,我们最终实现了一个完整的动画流程:</p>
<ol>
<li>动态绘制出复杂的几何图形。</li>
<li>高亮显示阴影部分。</li>
<li>通过旋转和平移动画,将阴影部分重组为易于计算的圆形。</li>
<li>最后动态显示计算公式与结果(如 $ 8\pi $)。</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/83005/202603/83005-20260331122823186-2068498442.gif" alt="" loading="lazy"></p>
<p>这种可视化方式不仅让解题过程一目了然,也极大地提升了数学学习的趣味性。</p>
<h2 id="五结语">五、结语</h2>
<p>本文仅展示了使用 Manim 制作数学动画的部分核心逻辑与代码片段。<br>
如果希望进一步交流,欢迎添加微信。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202603/83005-20260331122823045-1414970206.jpg" alt="" width="200" height="200" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/19800683
頁:
[1]