首页 > 其他分享 >用Manim实现函数图像的的绘制【FunctionGraph】

用Manim实现函数图像的的绘制【FunctionGraph】

时间:2024-08-08 16:24:39浏览次数:15  
标签:函数 self range 参数 func np FunctionGraph 绘制 Manim

一,介绍

在这个上下文中,函数是指变量之间的数学关系。当我们可视化这些函数时,我们使用对象来表示这些函数的图形。

函数

  1. FunctionGraph(函数图)
  • 这个类表示一个由显式方程 y=f(x) 定义的函数图。
  • 它是 ParametricFunction 的一种特殊类型,默认情况下会跨越整个场景的长度。这意味着它扩展到可见区域,使得轻松观察函数在指定范围内的行为成为可能。
  1. ImplicitFunction(隐式函数)
  • 这个类表示由隐式形式定义的函数,通常为 F(x,y)=0例如,一个圆可以表示为 x^{2}+y^{2}-r^{2}=0
  • 与显式函数不同,显式函数是通过将 y用 x 表示出来,隐式函数则直接描述 x 和 y 之间的关系。
  1. ParametricFunction(参数函数)
  • 这个类表示由参数方程定义的曲线。它不是用 y作为 x的函数,而是定义 x 和 y 都是一个第三变量(通常是 t)的函数。
  • 一个典型的参数函数可能看起来像 x=f(t),y=g(t)其中 t 在某个区间内变化。

 二,应用

1.FunctionGraph(函数图)

用于显式函数,默认情况下跨越整个场景。

构造函数如下:

FunctionGraph(function, x_range=None, color=ManimColor('#FFFF00'), **kwargs)

FunctionGraph 是 Manim 中用于创建函数图形的一个类。它用于可视化数学函数,通常是由显式方程 y=f(x) 定义的。

参数解释
  • function: 这是一个函数对象,它定义了 yy 如何根据 xx 变化。通常这个函数接收一个数字并返回一个数字,例如 lambda x: x**2

  • x_range: 这是一个可选参数,用于定义函数图形的 xx 轴范围。它通常是一个包含最小值和最大值的元组,例如 (x_min, x_max)

  • color: 这用于设置函数图形的颜色,默认为一种淡黄色(ManimColor('#FFFF00'))。你可以使用任何有效的颜色。

  • kwargs: 额外的关键字参数,这些参数可以传递给父类,用于控制其他属性,比如线宽、透明度等。

示例1:
from manim import *  

class DrawFunctionGraph(Scene):  
    def construct(self): 
        ax=Axes().add_coordinates()
        # 定义函数  
        function = lambda x: x ** 2  

        # 创建 FunctionGraph 对象  
        graph = FunctionGraph(function, x_range=(-3, 3), color=YELLOW)  

        # 绘制图形  
        self.add(ax,graph)  
代码说明
  • 首先,定义了一个场景 DrawFunctionGraph
  • 在场景中,定义了一个表示 y=x^{2}的 Lambda 函数。
  • 使用 FunctionGraph 创建一个图形,设定 xx 的范围为[−3,3],颜色设置为黄色。
  • 使用 Create 动画展示图形,并等待两秒钟以便查看结果。

运行结果:

 示例2:
class ExampleFunctionGraph(Scene):
    def construct(self):
        ax=Axes().add_coordinates()
        cos_func = FunctionGraph(
            lambda t: np.cos(t) + 0.5 * np.cos(7 * t) + (1 / 7) * np.cos(14 * t),
            color=RED,
        ).move_to([0, 2, 0])

        sin_func_1 = FunctionGraph(
            lambda t: np.sin(t) + 0.5 * np.sin(7 * t) + (1 / 7) * np.sin(14 * t),
            color=BLUE,
        ).move_to([0, 0, 0])

        sin_func_2 = FunctionGraph(
            lambda t: np.sin(t) + 0.5 * np.sin(7 * t) + (1 / 7) * np.sin(14 * t),
            x_range=[-4, 4],
            color=GREEN,
        ).move_to([0, -2, 0])

        self.add(NumberPlane(),ax,cos_func, sin_func_1, sin_func_2)

运行结果:

2.ImplicitFunction(隐式函数)

