VectorSceneManim动画库中专门用于向量空间可视化的场景类,继承自基础 Scene 类。

它通过封装一系列向量操作方法,使数学教育、物理模拟等领域的动画制作更加高效。

本文主要介绍VectorScene的作用、主要参数和方法,并通过示例动画来展示其特点。

1. VectorScene概要

VectorScene的核心功能包括:

  • 自动管理坐标系与网格系统
  • 支持向量的创建、标注与动态操作
  • 提供向量空间变换的可视化工具
  • 内置多种动画过渡效果

在教学中,VectorScene可以帮助学生更好地理解向量的概念和性质,例如向量的坐标表示、基向量的作用以及向量的线性组合等。

通过动画的形式,我们可以更直观地看到向量的变化过程,从而加深对数学概念的理解。

在科研和工程领域,VectorScene也可以用于展示向量场、力的分析等,帮助研究人员和工程师更清晰地表达和理解复杂的向量关系。

1.1. 主要参数

VectorScene继承自Scene,父类的参数它也都可以使用,VectorScene特有的参数不多:

参数名称 类型 说明
basis_vector_stroke_width int 基向量的笔触宽度。也就是基向量箭头的粗细程度

1.2. 主要方法

VectorScene的方法大多与向量操作有关,主要包括:

名称 说明
add_axes 添加一对坐标轴到场景中。通过设置animate=True,可以以动画的形式展示坐标轴的生成过程,增强视觉效果。
add_plane 在背景中添加一个NumberPlane对象。这个方法可以创建一个二维平面,用于展示向量的位置和方向。
add_vector 将一个向量添加到平面上,并返回该向量的箭头对象。通过设置 animate=True,可以以动画的形式展示向量的生成过程。
coords_to_vector 将向量表示为列矩阵,并展示向量的 x 和 y 分量对应的线段。
get_basis_vectors 返回一个包含基向量(1,0)(0,1)VGroup对象。通过设置不同的颜色,可以区分不同的基向量。
get_vector_label 为给定的向量生成标签。这个方法可以方便地为向量添加描述性文本,增强动画的可读性。
label_vector 为向量添加标签,并可以选择是否以动画的形式展示。
lock_in_faded_grid 冻结背景中的 NumberPlane 和坐标轴,并在前景中添加新的可操作的平面和坐标轴。这个方法可以用于在动画中切换不同的平面和坐标轴,增强视觉效果。
show_ghost_movement 播放一个动画,部分展示整个平面沿着特定向量方向移动的效果。这个方法可以用于展示向量的方向和作用,而不会实际移动平面。
vector_to_coords 将向量表示为基于Vector的向量,并展示向量的xy分量对应的线段,然后在向量头部附近创建一个列矩阵标签。
write_vector_coordinates 将向量的坐标写为列矩阵,并返回该列矩阵对象。

2. 使用示例

以下的示例展示VectorScene的特点。

2.1. 向量的加法

这个示例展示了如何使用VectorScene来展示向量的加法。

通过添加两个向量并计算它们的和,可以直观地展示向量加法的几何意义。

self.add_plane(
animate=True,
x_range=[-6, 6],
y_range=[-6, 6],
x_length=5,
y_length=5,
) # 添加平面
# TODO: add_axes 方法的 **kwargs 参数无效
self.add_axes(animate=True) # 添加坐标轴 # 定义两个向量
vector1 = self.add_vector([-2, 1], color=BLUE, animate=True)
vector2 = self.add_vector([1, 1], color=RED, animate=True) # 计算向量和
sum_vector = vector1.get_end() + vector2.get_end()
sum_vector = self.add_vector(sum_vector, color=GREEN, animate=True) # 添加标签
self.label_vector(vector1, "v1", animate=True)
self.label_vector(vector2, "v2", animate=True)
self.label_vector(sum_vector, "v1 + v2", animate=True)

2.2. 向量的标量乘法

这个示例展示了如何使用VectorScene来展示基向量的变换。

通过改变基向量的方向和大小,可以直观地展示基向量在向量空间中的作用。

self.add_plane(
animate=True,
x_range=[-6, 6],
y_range=[-6, 6],
x_length=5,
y_length=5,
) # 添加平面 # 定义一个向量
v = np.array([1, 0.5])
vector = self.add_vector(v, color=BLUE, animate=True)
self.label_vector(vector, "v", animate=True) # 标量乘法
scaled_vector = self.add_vector(v * 2, color=RED, animate=True)
self.label_vector(
scaled_vector,
MathTex(r"\overrightarrow{2V}", color=RED, font_size=30),
animate=True,
)

2.3. 向量的投影

这个示例展示了如何使用VectorScene来展示向量的投影。

通过计算一个向量在另一个向量上的投影,可以直观地展示向量投影的几何意义。

