翼度科技»论坛 编程开发 python 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
没有引入坐标系之前,在绘制图形时,也有一个隐含的坐标系,它和屏幕的像素相关。
比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([0, 0]),
横轴坐标的范围大概是 [-3.5, 3.5],纵轴的坐标范围大概是 [-4, 4],这个范围与设置的视频分辨率有关,分辨率设置的越高的话,坐标范围越大。
不知是否还记得,之前的文章中绘制的线或者多边形(比如这个系列第7篇),都是在上面的坐标范围的。
  1. # 范围内的线和多边形
  2. l = Line([-1, 0, 0], [1, 0, 0])
  3. self.play(Create(l), run_time=0.5)
  4. p = Polygon([-3, 1, 0], [-1, 1, 0], [-2, -1, 0])
  5. self.play(Create(p), run_time=0.5)
  6. # 范围外的多边形,运行后会显示补全
  7. p = Polygon([-4, 2, 0], [-1, 5, 0], [-2, -1, 0])
  8. self.play(Create(p), run_time=0.5)
复制代码
引入坐标系之后,绘制图形时就不用局限在屏幕隐含的坐标范围之内,
通过调整坐标的刻度,我们可以基于坐标系中绘制任意范围的图形,而不用担心绘制到屏幕之外去。
manim已经提供了从一维到三维的坐标系对象,下面一一介绍它们的基本使用方法。
1. 数轴

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

  • x_range:设置数轴的范围和间隔
  • length:设置数轴显示的长度
  1. NumberLine(x_range=[-10, 10, 2], length=10, include_numbers=True)
  2. NumberLine(x_range=[-3, 3, 0.5], length=12, include_numbers=True)
  3. NumberLine(
  4.     x_range=[-5, 5 + 1, 1],
  5.     length=6,
  6.     include_numbers=True,
  7.     include_tip=True,
  8.     rotation=10 * DEGREES,
  9. )
复制代码
运行效果:

2. 平面坐标系

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

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

  • x_range:设置X轴的范围和间隔
  • y_range:设置Y轴的范围和间隔
  • x_length:设置X轴显示的长度
  • y_length:设置Y轴显示的长度
  1. NumberPlane(
  2.     x_range=(-4, 11, 1),
  3.     y_range=(-3, 3, 1),
  4.     x_length=3,
  5.     y_length=2,
  6. )
  7. NumberPlane(
  8.     x_range=(-4, 11, 1),
  9.     x_length=3,
  10.     y_length=4,
  11. )
复制代码
运行效果:

2.2 复数平面

复数平面(ComplexPlane)是基于实数平面(NumberPlane)的,参数类似,
只是多了一些标记复数的信息。
  1. plane = ComplexPlane().add_coordinates()
  2. d1 = Dot(plane.n2p(2 + 1j), color=YELLOW)
  3. d2 = Dot(plane.n2p(-3 - 2j), color=YELLOW)
  4. label1 = Tex("2+i").next_to(d1, UR, 0.1)
  5. label2 = Tex("-3-2i").next_to(d2, UR, 0.1)
复制代码
运行效果:

3. 极坐标系

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

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

4. 笛卡尔坐标系

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

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

  • x_axis_config:配置X轴如何显示的参数
  • y_axis_config:配置Y轴如何显示的参数
比如下面的示例中, 配置了与X轴不一样刻度的Y轴。
  1. ax = Axes(
  2.     x_range=[0, 10, 1],
  3.     y_range=[-2, 6, 1],
  4.     x_length=6,
  5.     tips=False,
  6.     axis_config={"include_numbers": True},
  7.     y_axis_config={"scaling": LogBase(custom_labels=True)},
  8. )
  9. # x_min 必须 > 0,因为 x=0 时,y是负无穷
  10. graph = ax.plot(lambda x: x**2, x_range=[0.001, 10], use_smoothing=False)
复制代码
运行效果:

4.2 三维

三维的笛卡尔坐标系(ThreeDAxes)与二维坐标系的参数类似,只是多了一个维度(Z轴)的配置,
其配置参数与X轴Y轴类似。
显示三维图形时,有2点需要额外注意,
一是场景要继承 ThreeDScene,二是要调整下默认的相机位置,也就是视角的位置,默认视角是从Z轴顶部向下看的。
  1. # 默认的相机视角
  2. class CoordinateSample(ThreeDScene):
  3.     def construct(self):
  4.         axes = ThreeDAxes(y_length=8)
  5.             circle = Circle(color=BLUE, radius=2)
  6.         vg = VGroup(axes, circle)
  7.         self.play(Create(vg), run_time=2)
  8.         self.wait()
复制代码
运行效果如下,很难看出是三维的坐标系统:

加入调整视角的代码后:
  1. # 调整的相机视角
  2. class CoordinateSample(ThreeDScene):
  3.     def construct(self):
  4.         axes = ThreeDAxes(y_length=8)
  5.             circle = Circle(color=BLUE, radius=2)
  6.         vg = VGroup(axes, circle)
  7.         # 调整相机视角的代码 phi是与Z轴之间的角度,theta是围绕Z轴旋转的角度
  8.         self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
  9.         self.play(Create(vg), run_time=2)
  10.         self.wait()
复制代码
修改后运行效果:

5. 总结回顾

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

  • NumberLine:数轴
  • NumberPlane:实数平面
  • ComplexPlane:复数平面
  • PolarPlane:极坐标系
  • Axes:二维笛卡尔坐标系
  • ThreeDAxes:三维笛卡尔坐标系
制作函数相关的数学动画,或者物理定律相关的动画时,借助坐标系可以更清晰直观的的表达变换的规律。
本文关联的微信视频号短视频:


来源:https://www.cnblogs.com/wang_yb/p/17301528.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具