ImplicitFunction表示 x 和 y 之间的关系,而不需要将其中一个解出作为另一个的函数。

构造函数如下:

ImplicitFunction(func, x_range=None, y_range=None, min_depth=5, max_quads=1500, 
use_smoothing=True, **kwargs)

ImplicitFunction 是 Manim 中用于绘制隐式函数图形的类。与显式函数不同,隐式函数通常以方程的形式 F(x,y)=0 给出。这个类根据指定的函数和范围来绘制图形。

参数解释
  • func: 这是一个接收两个参数 x 和 y的函数,表示隐式方程 F(x,y)=0。

  • x_range: 可选参数,定义 x 轴的范围,格式为一个包含最小值和最大值的元组,例如 (-3, 3)

  • y_range: 可选参数,定义 yy 轴的范围,格式同样为一个包含最小值和最大值的元组。

  • min_depth: 在计算隐式结构的过程中,递归的最小深度,默认为 5。这个值越大,允许的细节级别越高。

  • max_quads: 可选参数,控制绘制的最大四边形数量,默认为 1500。这有助于控制画布上绘制的多边形数量,以提高性能。

  • use_smoothing: 布尔值,指示是否对图形进行平滑处理,默认为 True。如果设置为 False,图形可能会更为锐利,但可能出现锯齿边缘。

  • kwargs: 额外的关键字参数,用来设定其他属性,例如颜色、线宽等。

示例代码1:

下面的代码示例展示了如何使用 ImplicitFunction 绘制一个圆的隐式方程 x^{2}+y^{2}-1=0

from manim import *  

class DrawImplicitFunction(Scene):  
    def construct(self): 
        ax=Axes().add_coordinates()
        # 定义隐式函数  
        func = lambda x, y: x**2 + y**2 - 4  

        # 创建 ImplicitFunction 对象  
        implicit_func_graph = ImplicitFunction(func,   
                                                x_range=(-2, 2),   
                                                y_range=(-2, 2), 
                                                min_depth=5,
                                                max_quads=4050,
                                               
                                                color=BLUE,  
                                                use_smoothing=True)  

        # 绘制图形  
        self.add(NumberPlane(),ax)
        self.play(Create(implicit_func_graph))  
        self.wait(2)  

 运行结果:

 示例2
class ImplicitFunctionExample(Scene):
    def construct(self):
        graph = ImplicitFunction(
            lambda x, y: x * y ** 2 - x ** 2 * y - 2,
            color=RED
        )
        self.add(NumberPlane(), graph)

运行结果:

3.ParametricFunction(参数函数)

ParametricFunction通过将 x 和 y 作为第三变量的函数来表示曲线。

ParametricFunction(function, t_range=(0, 1), scaling=
<manim.mobject.graphing.scale.LinearBase object>,
 dt=1e-08, discontinuities=None, use_smoothing=True, 
use_vectorized=False, **kwargs)

ParametricFunction 是 Manim 中用于绘制参数方程的类。这种类型的函数通常表示为一组方程 (x(t),y(t))(x(t),y(t)),其中 tt 是参数。

参数解释
  • function: 这是一个接受一个参数 tt 的函数,返回一个长度为 2 的元组或列表,表示点 (x(t),y(t))。

  • t_range: 定义参数 tt 的范围,格式为一个包含最小值和最大值的元组,例如 (0, 1)

  • scaling: 用于缩放图形的尺度对象,默认为线性缩放。你可以用不同的缩放方式改变图形的大小。

  • dt: 用于数值计算时的微小增量,默认为 1e−08,在处理参数方程时可用于控制精度。

  • discontinuities: 可选参数,定义在绘制中要跳过的点。如果函数在某些点上不连续,可以通过这个参数进行指定,以避免在这些不连续点绘制出无效的部分。

  • use_smoothing: 布尔值,指示是否对图形进行平滑处理,默认为 True。如果设置为 False,图形可能会更为锐利,但可能会出现锯齿边缘。

  • use_vectorized: 布尔值,指示是否使用向量化函数进行绘制,默认为 False。使用向量化可以提高绘制效率和质量。

  • kwargs: 额外的关键字参数,用于设定其他属性,比如颜色、线宽、样式等。

示例1:

下面的代码示例展示了如何使用 ParametricFunction 绘制一个单位圆的参数方程。

from manim import *  

class DrawParametricFunction11(Scene):  
    def construct(self):  
        # 定义参数方程,返回心形曲线的 x 和 y 坐标  
        def heart_shape(t):  
            x = 1.5 * np.sin(t)**3  
            y = 1.5 * np.cos(t) - 1.5* np.cos(2 * t) - 1 * np.cos(3 * t) - np.cos(4 * t)  
            return np.array([x, y, 0])  # 返回一个三维点  
            
        # 创建 ParametricFunction 对象,使用所有参数  
        heart_curve = ParametricFunction(  
            heart_shape,  
            t_range=(0, 2 * PI),  # 参数 t 的范围  
            scaling=LinearBase(),  # 使用线性缩放  
            dt=1e-08,               # 微小增量  
            discontinuities=None,   # 无需跳过不连续点  
            use_smoothing=True,     # 启用平滑  
            use_vectorized=False,   # 不使用向量化绘制  
            color=RED,              # 颜色设定为红色  
            stroke_width=4          # 线宽设定为4  
        )  

        # 绘制图形  
        self.add(NumberPlane())
        self.play(Create(heart_curve))  
        self.wait(2)  

 运行结果:

示例2 
from manim import *  

class DrawParametricFunction(Scene):  
    def construct(self):  
        # 定义参数方程  
        def parametric_circle(t):  
            x = 2 * np.sin(t)**3  
            y = 1 * np.cos(t) - 1.5 * np.cos(2 * t) - 0.5 * np.cos(3 * t) - np.cos(4 * t)  
            return np.array([x, y, 0])  # 返回一个三维点    

        # 创建 ParametricFunction 对象  
        parametric_circle_graph = ParametricFunction(parametric_circle,   
                                                      t_range=(0, 2 * PI),   
                                                      color=YELLOW)  

        # 绘制图形  
        self.play(Create(parametric_circle_graph))  
        self.wait(2)  

 运行结果:

示例3: 
from manim import *

class PlotParametricFunction(Scene):
    def func(self, t):
        return (np.sin(2 * t), np.sin(3 * t), 0)

    def construct(self):
        func = ParametricFunction(self.func, t_range = (0, TAU), fill_opacity=0).set_color(RED)
        self.add(func.scale(3))

 运行结果:

 示例4:

from manim import *  

class ThreeDParametricSpring01(ThreeDScene):  
    def construct(self):  
        curve1 = ParametricFunction(  
            lambda u: (  
                1.2 * np.cos(u),  
                1.2 * np.sin(u),  
                u * 0.05  
            ),  
            color=RED,  
            stroke_width=7 ,         # 线宽设定为7 
            t_range=(-3 * TAU, 5 * TAU, 0.01)  
        ).set_shade_in_3d(True)  

        axes = ThreeDAxes()  
        # 创建坐标标签  
        x_label = MathTex("X").scale(0.7).next_to(axes.x_axis.get_end(), UP)  
        y_label = MathTex("Y").scale(0.7).next_to(axes.y_axis.get_end(), RIGHT)  
        z_label = MathTex("Z").scale(0.7).next_to(axes.z_axis.get_end(), OUT)  

        # 添加坐标系和标签到场景中  
        self.add(axes, x_label, y_label, z_label)
        self.add(axes)  

        # 调整摄像机的方位,以 45 度的角度观察  
        self.set_camera_orientation(phi=25 * DEGREES, theta=-35 * DEGREES)  
        self.play(Create(curve1))

        self.wait()

运行结果:

示例4: 

class DiscontinuousExample(Scene):
    def construct(self):
        ax1 = NumberPlane((-3, 3), (-4, 4))
        ax2 = NumberPlane((-3, 3), (-4, 4))
        VGroup(ax1, ax2).arrange()
        discontinuous_function = lambda x: (0.5*x **4 - 0.05) / (x **4 - 0.002)
        incorrect = ax1.plot(discontinuous_function, color=RED)
        correct = ax2.plot(
            discontinuous_function,
            discontinuities=[-4, 4], 
            dt=0.5,  
            color=GREEN,
        )
        self.add(ax1, ax2, incorrect, correct)

 运行结果:

标签:函数,self,range,参数,func,np,FunctionGraph,绘制,Manim
From: https://blog.csdn.net/qq_45449625/article/details/141024822

相关文章

  • 如何在Python中绘制伪球面
    目标是使用meshgrid和numpy库生成伪球体的三维图形,但我使用下面的代码生成的图形不完整u=np.linspace(0,np.pi,50)v=np.linspace(0,2*np.pi,100)x,y=np.meshgrid(u,v)X=np.arccos(x)*np.cos(y)Y=np.arccos(x)*np.sin(y)Z=x-np.tan(x)fig=plt.f......
  • 鸿蒙OS开发使用Canvas组件绘制天气曲线图
    参考下文:鸿蒙征文|使用Canvas组件绘制天气曲线图_harmonyos_鸑鷟407-HarmonyOS开发者社区效果图:原理使用贝塞尔曲线首先可以了解一下贝塞尔曲线。如果看不懂也没关系,这里会直接讲绘制曲线的步骤。使用CanvasRenderingContext2D对象。首先使用beginPath方法确定起始点......
  • 绘制柱状图和折线图
    importmatplotlib.pyplotaspltimportpandasaspdimportnumpyasnp#数据准备data={'Initialangle':[16,10,4,16,-5,11,10,6,-9,22],'Actualangle':[4,0,-9,2,5,0,2,-9,8,26],'Bendingangle':[-3,-6,-1......
  • Canvas简历编辑器-图形绘制与状态管理(轻量级DOM)
    Canvas简历编辑器-图形绘制与状态管理(轻量级DOM)在前边我们聊了数据结构的设计和剪贴板的数据操作,那么这些操作都还是比较倾向于数据相关的操作,那么我们现在就来聊聊基本的图形绘制以及图形状态管理。在线编辑:https://windrunnermax.github.io/CanvasEditor开源地址:https......
  • 如何使用 Python 进行数据可视化,比如绘制折线图?
    要使用Python进行数据可视化,可以使用matplotlib库来绘制折线图。以下是一个简单的示例代码:首先,确保已安装matplotlib库。可以使用以下命令安装:pipinstallmatplotlib在Python脚本中导入matplotlib库:importmatplotlib.pyplotasplt准备数据,以x和y坐标列表的形式存......
  • python绘制圆柱体
     importosimportrandomimportnumpyasnpimportmatplotlib.pyplotasplt#合成管道数据集defplot_cylinder(center,radius,height,num_points=100):#生成圆柱体的侧面点坐标theta=np.linspace(0,2*np.pi,num_points)intervalZ=np.floor(h......
  • 绘制程序流图
    绘制程序流图程序流程图(Flowchart)是一种图形化表示程序逻辑的方式,它使用一系列标准化的图形符号来表示算法或工作流程中的步骤和决策点。以下是绘制程序流程图的基本步骤和方法:确定开始和结束点:用椭圆形表示开始点(Start)。用带圆角的矩形表示结束点(End)。使用流程线:用......
  • WPF WriteableBitmap通过GDI+绘制帮助类
    代码:publicclassWriteableBitmapGraphic:IDisposable{publicWriteableBitmapSource{get;privateset;}publicSystem.Drawing.Bitmapbitmap{get;privateset;}publicintDataLength{get;privateset;}publ......
  • 【Dynamo】AnyCAD使用Dynamo绘制三维模型(二)——生成序列和范围的几种方式
    说明:Dynamo为开源项目,开源地址:https://github.com/DynamoDS/Dynamo.git本文章使用版本:v3.0.3范围使用Range节点start和end分别表示范围的边界,step表示步长。如下为[1,10]范围内步长为2结果​使用CodeBlock节点在CodeBlock填写如下形式的代码beginning..end..step-si......
  • vue2 - 最新详细实现高德地图绘制动态热力图详细教程,在某区域或城市地图上做“热力图
    效果图在vue2、nuxt2项目开发中,详解引入使用高德地图接收热力图数据并渲染“热力图”效果功能,在地图上的某个区域或某个城市(可多个)、省份等自由绘制对应的热力图层,各城市地区同时加载渲染热力流量区域用以对比,根据不同的颜色代表人口密度、客流量、旅游人数、交通流量......