【manim动画教程】– 坐标系

yizhihongxing

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

比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([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,
)

运行效果:
out01.gif

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,
)

运行效果:
out01.gif

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)

运行效果:
out01.gif

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()

运行效果:
out01.gif

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)

运行效果:
out01.gif

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()

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

加入调整视角的代码后:

# 调整的相机视角
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()

修改后运行效果:
out01.gif

5. 总结回顾

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

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

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

原文链接:https://www.cnblogs.com/wang_yb/p/17301528.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【manim动画教程】– 坐标系 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 详解Python中的循环语句的用法

    以下是“详解Python中的循环语句的用法”的完整攻略。 1. 循环语句的概述 在Python中,循环语句是一种常用的控制流语句,它可以让程序重复执行某些代码块。Python中的循环语句有for循环和while循环两种。本攻略将详细讲解Python中的循环语句的用法。 2. for循环的用法 for循环是Python中常用的循环语句,它可以遍历序列中的每个元…

    python 2023年5月13日
    00
  • Python入门之三角函数sin()函数实例详解

    以下是Python入门之三角函数sin()函数实例详解的完整攻略: sin()函数简介 在Python中,sin()函数是一个三角函数,用于计算给定角度的正弦值。sin()函数的参数是一个弧度值,可以使用math库中的radians()函数将角度转换为弧度。以下是一个示例代码: import math angle = 45 radians = math.ra…

    python 2023年5月14日
    00
  • Python 常见的配置文件写法梳理汇总

    使用Markdown格式,以下是Python常见配置文件的写法梳理汇总完整攻略。 Python常见配置文件写法梳理汇总 1. INI 文件 INI 文件是最常用的配置文件之一,它通常被用于Windows操作系统的应用程序中。INI 文件本质上是一个键值对集合,由多个节组成,每个节下面可以有多个键值对。(示例代码见下) ; Python配置文件示例 [data…

    python 2023年6月3日
    00
  • 实例讲解Python爬取网页数据

    针对“实例讲解Python爬取网页数据”的完整攻略,我可以基于以下内容进行讲解: 实例讲解Python爬取网页数据 前言 Python作为脚本语言,可以快速的获取和处理网页数据。随着网络的发展,如何通过Python获取网络数据已经成为一门必不可少的技能。本文将从两个示例开始,带领大家逐步学习如何通过Python来爬取网页数据。 示例1:爬取模拟浏览器 首先,…

    python 2023年5月14日
    00
  • python中sleep函数用法实例分析

    下面是针对“Python中sleep函数用法实例分析”的完整攻略。 sleep函数的作用介绍 time模块中提供了sleep函数,可以让程序暂停执行一段指定的时间。其中,括号中的参数是指暂停时间,以秒为单位。例如:time.sleep(2)表示暂停执行2秒。 sleep函数的用法示例一 下面的示例演示了在控制台输出“I’m sleeping for 2 se…

    python 2023年6月3日
    00
  • python中实现数组和列表读取一列的方法

    Python中实现数组和列表读取一列的方法 在Python中,可以使用列表(list)来实现数组和列表。列表是一种有序的可序列,可以包含任意类型的元素。以下是Python数组和列表的定义和创建方式: # 定义一个空数组 my_array = [] # 定义一个包含元素的数组 my_array = [1, 2, 3, 4, 5] # 定义一个空列表 my_li…

    python 2023年5月13日
    00
  • python轮询机制控制led实例

    下面我将详细讲解“python轮询机制控制led实例”的完整攻略。 1. 轮询机制的概念和作用 轮询机制是指通过不断地循环查询某个状态来实现任务的执行。在实际编程中,轮询机制常被用于实现一些需要不断检测某个外部状态的任务,例如网络通讯、设备操作等。在这种情况下,我们往往需要通过轮询来获取外部状态的变化,并及时作出相应的响应。 在控制led实例的过程中,我们可…

    python 2023年5月19日
    00
  • Python中Tkinter组件Button的具体使用

    下面是Python中Tkinter组件Button的具体使用的攻略。 1. Button组件基础 1.1 Button组件的定义 Button组件是Tkinter组件中最常用的之一,可用于添加按钮和执行单击事件等操作。 1.2 Button组件的创建 在Tkinter中创建Button组件的方法是使用Button(),语法结构如下: button = But…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部