self.add_plane(
animate=True,
x_range=[-6, 6],
y_range=[-6, 6],
x_length=5,
y_length=5,
) # 添加平面 # 定义两个向量
vector1 = self.add_vector([2.5, 1.5], color=BLUE, animate=True)
vector2 = self.add_vector([0.5, 0.5], color=RED, animate=True)
self.label_vector(vector1, "v1", animate=True)
self.label_vector(vector2, "v2", animate=True) # 计算向量1在向量2上的投影
projection = vector2.get_projection(vector1.get_end())
projected_vector = Arrow(start=ORIGIN, end=projection, color=GREEN) self.add_vector(projected_vector, animate=True)
self.label_vector(projected_vector, "proj_{v2}(v1)", animate=True)

3. 附件

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

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

manim边学边做--向量相关的场景类的更多相关文章

  1. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  2. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  3. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  4. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  5. 24小时学通Linux内核--内核探索工具类

    寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...

  6. Java.util.Math类--数学相关的工具类

    Math类--数学相关的工具类 java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. public static double abs(double ...

  7. URL相关的工具类

    package com.opslab.util.web; import com.opslab.util.CharUtil;import com.opslab.util.CharsetUtil;impo ...

  8. 时间日期相关总结-System类的常用方法

    时间日期相关总结 Date类 A.构造方法 Date();根据当前系统时间创建日期对象 Date(long time);根据传入的毫秒值时间创建日期对象 B.成员方法 long getTime(); ...

  9. 初始通过 FastClick.notNeeded 方法判断是否需要做后续相关处理

    其实前面几篇文章大家都遇到一些错误,很多时候呢,我并没有直接回复解决方案,不是LZ不想告诉大家,如果不想那就不写这个了,估计博客园啊CSDN啊那么多写博客的,很少有人把现用框架分享出来,既然分享就毫不 ...

  10. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

随机推荐

  1. 2024年1月Java项目开发指南8:统一数据返回格式

    有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象-- 不过怎么说,我们返回的内容往往具有三个 1.消息代码 code 2.消息内容 msg 3.数据内容 data 接下来,我们要编写一 ...

  2. 2024年1月Java项目开发指南7:增删改查与接口测试

    我们之前,是从Controller层写到Service层,然后mapper层. 接下来我们反过来,从mapper层写到Controller层 两种方式都可以,你喜欢就行,甚至你先写service层也可 ...

  3. 硬件开发笔记(三十二):TPS54331电源设计(五):原理图BOM表导出、元器件封装核对

    前言   一个12V转5V.3.3V和4V的电源电路设计好了,下一步导出BOM表,二次核对元器件型号封装,这是可以生产前的最后一步了.   导出BOM表 步骤一:打开原理图   打开项目,双击点开原理 ...

  4. Qt/C++路径轨迹回放/回放每个点信号/回放结束信号/拿到移动的坐标点经纬度

    一.前言说明 在使用百度地图的路书功能中,并没有提供移动的信号以及移动结束的信号,但是很多时候都期望拿到移动的哪里了以及移动结束的信号,以便做出对应的处理,比如结束后需要触发一些对应的操作.经过搜索发 ...

  5. Qt编写地图综合应用28-闪烁点图

    一.前言 Qt除了内置了各种UI组件以外,还直接集成了浏览器控件,注意哦这可是跨平台的浏览器控件哦,在5.6版本以前集成的是webkit,以后集成的是webengine,使得程序的灵活性拓展性大大增强 ...

  6. WorldWind源码剖析系列:漫游时四叉树瓦片类QuadTile的运行思路

    用户在窗口漫游时,需要加载精细的高程和纹理数据时的处理思路:当用户漫游时直到窗口相机的视场角的1/2小于(瓦片大小*瓦片绘制距离的乘积)时,才初始化四叉树瓦片类QuadTile,或者加载本地缓存中的数 ...

  7. .NET 依赖注入中的 Captive Dependency

    大家好,上一篇我们分析了 .NET 依赖注入的默认行为,其实呢还没完全讲完.今天我先给大家出一道题: public interface IDbContext { } public class SqlS ...

  8. CDS标准视图:维护任务清单数据 I_MaintenanceTaskListData

    视图名称:维护任务清单数据 I_MaintenanceTaskListData 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IPMTASKLISTD ...

  9. Kernel Memory 让 SK 记住更多内容

    Kernel Memory (KM) 是一种多模态 AI 服务,专注于通过自定义的连续数据混合管道高效索引数据集.它支持检索增强生成(RAG).合成记忆.提示工程以及自定义语义记忆处理.KM 支持自然 ...

  10. WPF 设置Button的content为多行模式

    查找button的子元素是个TextBlock,再设置它的TextWrappingProperty属性为 TextWrapping.Wrap. Button btn2 = new Button() { ...