草庐IT

【manim动画教程】-- 坐标系

千里之行,始于足下 2023-04-13 原文

没有引入坐标系之前,在绘制图形时,也有一个隐含的坐标系,它和屏幕的像素相关。

比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([0, 0]),
横轴坐标的范围大概是 [-3.5, 3.5],纵轴的坐标范围大概是 [-4, 4],这个范围与设置的视频分辨率有关,分辨率设置的越高的话,坐标范围越大。

不知是否还记得,之前的文章中绘制的线或者多边形(比如这个系列第7篇),都是在上面的坐标范围的。

# 范围内的线和多边形
l = Line([-1, 0, 0], [1, 0, 0])
self.play(Create(l), run_time=0.5)

p = Polygon([-3, 1, 0], [-1, 1, 0], [-2, -1, 0])
self.play(Create(p), run_time=0.5)

# 范围外的多边形,运行后会显示补全
p = Polygon([-4, 2, 0], [-1, 5, 0], [-2, -1, 0])
self.play(Create(p), run_time=0.5)

引入坐标系之后,绘制图形时就不用局限在屏幕隐含的坐标范围之内,
通过调整坐标的刻度,我们可以基于坐标系中绘制任意范围的图形,而不用担心绘制到屏幕之外去。

manim已经提供了从一维到三维的坐标系对象,下面一一介绍它们的基本使用方法。

1. 数轴

数轴(NumberLine)是最基本的一维坐标系,它的关键参数是:

  1. x_range:设置数轴的范围和间隔
  2. length:设置数轴显示的长度
NumberLine(x_range=[-10, 10, 2], length=10, include_numbers=True)
NumberLine(x_range=[-3, 3, 0.5], length=12, include_numbers=True)
NumberLine(
    x_range=[-5, 5 + 1, 1],
    length=6,
    include_numbers=True,
    include_tip=True,
    rotation=10 * DEGREES,
)

运行效果:

2. 平面坐标系

平面坐标系分为两类,实数平面复数平面,两者的外形非常类似。

2.1 实数平面

实数平面(NumberPlane)的关键参数有4个:

  1. x_range:设置X轴的范围和间隔
  2. y_range:设置Y轴的范围和间隔
  3. x_length:设置X轴显示的长度
  4. y_length:设置Y轴显示的长度
NumberPlane(
    x_range=(-4, 11, 1),
    y_range=(-3, 3, 1),
    x_length=3,
    y_length=2,
)
NumberPlane(
    x_range=(-4, 11, 1),
    x_length=3,
    y_length=4,
)

运行效果:

2.2 复数平面

复数平面(ComplexPlane)是基于实数平面(NumberPlane)的,参数类似,
只是多了一些标记复数的信息。

plane = ComplexPlane().add_coordinates()
d1 = Dot(plane.n2p(2 + 1j), color=YELLOW)
d2 = Dot(plane.n2p(-3 - 2j), color=YELLOW)
label1 = Tex("2+i").next_to(d1, UR, 0.1)
label2 = Tex("-3-2i").next_to(d2, UR, 0.1)

运行效果:

3. 极坐标系

极坐标系(PolarPlane)通过角度和与原点的距离来定位位置,经常被用于导航类的系统中,
与直角坐标相比,在这类系统中能极大的简化计算。
它的关键参数有:

  1. azimuth_step:分割的角度个数
  2. size:极坐标在屏幕中显示的大小
  3. radius_step:极坐标半径的间隔
  4. radius_max:极坐标最大半径
plane = PolarPlane(
    azimuth_step=30,
    size=6,
    radius_step=1,
    radius_max=3,
).add_coordinates()

运行效果:

4. 笛卡尔坐标系

笛卡尔坐标系是最常用的坐标系,学习函数的图像时用的最多的就是此坐标系。

4.1 二维

二维的笛卡尔坐标系(Axes)使用的比较多,它在平面坐标系之上,又提供了更多的配置,
可以更加灵活的配置数轴,除了上面平面坐标系提到的那4个关键参数之外,
还有2个配置坐标轴的参数也很重要:

  1. x_axis_config:配置X轴如何显示的参数
  2. y_axis_config:配置Y轴如何显示的参数

比如下面的示例中, 配置了与X轴不一样刻度的Y轴。

ax = Axes(
    x_range=[0, 10, 1],
    y_range=[-2, 6, 1],
    x_length=6,
    tips=False,
    axis_config={"include_numbers": True},
    y_axis_config={"scaling": LogBase(custom_labels=True)},
)

# x_min 必须 > 0,因为 x=0 时,y是负无穷
graph = ax.plot(lambda x: x**2, x_range=[0.001, 10], use_smoothing=False)

运行效果:

4.2 三维

三维的笛卡尔坐标系(ThreeDAxes)与二维坐标系的参数类似,只是多了一个维度(Z轴)的配置,
其配置参数与X轴Y轴类似。
显示三维图形时,有2点需要额外注意,
一是场景要继承 ThreeDScene,二是要调整下默认的相机位置,也就是视角的位置,默认视角是从Z轴顶部向下看的。

# 默认的相机视角
class CoordinateSample(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes(y_length=8)
    	circle = Circle(color=BLUE, radius=2)
        vg = VGroup(axes, circle)
        self.play(Create(vg), run_time=2)

        self.wait()

运行效果如下,很难看出是三维的坐标系统:

加入调整视角的代码后:

# 调整的相机视角
class CoordinateSample(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes(y_length=8)
    	circle = Circle(color=BLUE, radius=2)
        vg = VGroup(axes, circle)
        # 调整相机视角的代码 phi是与Z轴之间的角度,theta是围绕Z轴旋转的角度
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
        self.play(Create(vg), run_time=2)

        self.wait()

修改后运行效果:

5. 总结回顾

本篇主要介绍各类坐标系的基本使用方式和常用参数,从一维到三维主要有以下几种坐标系对象:

  1. NumberLine:数轴
  2. NumberPlane:实数平面
  3. ComplexPlane:复数平面
  4. PolarPlane:极坐标系
  5. Axes:二维笛卡尔坐标系
  6. ThreeDAxes:三维笛卡尔坐标系

制作函数相关的数学动画,或者物理定律相关的动画时,借助坐标系可以更清晰直观的的表达变换的规律。
本文关联的微信视频号短视频:

有关【manim动画教程】-- 坐标系的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  5. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  6. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  7. LVGL V8动画 - 2

    动画/*INITIALIZEANANIMATION 初始化一个动画*-----------------------*/lv_anim_ta;lv_anim_init(&a);/*MANDATORYSETTINGS 必选设置*------------------*//*Setthe"animator"function 设置“动画”功能*/lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)lv_obj_set_x);/*Setthe"animator"function*/lv_anim_set_var(&a,obj);/*Lengthoftheanim

  8. ruby-on-rails - rails 教程 : Putting flash messages in partial yields error "undefined method ` each' for nil:NilClass"? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:

  9. ruby-on-rails - Ruby on Rails 教程 - 5.26 - Sublime Text "Unable to Save"新文件 "spec/support/utilities.rb" - 2

    我正在使用SublimeText2,同时遵循MichaelHartl的RubyonRails教程。可以在http://ruby.railstutorial.org/book/ruby-on-rails-tutorial找到我所指的教程的具体部分。(ctrl+F“list5.26”)。我能够创建规范/支持文件。但是,在尝试创建spec/support/utilities.rb文件时,我收到消息“无法保存~/rails_projects/sample_app/spec/support/utilities.rb”。有人知道为什么会这样吗?SublimeText论坛上有人似乎遇到了完全相同的问

  10. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

随机推荐