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

manim,动画教程,坐标系 · 浏览次数 : 308

小编点评

**坐标系简介** 坐标系是用来表示图形位置的系统。在绘制图形之前,需要在屏幕隐含的坐标范围内确定绘制的范围。坐标系可以是一维、二维或三维的。 **一维坐标系** * 数轴 (NumberLine):以数轴上的点表示,每个点代表一个数字值。 * 平面坐标系 (NumberPlane):将数轴投影到平面上,形成一个二维图形。 * 极坐标系 (PolarPlane):以角度和距离表示,每个点代表一个位置。 **二维笛卡尔坐标系** * 二维笛卡尔坐标系是在平面坐标系之上添加一个维度的地方,可以配置坐标轴的方向和刻度。 **三维笛卡尔坐标系** * 三维笛卡尔坐标系是在三维坐标系之上添加一个维度的地方,可以配置坐标轴的方向、刻度和大小。 **其他坐标系** * 笛卡尔坐标系 * 极坐标系 * 三维笛卡尔坐标系

正文

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

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

与【manim动画教程】-- 坐标系相似的内容:

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

没有引入坐标系之前,在绘制图形时,也有一个隐含的坐标系,它和屏幕的像素相关。 比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([0, 0]), 横轴坐标的范围大概是 [-3.5, 3.5],纵轴的坐标范围大概是 [-4, 4],这个范围与设置的视频分辨率有关,分辨率设置的越高的话,坐标范围越

【manim动画教程】-- 基本图形

制作数学视频时,各类几何图形是使用最频繁的。 一般来说,常用的几何图形包括:点,线,圆以及多边形。 1. 点 点是最简单图形,也是其他所有图形的基础。 绘制其他任何图形时,都是用点来定位的。 manim中生成一个点很方便,只要给定一个坐标即可。 这里的坐标包含 [x, y, z]3个维度,如果绘制二

【manim动画教程】-- 安装

manim是基于python语言开发的开源框架,是由 3blue1brown 开发的。 本来是他们自己用来制作数学视频用的,因为其友好的API和漂亮的UI效果,在开源之后,立刻流行起来。 原先开源的地址是: 后来托管给了社区,现在安装最新的版本请从这里下载: 改版之后,命令行更加清晰,简单。 支持的

【manim动画教程】-- 图形样式

manim绘制图形时,除了上一节提到的那些必须的参数,还有一些可选的参数, 这些参数可以控制图形显示的样式。 绘制各类基本图形(点,线,圆,多边形等)时,每个图形都有自己的默认的样式,比如上一节的图形, 有的默认是白色,有的默认是红色。 控制图形样式的参数最常用的有以下四个: stroke_widt

【manim动画教程】-- 文字和公式

manim中提供了两种方式来表示文字信息,一种是 Text系列,一种是 Tex系列。 从目前我自己的使用的体验来看, Text系列在显示文字信息方面,提供了更多的的属性来调整显示效果。如果有大段的文字要排版,或者对文字的显示效果要求高的话,建议使用 Text。 而 Tex系列最大的优势是支持 Lat

【manim动画教程】-- 文本样式

文本的样式主要指颜色和字体相关的属性设置。 对于manim的两个文本对象 Text和 Tex来说, Text对象有更多的属性可以调整样式,相对来说,由于 Tex主要用来显示数学公式,所以关于样式的属性要少一些。 下面介绍一些我在视频制作时最常用的一些颜色和字体相关的属性。 1. 颜色相关 颜色设置主

【manim动画教程】--常用动画效果

manim的主要功能就是制作动画,因此它提供了各类丰富的动画效果, 本篇主要介绍其中最常用的几种动画效果。 至于特殊的动画效果,以及自定义动画效果的方法以后再另外介绍。 1. 创建效果 展示某个元素或者文字时,一下子就全显示出来会显得比较突兀,通过创建效果的动画,让各个元素的出现更加的自然。 常用的

【manim动画教程】--高级动画效果

在常用的动画效果中,介绍了一些元素的创建,销毁,移动和变换的方法,这些方法都是针对单个动画的。 如果需要多个动画互相关联,或者元素需要有更复杂的运动方式,那么,仅仅依靠常用的动画效果可能就无法满足要求了。 本篇的高级动画效果主要介绍一些更加灵活的元素运动方式,如何组合多个动画,以及如何联动多个动画的

【manim动画教程】--相机

相机(Camera)在二维的场景下使用不多,一般在3D场景中提及的比较多。 相机相当于我们看动画的视角,简单来理解的话,相当于我们的眼睛(实际情况会复杂一些,相机还有其他一些辅助功能)。 默认的相机焦点在屏幕的中心位置,相机默认是以俯视的视角查看所有的元素。 之前的介绍的常用动画效果和高级动画效果,

【manim动画教程】--目录(完结)

manim是一个生成数学教学视频的动画引擎。 它用编程的方式创建精美的数学动画,让数学更加易懂。 本教程简单介绍了 manim 的基本使用方式,基于 v0.17.2 版本 manim 安装 manim是基于python语言开发的开源框架,是由 3blue1brown 开发的。 本来是他们自己用来制作