python动画:向量场

向量场是为每个向量分配一个x向量的映射F:\mathbb{R}^{n }\mapsto \mathbb{R}^{n } F(X)说明了上面的的几个向量场。向量场是通过给出其在区域内的发散和卷曲及其在 上的法向分量来唯一指定的 边界组成的。

向量场:向量场是一个数学概念,它将一个向量分配给空间中的每一个点。这是一种表示随地变化的量(例如速度、力或任意方向流动)的方式。在线性或三维空间中,向量场可以通过在不同点上绘制长度和方向各异的箭头来可视化。向量场是数学和物理中一个重要的概念,通常用于描述空间中每个点的向量分布。简单来说,向量场将空间中的每一点映射到一个向量。例如,在三维空间中,一个向量场可以用一个三维向量来描述每个点的方向和大小。

        在数学上,向量场通常用符号 (\mathbf{F}(\mathbf{x})) 来表示,其中 (\mathbf{x}) 是空间中的一个点,(\mathbf{F}) 是一个向量值函数。对于三维空间中的一个点 ((x, y, z)),向量场可以表示为:

[ \mathbf{F}(x, y, z) = \begin{pmatrix} F_1(x, y, z) \ F_2(x, y, z) \ F_3(x, y, z) \end{pmatrix} ]

其中F_{1}、F_{2}、F_{3}是定义在空间中的标量函数。

向量场的例子

  1. 重力场:地球表面的重力场可以用一个向量场来表示,其中每个点的向量指向地球中心,大小与距离地球中心的距离有关。

  2. 电场:电荷周围的电场也是一个向量场,描述了电荷在空间中产生的力的分布。

  3. 流体动力学中的速度场:在流体中,速度场描述了流体在每个点的速度向量。

向量场的运算

向量场可以进行多种运算,例如梯度、散度和旋度等:

  • 梯度:标量场的梯度是一个向量场,表示函数在空间中变化的方向和速率。

  • 散度:散度是一个标量,表示向量场在某一点的发散程度,通常用于描述流体的源或汇。

  • 旋度:旋度是一个向量,表示向量场的旋转程度,常用于流体动力学和电磁学中。

应用

向量场在物理、工程、计算机图形学和许多其他领域中都有广泛的应用。它们用于描述力场、流场、温度场等各种现象,为理解和分析复杂系统提供了有力的工具

接下来用python实现一下向量场的画法 

一,ArrowVectorField (箭头向量场)

  • 这个类用箭头(或向量)来表示一个向量场,从而指示向量场中各点的方向和大小。每个箭头从空间中的一个点开始,指向由其向量指示的方向,箭头的长度通常对应于向量的大小。
ArrowVectorField(func, color=None, color_scheme=None, min_color_scheme_value=0, 
max_color_scheme_value=2, colors=[ManimColor('#236B8E'), ManimColor('#83C167'), 
ManimColor('#FFFF00'), ManimColor('#FC6255')], x_range=None, y_range=None, z_range=None,
 three_dimensions=False, length_func=<function ArrowVectorField.<lambda>>, opacity=1.0, 
vector_config=None, **kwargs)

 ArrowVectorField 是 Manim 中的一个函数,用于在给定区域内绘制向量场。

以下是该函数参数的解释:

  • func: 一个函数,用于计算向量场的值。它应接受一个点(通常是二维或三维坐标)并返回该点的向量。

  • color: 可选参数,指定向量的颜色。如果提供,则所有向量将使用此颜色。

  • color_scheme: 可选参数,定义颜色方案。如果提供,它将覆盖 color 参数。

  • min_color_scheme_value: 可选参数,用于设置值的最小范围,以便在颜色方案中进行归一化。

  • max_color_scheme_value: 可选参数,用于设置值的最大范围,以便在颜色方案中进行归一化。

  • colors: 一个列表,指定颜色渐变的数组。颜色通常使用 ManimColor 类定义。

  • x_range: 可选参数,指定 x 轴的范围。例如,[-3, 3]

  • y_range: 可选参数,指定 y 轴的范围。例如,[-3, 3]

  • z_range: 可选参数,指定 z 轴的范围(如果是三维的向量场)。例如,[-3, 3]

  • three_dimensions: 一个布尔值,指定是否绘制三维向量场。默认为 False,表示绘制二维向量场。

  • length_func: 一个函数,用于确定箭头的长度。它接受向量的大小作为输入并返回箭头的长度。

  • opacity: 一个浮点数,指定箭头的透明度,范围在 0(完全透明)到 1(不透明)之间。

  • vector_config: 一个字典,允许传递给生成向量箭头的配置。在这里可以自定义箭头的样式、大小等。

  • **kwargs: 其他可选参数,可以传递给 Manim 中的其他图形对象。

