manim边做边学--参数化曲线
<p>在数学可视化领域,参数方程提供了一种灵活描述曲线的方式。</p><p><code>Manim</code>库中的<code>ParametricFunction</code>类正是为此而生,它允许用户通过参数方程创建各种复杂的二维和三维曲线。</p>
<p><code>ParametricFunction</code>的核心作用是将数学参数方程转换为可视化的曲线。与普通函数不同,参数方程使用独立参数<code>t</code>表示曲线上点的坐标:</p>
<pre><code class="language-python">x = f(t)
y = g(t)
z = h(t)
</code></pre>
<p>其<strong>典型应用场景</strong>包括:</p>
<ul>
<li>绘制无法用$ y=f(x) $显式表示的曲线(如<strong>圆</strong>、<strong>椭圆</strong>)</li>
<li>创建随时间变化的<strong>动态轨迹</strong></li>
<li>可视化三维空间曲线(如<strong>螺旋线</strong>)</li>
<li>实现复杂的几何图案(如<strong>心形线</strong>、<strong>星形线</strong>)</li>
</ul>
<p>本文将详细介绍<code>ParametricFunction</code>的作用、主要参数和方法,并通过动画示例来展示其强大的功能。</p>
<h1 id="1-主要参数">1. 主要参数</h1>
<p><code>ParametricFunction</code>主要参数有:</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>function</code></td>
<td>Callable</td>
<td>参数方程函数,接收t返回</td>
<td>必填</td>
</tr>
<tr>
<td><code>t_range</code></td>
<td>Sequence</td>
<td>参数范围</td>
<td></td>
</tr>
<tr>
<td><code>dt</code></td>
<td>float</td>
<td>计算导数的微小增量</td>
<td>0.01</td>
</tr>
<tr>
<td><code>use_smoothing</code></td>
<td>bool</td>
<td>是否使用平滑算法</td>
<td>True</td>
</tr>
<tr>
<td><code>discontinuities</code></td>
<td>list</td>
<td>函数不连续点列表</td>
<td>None</td>
</tr>
<tr>
<td><code>color</code></td>
<td>颜色常量</td>
<td>曲线颜色</td>
<td>WHITE</td>
</tr>
<tr>
<td><code>stroke_width</code></td>
<td>float</td>
<td>线宽</td>
<td>2.0</td>
</tr>
</tbody>
</table>
<p>其中<code>function</code>参数是一个可调用的函数,形式为<code>(lambda t: (x(t), y(t), z(t)))</code>。</p>
<p>它定义了曲线的参数化形式,<code>t</code>是参数,<code>x(t)</code>、<code>y(t)</code>和<code>z(t)</code>分别是<code>x</code>、<code>y</code>和<code>z</code>坐标随参数<code>t</code>的变化函数。</p>
<h1 id="2-主要方法">2. 主要方法</h1>
<p><code>ParametricFunction</code>主要方法包括:</p>
<table>
<thead>
<tr>
<th><strong>名称</strong></th>
<th><strong>说明</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>get_point_from_function</td>
<td>获取参数t对应的曲线点坐标</td>
</tr>
<tr>
<td>get_function</td>
<td>返回参数方程函数</td>
</tr>
<tr>
<td>get_t_range</td>
<td>返回参数范围</td>
</tr>
</tbody>
</table>
<h1 id="3-使用示例">3. 使用示例</h1>
<p>下面通过几个典型的例子来演示如何使用<code>ParametricFunction</code>类。</p>
<h2 id="31-三维螺旋线">3.1. 三维螺旋线</h2>
<p>这个示例通过引入<strong>z轴</strong>参数,我们创建了一个优美的三维螺旋结构,展示<code>ParametricFunction</code>处理3D曲线的能力。</p>
<pre><code class="language-python">self.set_camera_orientation(phi=80 * DEGREES, theta=-60 * DEGREES)
curve = ParametricFunction(
lambda u: (1.2 * np.cos(u), 1.2 * np.sin(u), u * 0.05),
color=RED,
t_range=(-3 * TAU, 5 * TAU, 0.01),
).set_shade_in_3d(True)
axes = ThreeDAxes(x_length=6, y_length=5, z_length=4)
self.add(axes, curve)
self.play(Create(curve))
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202506/83005-20250604090821286-1782637779.gif" alt="" loading="lazy"></p>
<h2 id="32-处理不连续函数">3.2. 处理不连续函数</h2>
<p>这个示例展示了如何处理不连续函数。</p>
<p>通过指定<code>discontinuities</code>参数,可以正确地绘制不连续函数的图形,这对于展示数学函数的不连续点非常有用。</p>
<pre><code class="language-python"># 定义不连续函数
def discontinuous_func(t):
if t in [-2, 2]:
return (t, 0, 0)# 在不连续点返回一个默认值
return (t, (t**2 - 2) / (t**2 - 4), 0)
# 创建 ParametricFunction 对象
func = (
ParametricFunction(
discontinuous_func,
t_range=(-3, 3),
discontinuities=[-2, 2],# 指定不连续点
dt=0.1,# 不连续点的容差
color=GREEN,
)
.scale(0.5)
.shift(DOWN)
)
# 添加到场景中
self.play(Create(func))
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202506/83005-20250604090821262-1752595813.gif" alt="" loading="lazy"></p>
<h2 id="33-跳动的心形线">3.3. 跳动的心形线</h2>
<p>这个浪漫的示例展示了如何创建复杂的心形图案,并通过缩放动画赋予其<strong>"跳动"</strong>效果。</p>
<pre><code class="language-python"># 心形线参数方程
heart = (
ParametricFunction(
lambda t: np.array(
[
16 * np.sin(t) ** 3,
13 * np.cos(t)
- 5 * np.cos(2 * t)
- 2 * np.cos(3 * t)
- np.cos(4 * t),
0,
]
),
t_range=,
color=PINK,
)
.scale(0.1)
.shift(UP * 2)
)
self.play(Create(heart, run_time=2))
self.play(heart.animate.scale(1.2), rate_func=there_and_back)
self.play(heart.animate.scale(1.5), rate_func=there_and_back)
self.play(heart.animate.scale(1.2), rate_func=there_and_back)
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202506/83005-20250604090821300-1337103269.gif" alt="" loading="lazy"></p>
<h1 id="4-附件">4. 附件</h1>
<p>文中的代码只是关键部分的截取,完整的代码共享在网盘中(<code>parametric_function.py</code>),</p>
<p>下载地址: 完整代码 (访问密码: 6872)</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/18909497
頁:
[1]