拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Manim v0.11.0 版本深度解读:隐函数绘图、set_default 默认值机制与 VMobject 布尔运算实战

Manim v0.11.0 版本深度解读隐函数绘图、set_default 默认值机制与 VMobject 布尔运算实战【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim本篇文章以 Manim Community 版 v0.11.0 的官方更新日志docs/source/changelog/0.11.0-changelog.rst为核心骨架逐一拆解该版本引入的三大高光特性——隐函数曲线绘图ImplicitFunction、关键字参数默认值修改机制Mobject.set_default以及 VMobject 布尔运算并结合当前仓库源码说明实现原理与迁移要点。读完本文你将掌握 v0.11.0 新增 API 的具体用法、破坏性变更的应对方式以及 OpenGL 渲染兼容性的演进脉络。版本概况2021 年 10 月的社区大版本v0.11.0 发布于2021 年 10 月 2 日是该版本周期内的一次大版本迭代。根据更新日志记载31 位贡献者参与提交补丁名字后带的为首次贡献者另有 21 位贡献者参与代码评审本次发布合并了55 个 Pull Request。这一版本的核心方向可以概括为三条主线数学绘图能力的扩展隐函数、面积计算重写、对象系统易用性的提升set_default、布尔运算以及OpenGL 渲染器兼容性的大规模补齐。对于从旧版本升级的用户更新日志特别标注了若干破坏性变更Breaking changes与弃用项Deprecated下文将逐一展开。高光特性一ImplicitFunction 隐函数曲线绘图什么是隐函数曲线与显式函数如y f(x)一个 x 对应一个 y不同隐函数以方程f(x, y) 0的形式定义平面曲线例如单位圆x² y² - 1 0或本版本官方示例中的x·y² - x²·y - 2 0。这类曲线无法直接表示为单一函数图像绘图难度更大。v0.11.0 通过 PR #2094 引入了ImplicitFunction类与对应的坐标系统绘图方法用于绘制满足f(x, y) 0的所有点(x, y)。核心实现自适应四边形剖分在 manim/mobject/graphing/functions.py 中ImplicitFunction继承自VMobject并通过ConvertToOpenGL元类获得 OpenGL 兼容能力。其核心参数如下参数类型默认值说明funcCallable[[float, float], float]必填形如f(x, y) 0的隐函数x_range序列默认取config.frame_width / 2边界x 的最小、最大值y_range序列默认取config.frame_height / 2边界y 的最小、最大值min_depthint5剖分的最小递归深度max_quadsint1500允许使用的最大四边形quad数量use_smoothingboolTrue是否对曲线做平滑处理从源码可见generate_points在p_minx_range/y_range 起点到p_max终点围成的矩形区域内调用plot_isoline把区域递归细分为4^depth个均匀四边形找出每条曲线穿过哪些四边形的边进而提取出等值线点列随后将二维点补齐 z 坐标为 0、通过start_new_path与add_points_as_corners组装成 VMobject 路径最后在use_smoothingTrue时调用make_smooth()平滑曲线。docstring 中特别给出了两条调参经验与当前源码一致min_depth越小落在单个四边形内部、不穿越边界的细小特征可能被忽略max_quads直接决定曲线质量但 quad 数量越多渲染耗时越长。实战绘制一条隐函数曲线更新日志与 manim/mobject/graphing/functions.py 中的示例一致最小用法为from manim import * class ImplicitFunctionExample(Scene): def construct(self): graph ImplicitFunction( lambda x, y: x * y ** 2 - x ** 2 * y - 2, colorYELLOW, ) self.add(NumberPlane(), graph)在坐标系统中绘制plot_implicit_curve除了独立使用ImplicitFunctionv0.11.0 还提供了CoordinateSystem.plot_implicit_curve方法。需要说明的是更新日志中记录的方法名为get_implicit_curve而在当前仓库源码manim/mobject/graphing/coordinate_systems.py中该方法已定型为plot_implicit_curve使用时请以当前源码为准from manim import * class ImplicitExample(Scene): def construct(self): ax Axes() a ax.plot_implicit_curve( lambda x, y: y * (x - y) ** 2 - 4 * x - 8, colorBLUE ) self.add(ax, a)从源码实现看plot_implicit_curve会先通过坐标轴的scaling函数对用户函数做坐标换算再在坐标系统的x_range/y_range范围内构造ImplicitFunction最后对结果做stretch与shift以对齐坐标原点——这意味着它天然支持对数坐标等非线性坐标系统且得到的曲线与Axes的坐标刻度精确对齐。高光特性二Mobject.set_default 修改关键字参数默认值PR #2075 为Mobject引入了set_default类方法它允许开发者在全局范围内修改某个类构造函数的默认关键字参数从而避免在每处实例化时重复传参。实现原理partialmethod 动态重绑以 manim/mobject/mobject.py 的实现为例当传入关键字参数时cls.__init__被替换为partialmethod(cls.__init__, **kwargs)即用functools.partialmethod预填默认值当不带任何参数调用set_default()时cls.__init__恢复为cls._original__init__还原原始默认值。_original__init__的保存依赖__init_subclass__钩子见 manim/animation/animation.py因此Animation类也实现了等价的set_defaultmanim/animation/animation.py可用于统一调整动画的run_time、rate_func等参数。实战修改所有 Square 的颜色沿用 manim/mobject/mobject.py 中的官方示例from manim import Square, GREEN # 设置全局默认所有 Square 默认绿色、25% 填充透明度 Square.set_default(colorGREEN, fill_opacity0.25) s Square() print(s.color, s.fill_opacity) # ManimColor(#83C167), 0.25 # 不带参数调用则恢复原始默认值 Square.set_default() s Square() print(s.color, s.fill_opacity) # ManimColor(#FFFFFF), 0.0在动画上的用法同样直观from manim import * class ChangeDefaultAnimation(Scene): def construct(self): Rotate.set_default(run_time2, rate_funcrate_functions.linear) Indicate.set_default(colorNone) S Square(colorBLUE, fill_colorBLUE, fill_opacity0.25) self.add(S) self.play(Rotate(S, PI)) self.play(Indicate(S)) # 用完记得还原 Rotate.set_default() Indicate.set_default()注意事项set_default是全局生效的类级修改容易“泄漏”到其他场景官方文档示例中都会在结束后显式调用无参set_default()还原默认值。若文档示例用tempconfig隔离配置本版本的文档基础设施改动之一见下文建议同样将set_default的还原放在场景内完成。高光特性三VMobject 布尔运算PR #1998 为VMobject带来了布尔运算支持新增Union、Difference、Intersection、Exclusion四个类见 manim/mobject/geometry/boolean_ops.pyUnion并集合并两个图形的全部区域Difference差集从第一个图形中减去第二个图形Intersection交集保留两图形的重叠区域Exclusion异或保留两图形不重叠的区域。典型用法from manim import * class BooleanOpsExample(Scene): def construct(self): c1 Circle(radius1.0, colorBLUE, fill_opacity0.5) c2 Circle(radius1.0, colorGREEN, fill_opacity0.5).shift(RIGHT * 0.5) union Union(c1, c2, colorRED, fill_opacity0.5) self.add(union)结合本版本的set_default特性你可以先统一设置所有布尔结果图形的描边与填充风格再批量生成。此外PR #2016 为 manim/mobject/geometry/boolean_ops.py 增加了 OpenGL 支持因此Union等类在 OpenGL 渲染器下同样可用。Breaking changes升级前必须知道的破坏性变更get_area 重写告别 Riemann 矩形PR #1990 重写了CoordinateSystem.get_area的实现使其不再基于 Riemann 小矩形近似。查看当前源码 manim/mobject/graphing/coordinate_systems.py新的get_area返回一个Polygon其顶点由曲线上的采样点、区间端点以及对应的 x 轴坐标点构成若传入bounded_graph则围出两条曲线之间的区域参数包括graph、x_range、color可传颜色列表形成渐变、opacity默认0.3与bounded_graph当x_range与bounded_graph的范围不匹配时会抛出ValueError。若确实需要旧的 Riemann 矩形效果迁移方案是改用get_riemann_rectanglesmanim/mobject/graphing/coordinate_systems.py并传入较小的dx。该方法参数更丰富dx每个矩形的 x 宽度、input_sample_type取left/right/center决定采样点位置、color渐变、show_signed_area曲线低于 x 轴时反色表示负面积、blend描边色与填充色融合以及bounded_graph两条曲线之间的区域等。ax Axes(y_range[-2, 10]) quadratic ax.plot(lambda x: 0.5 * x ** 2 - 0.5) # 新实现直接得到填充的 Polygon area ax.get_area(quadratic, x_range[-4, 4], color(TEAL, BLUE_B), opacity0.5) # 旧效果迁移用小 dx 的 Riemann 矩形 rects ax.get_riemann_rectangles( quadratic, x_range[-4, 4], dx0.15, colorYELLOW )极坐标角度改用数学惯例PR #2095 修改了cartesian_to_spherical与spherical_to_cartesian的参数命名使其符合数学界常规定义。查看当前实现 manim/utils/space_ops.pycartesian_to_spherical(vec)接收[x, y, z]返回[r, theta, phi]其中theta为方位角xy 平面内相对 x 正轴的夹角phi为极角相对 z 正轴的夹角spherical_to_cartesian((r, theta, phi))按(r·cosθ·sinφ, r·sinθ·sinφ, r·cosφ)反变换回直角坐标。这与部分学科中“φ 表示方位角”的习惯相反依赖旧命名phi/theta含义互换的代码需要相应调整。弃用项清单逐步迁移路线v0.11.0 清理了一批旧 API涉及以下变更PR变更内容迁移建议#2123ThreeDScene/ThreeDCamera的distance参数更名为focal_distance改用新参数名#2102弃用SampleSpaceScene与ReconfigurableScene使用普通Scene/ThreeDScene替代#2061移除Surface中已弃用的u_min/u_max/v_min/v_max改用u_range/v_range#2024弃用Mobject.rotate_in_place、scale_in_place、scale_about_point直接使用rotate/scale的about_point等参数#1991弃用VMobject.get_points改用get_start/get_end或直接访问points属性其他新特性与增强3D 矢量场与流线PR #2118 为ArrowVectorField与StreamLines增加了 3D 支持配合ThreeDScene可以直观可视化三维矢量场。VMobject.proportion_from_pointPR #1469 新增VMobject.proportion_from_point见 manim/mobject/types/vectorized_mobject.py。该方法接收一个点返回该点沿路径的弧长比例0 到 1。其实现会遍历构成 VMobject 的每段 Bezier 曲线若点落在某段曲线上则累加该段内点到该段起点的弧长最终除以整条路径的总弧长得到比例alpha若点不在曲线上则抛出ValueError。OpenGL 版本的同名方法位于 manim/mobject/opengl/opengl_vectorized_mobject.py两个渲染器下行为一致。Table 单元格高亮PR #2084 新增Table.get_highlighted_cell并修复了add_highlighted_cell。get_highlighted_cell(pos, colorPURE_YELLOW)返回一个覆盖指定单元格的BackgroundRectangle见 manim/mobject/table.pypos从(1, 1)左上角开始计数table Table( [[First, Second], [Third, Fourth]], row_labels[Text(R1), Text(R2)], col_labels[Text(C1), Text(C2)], ) highlight table.get_highlighted_cell((2, 2), colorGREEN) table.add_to_back(highlight) self.add(table)OpenGL 相关增强OpenGL 颜色设置改进#2111优化了 OpenGL 渲染器下颜色的解析与设置流程3D 相机旋转与移动的 OpenGL 兼容#2113ThreeDScene.begin_ambient_camera_rotation与move_camera现在同时支持 Cairo 与 OpenGL 渲染器相关实现见 manim/scene/three_d_scene.pyStreamLines 的 OpenGL 支持#1971与 boolean_ops 的 OpenGL 支持#2016新增 OpenGL 线框调试配置#2041在 manim/_config/default.cfg 中新增enable_wireframe False可通过配置文件或 CLI 参数--enable_wireframe定义于 manim/cli/render/global_options.py开启 OpenGL 线框模式辅助调试。在 manim/renderer/opengl_renderer.py 中该配置被映射为 OpenGL 上下文的wireframe属性。修复的 Bug 一览本版本修复了大量 OpenGL 兼容性缺陷值得关注的有OpenGLRenderer.get_frame 在窗口创建后取帧失败#2070AnimationGroup 的 OpenGL 兼容性#2071NumberPlane 坐标轴步进值颠倒#2108Cube 的 OpenGL 兼容性#2072Line.set_opacity 的 OpenGL 问题#2060OpenGLMobject.apply_complex_function 返回值错误#2037Cylinder.add_bases 的 OpenGL 兼容性#2039缓存已满时日志抛错#2066Text 的 OpenGL 位移动画异常#2026OpenGL 覆盖 SVG 填充色问题#2028NumberLine.add_labels 无法接收非 Mobject 标签#2043-a全部场景标志在 OpenGL 渲染下失效#2011Axes.get_line_graph生成的线图传给input_to_graph_point时出错#1994。文档、测试与基础设施改进配置教程校订#2131重写了配置相关文档对应 docs/source/guides/configuration.rstmanim_directive 改用 tempconfig#2120文档示例通过tempconfig获得干净配置避免配置项在示例间泄漏——这与set_default的“用完还原”原则是同一思路README 死链修复#2035与MacOS/Linux 用户级配置文件路径修正#2020测试系统复用#2008、#2080CLI 标志测试在 OpenGL 下复用Mobject测试套件也复用于OpenGLMobject显著扩大了 OpenGL 覆盖率对应测试见 tests/opengl 与 tests/interface/test_commands.pyCI 优化#2004GitHub Actions 中取消同一分支的旧工作流代码质量#2050颜色别名改为对 IDE 更友好的形式#1968 收紧 Flake8 配置并修复告警#2124 升级了包括skia-pathops在内的若干依赖。版本验证与升级建议v0.11.0 的变更记录可通过仓库内 docs/source/changelog/0.11.0-changelog.rst 复核后续版本v0.11.1 之后的演进可对照 docs/source/changelog 目录下的其他日志。升级时建议按以下顺序自查检查get_area调用若依赖 Riemann 矩形视觉效果改用get_riemann_rectangles并设置较小的dx检查极坐标转换确认theta/phi语义必要时交换参数替换弃用 API将distance改为focal_distance移除Surface的u_min等参数用set_default之外的新方式替代rotate_in_place等验证 OpenGL 场景本轮大量修复集中在 OpenGL 渲染器若使用--rendereropengl建议针对性回归AnimationGroup、Cube、Cylinder、Text动画与-a标志等受影响功能。总体上v0.11.0 以“数学绘图 对象系统 OpenGL 兼容”三线并进为后续版本奠定了ImplicitFunction、set_default、布尔运算等至今仍在使用的基础 API——理解这一版本的变更有助于更好地把握 Manim 现代 API 的设计脉络。【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门