manim边做边学--隐函数图像

在数学可视化中,显函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ) y=f(x) </math>y=f(x)相对容易处理,但隐函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> F ( x , y ) = 0 F(x,y)=0 </math>F(x,y)=0的绘制则更具挑战性。

Manim库中的ImplicitFunction类专门用于解决这个问题,它能够高效地绘制各种复杂的隐函数曲线。

ImplicitFunction典型应用场景包括:

  • 高等数学教学:绘制圆锥曲线(椭圆、双曲线)、心形线、双纽线等
  • 工程应用:可视化等值线、等高线、势能面
  • 物理模拟:绘制电场/磁场的等势线、相平面轨迹
  • 计算机图形学:生成特殊曲线和曲面
  • 代数几何:研究代数曲线的性质

今天,我们将深入探讨Manim中的ImplicitFunction类,了解其作用、应用场景以及如何通过实际示例展示其强大功能。

1. 主要参数

ImplicitFunction的主要参数有:

参数 类型 说明
func Callable[[float, float], float] 必需参数,二元函数F(x,y)
x_range Sequence[float] x轴的取值范围,如[-3,3]
y_range Sequence[float] y轴的取值范围,如[-3,3]
color Color 曲线颜色,默认为WHITE
min_distance float 点之间的最小距离(控制曲线精度)
max_quads int 用于渲染的最大四边形数量(性能优化)
use_smoothing bool 是否使用平滑处理(默认True)
delta float 采样步长(影响曲线精度)

func参数是隐式函数的形式,这个函数需要接受两个浮点数 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x和 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y,并返回一个浮点数。

2. 主要方法

ImplicitFunction的主要方法有:

名称 说明
generate_points 初始化points属性,从而定义形状。这个方法在对象创建时被调用
init_points generate_points类似,用于初始化points属性

3. 使用示例

为了更好地理解ImplicitFunction的功能,我们将通过几个示例来展示其在不同场景中的应用。

3.1. 基本隐函数(圆)

这个示例展示最基本的隐函数绘制,通过方程 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 2 + y 2 = 1 x^2+ y^2 = 1 </math>x2+y2=1绘制单位圆。

注意 x_rangey_range的设置需要包含整个曲线。

python 复制代码
# 创建隐函数图像(单位圆)
circle = ImplicitFunction(
    lambda x, y: x**2 + y**2 - 1,
    color=RED,
    x_range=[-1.5, 1.5],
    y_range=[-1.5, 1.5],
)

# 添加标签
label = MathTex("x^2 + y^2 = 1").next_to(circle, DOWN)

# 动画展示
self.play(Create(circle), Write(label))

3.2. 动态参数变化(椭圆)

这个示例使用ValueTrackeralways_redraw实现动态变化的椭圆,展示如何通过改变参数实时更新隐函数图像。

python 复制代码
# 创建参数跟踪器
a = ValueTracker(1)
b = ValueTracker(1)

# 创建动态椭圆
ellipse = always_redraw(
    lambda: ImplicitFunction(
        lambda x, y: (x**2) / (a.get_value() ** 2)
        + (y**2) / (b.get_value() ** 2)
        - 1,
        color=GREEN,
        x_range=[-4, 4],
        y_range=[-3, 3],
    )
)

# 添加参数标签
param_label = always_redraw(
    lambda: MathTex(
        f"\\frac{{x^2}}{{{a.get_value()**2:.1f}}} + \\frac{{y^2}}{{{b.get_value()**2:.1f}}} = 1",
        color=RED,
    )
    .shift(DOWN * 1.5 + RIGHT * 1.8)
    .scale(0.6)
)

self.add(ellipse, param_label)
self.play(a.animate.set_value(2), b.animate.set_value(1.5), run_time=3)
self.play(a.animate.set_value(3), b.animate.set_value(1), run_time=3)

3.3. 复杂曲线(笛卡尔心形线)

这个示例展示复杂隐函数的绘制,绘制了一个心形曲线。

python 复制代码
        # 创建心形线
        heart = ImplicitFunction(
            lambda x, y: (x**2 + y**2 - 1) ** 3 - x**2 * y**3,
            color=PINK,
            x_range=[-1.5, 1.5],
            y_range=[-1.2, 1.8],
        )

        # 添加标签
        label = (
            MathTex("(x^2 + y^2 - 1)^3 = x^2 y^3", color=GREEN)
            .shift(DOWN + RIGHT * 1.8)
            .scale(0.6)
        )

        self.play(Create(heart), Write(label))

4. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(implicit_function.py),

下载地址: 完整代码 (访问密码: 6872)

相关推荐
R-G-B13 分钟前
【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数)
python·opencv·视频加载·摄像头调用·获取视频基本信息·获取视频帧率·获取视频帧数
赵英英俊16 分钟前
Python day46
python·深度学习·机器学习
weixin_307779132 小时前
AWS Lambda解压缩S3 ZIP文件流程
python·算法·云计算·aws
独行soc10 小时前
2025年渗透测试面试题总结-18(题目+回答)
android·python·科技·面试·职场和发展·渗透测试
S01d13r10 小时前
gunicorn + flask 处理高并发请求
python·flask·gunicorn
杜子不疼.10 小时前
《Python列表和元组:从入门到花式操作指南》
开发语言·python
pan0c2310 小时前
数据处理与统计分析 —— numpy入门
python·numpy
max50060011 小时前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
秋氘渔11 小时前
综合案例:Python 函数知识整合 — 学生成绩管理系统
开发语言·python
AI 嗯啦13 小时前
SQL详细语法教程(三)mysql的函数知识
android·开发语言·数据库·python·sql·mysql