当前位置: 首页 > 科技观察

Manim一个非常漂亮的Python数学动画开发模块

时间:2023-03-13 21:25:20 科技观察

Manim是3b1b开源的一个特别漂亮的数学动画模块。我们可以基于Manim绘制很多解释性动画,比如下面的一个:还支持函数图像:甚至一些3D视图和矩阵变换,Manim都可以轻松实现:如果你是数学课的讲师,或者你需要给演示一些数学公式的观众图形,那么Manim是您的完美选择。Manim支持Python3.7及以上版本,推荐使用Python3.8.1。在开始之前,您需要确保您的计算机上已成功安装Python和pip。如果没有,可以访问这篇文章:超详细的Python安装指南进行安装。(可选1)如果使用Python进行数据分析,可以直接安装Anaconda:Anaconda,Python数据分析和挖掘的好帮手,内置Python和pip。(可选2)另外,推荐大家使用VSCode编辑器,它有很多优点:Python编程的最佳拍档——VSCode详解指南。请选择以下方式之一输入命令安装依赖项:1.Windows环境打开Cmd(开始-运行-CMD)。2.在MacOS环境下,打开Terminal(command+空格进入Terminal)。3.如果你使用的是VSCode编辑器或者Pycharm,可以直接使用Terminal.condacreate--namemanimpythnotallow=3.8#创建虚拟环境condaactivatemanim#切换到这个虚拟环境pipinstallmanimgl#安装manim安装完成后,在终端输入manimgl,会出现如下界面,说明安装完成。2.Manim的基本使用首先学习画一个基本的数学图形,比如一个圆:frommanimlibimport*classSquareToCircle(Scene):defconstruct(self):circle=Circle()circle.set_fill(BLUE,opacity=0.5)圆圈。set_stroke(BLUE_E,width=4)写好self.add(circle)后,在终端输入这个命令:manimgl你的py文件名.pySquareToCircle会弹出一个图形界面,绘制完成:你还是可以操作的弹出的窗口:滚动鼠标中键上下移动屏幕按住键盘上的z键,同时滚动鼠标中键缩放屏幕按住键盘上的f键,移动鼠标平移屏幕移动时按住键盘上的d键使用鼠标更改3D视角。按键盘上的r键恢复原来的视角。最后,您可以通过按q关闭窗口并退出程序。接下来,我们学习如何把圆变成正方形:#公众号:PythonPracticalCollectionfrommanimlibimport*classCircleToSquare(Scene):defconstruct(self):square=Square()square.set_fill(BLUE,opacity=0.5)square.set_stroke(BLUE_E,width=4)circle=Circle()self.play(ShowCreation(circle))self.wait()self.play(ReplacementTransform(circle,square))self.wait()ShowCreation:演示画圆过程。ReplacementTransform:延迟从第一个参数的图形变为第二个参数的图形的过程。self.wait():等待最后一个播放操作完成。在终端运行命令:manimgl你的py文件名.pyCircleToSquare效果如下:下面是一个比较复杂的演示,加入了拉伸、旋转和变换:场景):defconstruct(self):square=Square()square.set_fill(BLUE,opacity=0.5)square.set_stroke(BLUE_E,width=4)circle=Circle()self.play(ShowCreation(circle))self.wait()self.play(ReplacementTransform(circle,square))self.wait()#水平方向拉伸四倍self.play(square.animate.stretch(4,dim=0))self.wait()#旋转90°self.play(Rotate(square,TAU/4))self.wait()#缩小到原来的1/4,同时向右移动2个单位self.play(square.animate.shift(2*RIGHT),square.animate.scale(0.25))self.wait()#对于非线性变换,给square添加10条曲线(不会播放动画)square.insert_n_curves(10)#对所有点应用f(z)=onsquare复杂的transformationofz^2self.play(square.animate.apply_complex_function(lambdaz:z**2))self.wait()square.animate.stretch:按第一个参数的倍数拉伸图形,第二个维度度数表示方向,dim=0为水平方向,dim=1为垂直方向square.animate.shift:可以调整图形的位置和大小。square.animate.apply_complex_function:添加函数复变。效果如下:3.Manim坐标轴和函数图像要实现函数图像绘制,首先需要添加坐标轴:):axes=Axes((-3,10),(-1,8))axes.add_coordinate_labels()self.play(Write(axes,lag_ratio=0.01,run_time=1))运行以下命令显示轴:manimglyourpyFilename.pyGraphExample画好坐标轴后,就可以开始画图了:向上滑动查看更多代码:classGraphExample(Scene):defconstruct(self):axes=Axes((-3,10),(-1,8))axes.add_coordinate_labels()self.play(Write(axes,lag_ratio=0.01,run_time=1))#axes.get_graph会返回传入方程的图像sin_graph=axes.get_graph(lambdax:2*math.sin(x),color=BLUE,)#默认情况下,它在所有样本点之间插值稍微平滑一些(x,f(x))#但是,如果图形是有角度的,你可以将use_smoothing设置为Falserelu_graph=轴.get_graph(lambdax:max(x,0),use_smoothing=False,color=YELLOW,)#对于不连续函数,可以指定不连续点,这样它就不会尝试填充不连续的位置step_graph=axes.得到_图(lambdax:2.0ifx>3else1.0,discnotallow=[3],color=GREEN,)#Axes.get_graph_label可以接受字符串或对象如果输入是一个字符串#那么它将作为LaTeX表达式传递到Tex#默认情况下,标签将在图像的右侧生成并匹配图像的颜色sin_label=axes.get_graph_label(sin_graph,"\\sin(x)")relu_label=axes.get_graph_label(relu_graph,Text("ReLU"))step_label=axes.get_graph_label(step_graph,Text("Step"),x=4)self.play(ShowCreation(sin_graph),FadeIn(sin_label,RIGHT),)self.wait(2)self.play(ReplacementTransform(sin_graph,relu_graph),FadeTransform(sin_label,relu_label),)self.wait()self.play(ReplacementTransform(relu_graph,step_graph),FadeTransform(relu_label,step_label),)self.wait()抛物线=axes.get_graph(lambdax:0.25*x**2)parabola.set_stroke(BLUE)self.play(FadeOut(step_graph),FadeOut(step_label),ShowCreation(parabola))self.wait()#你可以使用Axes.input_to_graph_point(缩写为Axes.i2gp)在图像上找到一个点dot=Dot(color=RED)dot.move_to(axes.i2gp(2,parabola))self.play(FadeIn(dot,scale=0.5))#ValueTracker存储一个值可以帮助我们制作可变参数的动画#通常使用updater或者f_always让其他mobjects根据里面的值进行更新x_tracker=ValueTracker(2)f_always(dot.move_to,lambda:axes.i2gp(x_tracker.get_value(),parabola))self.play(x_tracker.animate.set_value(4),run_time=3)self.play(x_tracker.animate.set_value(-2),run_time=3)self.wait()如果运行你有这样的错误:请下载并安装MiKTex和dvisvgm。MiKTex:https://miktex.org/downloadDvisvgm:https://dvisvgm.de/Downloads/还有更多有趣的绘图案例,大家可以在Manim官网找到学习:https://docs.manim.org。cn/getting_started/example_scenes.html