示例代码:

以下是一个使用 ArrowVectorField 的示例代码,展示了如何使用所有的参数,并附有注释:

from manim import *  

class BasicUsage14(Scene):  
    
    def rotate_vector_field(self, pos):  #螺旋向量场
        return np.array([np.cos(np.sqrt(pos[0]**2 + pos[1]**2)), np.sin(np.sqrt(pos[0]**2 + pos[1]**2))])  

    def construct(self): 
        colors = [RED, YELLOW, BLUE, DARK_GRAY]
        func = self.rotate_vector_field  
        vf = ArrowVectorField(func,
                              min_color_scheme_value=2, max_color_scheme_value=10, colors=colors)
        self.add(vf)  

 示例2:

from manim import *

class ScaleVectorFieldFunction(Scene):
    def construct(self):
        func = lambda pos: np.sin(pos[1]) * RIGHT + np.cos(pos[0]) * UP
        vector_field = ArrowVectorField(func)
        self.add(vector_field)
        self.wait()

        func = VectorField.scale_func(func, 0.5)
        self.play(vector_field.animate.become(ArrowVectorField(func)))
        self.wait()

 二,VectorField (向量场)

  • 这是一个通用的类,作为向量场的基本表示。它封装了创建和操作向量场所需的基本属性和方法。这个类可以作为更特化的向量场可视化的基础,例如ArrowVectorFieldStreamLines
VectorField(func, color=None, color_scheme=None, min_color_scheme_value=0, 
max_color_scheme_value=2, colors=[ManimColor('#236B8E'), ManimColor('#83C167'), 
ManimColor('#FFFF00'), ManimColor('#FC6255')], **kwargs)

 VectorField 是 Manim 中用于生成向量场的类。向量场是从某个函数定义出来的,并会在给定区域内绘制出一系列的向量。向量场的每个向量都指出在该位置的方向和大小。

下面是对 VectorField 中主要参数的解释:

参数解释

  • func:

    • 类型:函数
    • 描述:这是一个定义向量场的函数,通常是一个接受二维坐标(x, y)并返回一个向量(一个元组例如 (vx,vy)(vx,vy))的函数。这里的 vxvx 和 vyvy 表示在该点的 x 和 y 分量。
  • color:

    • 类型:颜色
    • 描述:用于指定向量的颜色。如果设置该参数,向量将使用此颜色,而忽略 colors 列表中的颜色。可以使用 Matplotlib 颜色字符串或 Manim 定义的颜色。
  • color_scheme:

    • 类型:字符串
    • 描述:用于定义颜色方案的类型。如果指定,此参数会影响向量的颜色选择。可以是预定义的颜色方案,如"viridis"或其他名称。
  • min_color_scheme_value:

    • 类型:浮点数
    • 默认值:0
    • 描述:当使用颜色方案时,指定用于最小颜色值的值。向量场的颜色将根据这个值进行映射。
  • max_color_scheme_value:

    • 类型:浮点数
    • 默认值:2
    • 描述:当使用颜色方案时,指定最大颜色值。向量场的颜色将根据这个值进行映射。
  • colors:

    • 类型:列表
    • 默认值:[ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#FFFF00'), ManimColor('#FC6255')]
    • 描述:这是一个颜色列表,用于定义向量在向量场中显示的颜色。每个向量的颜色将根据 colors 列表中的分配进行变化。可以用具体的颜色值来定制向量的颜色。
  • kwargs:

    • 描述:其他参数将被传递给基类或内部使用。具体参数取决于 VectorField 的实现,可能包括自定义行为、动画设置等。

 VectorField的子函数和参数解释

这些函数看似与 Manim 的动画和对象管理有关,特别是与平移、缩放、颜色渐变等相关的功能。

  1. fit_to_coordinate_system(coordinate_system):

    • 参数:
      • coordinate_system: 指定的坐标系统,通常是一个 Manim 的坐标系对象。
    • 描述: 将当前对象的宽度和高度调整到与指定的坐标系统匹配,以确保在该坐标系统中保持适当的比例和尺寸。
  2. get_colored_background_image(sampling_rate=5):

    • 参数:
      • sampling_rate: 控制每单位空间中采样的像素数量,默认值为5。
    • 描述: 获取一个带有颜色背景图像的图形,可以用于创建具有渐变色或自定义颜色的背景。该函数的很可能用于生成样本图像。
  3. get_nudge_updater(speed=1, pointwise=False):

    • 参数:
      • speed: 像素移动的速率,默认值为1。
      • pointwise: 布尔值,表示是否对每个点进行独立更新。
    • 描述: 获取一个更新器,用于在动画中将对象轻微移动。可以使用该更新器使得物体在每帧中按给定速度逐渐移动。
  4. get_vectorized_rgba_gradient_function(start, end, colors):

    • 参数:
      • start: 颜色渐变的起始颜色。
      • end: 颜色渐变的结束颜色。
      • colors: 颜色列表,可以用于生成多种颜色渐变效果。
    • 描述: 获取一个根据指定起始和结束颜色生成 RGBA 渐变颜色的函数。适用于创建多种渐变效果,可在对象上应用。
  5. nudge(mob, dt=1, substeps=1, pointwise=False):

    • 参数:
      • mob: 要移动的对象(mob)。
      • dt: 移动的时间步长,默认值为1。
      • substeps: 每个时间步的子步骤数,可以使运动更加平滑。
      • pointwise: 布尔值,表示是否对每个点进行独立移动。
    • 描述: 使得指定对象轻微移动。可以按时间步长进行移动,使得动画效果更加流畅。
  6. nudge_submobjects(dt=1, substeps=1, pointwise=False):

    • 参数:
      • dt: 移动的时间步长,默认值为1。
      • substeps: 每个时间步的子步骤数,可以使运动更加平滑。
      • pointwise: 布尔值,表示是否对每个点进行独立移动。
    • 描述: 类似于 nudge,但是专门用于对象的子对象,即在一个父对象内的所有可移动部分均被轻微移动。
  7. scale_func(func, scalar):

    • 参数:
      • func: 一个函数,通常用于描述某种变化。
      • scalar: 乘法标量,用于缩放函数的输出。
    • 描述: 通过一个标量来缩放函数。这个函数可以用于实现复杂的动画缩放效果。
  8. shift_func(func, shift_vector):

    • 参数:
      • func: 一个原始的函数,描述某种变化。
      • shift_vector: 需要移动的向量。
    • 描述: 获取一个函数,该函数在原始函数的基础上平移指定的向量,改变物体的位置。
  9. start_submobject_movement(speed=1, pointwise=False):

    • 参数:
      • speed: 物体移动的速度,默认值为1。
      • pointwise: 布尔值,表示是否对每个点进行独立更新。
    • 描述: 开始一个子对象的运动。此功能可以在动画中启动移动效果。
  10. stop_submobject_movement():

    • 描述: 停止子对象的运动。在动画中,当需要将所有子对象的运动停止时,可以调用此函数。

示例 1:

class Nudging(Scene):
    def construct(self):
        func = lambda pos: np.sin(pos[1] / 2) * RIGHT + np.cos(pos[0] / 2) * UP
        vector_field = ArrowVectorField(
            func, length_func=lambda x: x / 2
        )
        self.add(vector_field)
        circle = Circle(radius=2).shift(LEFT)
        self.add(circle.copy().set_color(GRAY))
        dot = Dot().move_to(circle)

        vector_field.nudge(circle, -2, 60, True)
        vector_field.nudge(dot, -2, 60)

        circle.add_updater(vector_field.get_nudge_updater(pointwise=True))
        dot.add_updater(vector_field.get_nudge_updater())
        self.add(circle, dot)
        self.wait(6)

总结

总之,这些类允许对向量场的表示和可视化,在物理仿真、流体动力学以及其他需要表示空间中的方向和大小的应用中非常重要。每个类都以特定的方式解释和展示向量场固有的概念。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值