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

打印 上一主题 下一主题

主题 762|帖子 762|积分 2286

制作数学视频时,各类几何图形是使用最频繁的。
一般来说,常用的几何图形包括:线以及多边形
1. 点

是最简单图形,也是其他所有图形的基础。
绘制其他任何图形时,都是用来定位的。
manim中生成一个点很方便,只要给定一个坐标即可。
这里的坐标包含 [x, y, z]3个维度,如果绘制二维图形,将第三个坐标 z固定为 0。
  1. class DotSample(Scene):
  2.     def construct(self):
  3.         # 绘制 9个点
  4.         for x in range(-1, 2):
  5.             for y in range(1, -2, -1):
  6.                 p = Dot([x, y, 0])
  7.                 self.play(Create(p), run_time=0.5)
复制代码
按照 3x3的格式绘制9个点
  1. manim -p .\samples.py DotSample
复制代码

2. 线

manim的线其实都是线段,绘制线只要提供两个点的坐标。
2.1 直线

提供任意2个点,manim通过 Line来绘制线。
  1. class LineSample(Scene):
  2.     def construct(self):
  3.         self._lines()
  4.     def _lines(self):
  5.         # 绘制 3 条线
  6.         l = Line([-1, 1, 0], [1, 1, 0])
  7.         self.play(Create(l), run_time=0.5)
  8.         l = Line([-1, 0, 0], [1, 0, 0])
  9.         self.play(Create(l), run_time=0.5)
  10.         l = Line([-1, -1, 0], [1, -1, 0])
  11.         self.play(Create(l), run_time=0.5)
复制代码
运行效果:

2.2 带箭头的线

绘制带箭头的线同样只要提供2个点。
只是绘制的对象不用 Line,而是用 Arrow。
  1. class LineSample(Scene):
  2.     def construct(self):
  3.         self._arrows()
  4.     def _arrows(self):
  5.         a = Arrow([-1, 1, 0], [1, 1, 0])
  6.         self.play(Create(a), run_time=0.5)
  7.         a = Arrow([-1, 0, 0], [1, 0, 0])
  8.         self.play(Create(a), run_time=0.5)
  9.         a = Arrow([-1, -1, 0], [1, -1, 0])
  10.         self.play(Create(a), run_time=0.5)
复制代码
运行效果:

2.3 虚线

绘制虚线使用 DashedLine。
  1. class LineSample(Scene):
  2.     def construct(self):
  3.         self._dashedLines()
  4.         self.wait()
  5.     def _dashedLines(self):
  6.         dl = DashedLine([-1, 1, 0], [1, 1, 0])
  7.         self.play(Create(dl), run_time=0.5)
  8.         dl = DashedLine([-1, 0, 0], [1, 0, 0])
  9.         self.play(Create(dl), run_time=0.5)
  10.         dl = DashedLine([-1, -1, 0], [1, -1, 0])
  11.         self.play(Create(dl), run_time=0.5)
复制代码
运行效果:

3. 圆

绘制只要提供半径即可,圆心默认在屏幕的中心。
绘制圆使用 Circle。
  1. class CircleSample(Scene):
  2.     def construct(self):
  3.         self._circles()
  4.         self.wait()
  5.     def _circles(self):
  6.         c = Circle(radius=1)
  7.         self.play(Create(c), run_time=0.5)
  8.         c = Circle(radius=2)
  9.         self.play(Create(c), run_time=0.5)
  10.         c = Circle(radius=3)
  11.         self.play(Create(c), run_time=0.5)
复制代码
运行效果:

3.1 椭圆

manim也支持绘制椭圆,使用 Ellipse。
绘制椭圆的两个参数 width和 height分别控制椭圆最大宽度和最大高度。
  1. class CircleSample(Scene):
  2.     def construct(self):
  3.         self._ellipses()
  4.         self.wait()
  5.     def _ellipses(self):
  6.         e = Ellipse(width=1, height=0.5)
  7.         self.play(Create(e), run_time=0.5)
  8.         e = Ellipse(width=2, height=1)
  9.         self.play(Create(e), run_time=0.5)
  10.         e = Ellipse(width=3, height=1.5)
  11.         self.play(Create(e), run_time=0.5)
复制代码
运行效果:

3.2 圆弧

manim中绘制圆弧主要有三个参数:

  • angle:圆弧的弧度
  • start_angle: 开始的角度,默认 0
  • radius:圆弧的半径
  1. class CircleSample(Scene):
  2.     def construct(self):
  3.         self._arcs()
  4.         self.wait()
  5.     def _arcs(self):
  6.         # 90度圆弧,半径1
  7.         a = Arc(angle=PI / 2, radius=1)
  8.         self.play(Create(a), run_time=0.5)
  9.         # 180度圆弧,半径2
  10.         a = Arc(angle=PI, radius=2)
  11.         self.play(Create(a), run_time=0.5)
  12.         # 30度圆弧,半径2,从270度开始绘制
  13.         a = Arc(angle=PI / 6, start_angle=PI * 1.5, radius=2)
  14.         self.play(Create(a), run_time=0.5)
复制代码
运行效果:

4. 多边形

如果制作几何相关的数学视频,那么多边形绝对是使用最多的。
manim对多边形的支持非常完善,常用的主要以下几种:
4.1 等边三角形

manim中专门有绘制等边三角形的对象 Triangle。
  1. class PolygonSample(Scene):
  2.     def construct(self):
  3.         self._triangles()
  4.         self.wait()
  5.     def _triangles(self):
  6.         t = Triangle()
  7.         self.play(Create(t))
复制代码
运行效果:

4.2 四边形

四边形比三角形应用的更广,所以 manim也提供了更多绘制四边形的方法。
4.2.1 正方形

绘制正方形主要有一个参数,就是 side_length(正方形的边长)。
  1. class PolygonSample(Scene):
  2.     def construct(self):
  3.         self._squares()
  4.         self.wait()
  5.     def _squares(self):
  6.         s = Square(side_length=1)
  7.         self.play(Create(s), run_time=0.5)
  8.         s = Square(side_length=1.5)
  9.         self.play(Create(s), run_time=0.5)
  10.         s = Square(side_length=2)
  11.         self.play(Create(s), run_time=0.5)
复制代码
运行效果:

4.2.2 矩形

绘制矩形有两个主要的参数,分别代表矩形的高 height和宽 width。
  1. class PolygonSample(Scene):
  2.     def construct(self):
  3.         self._rectangles()
  4.         self.wait()
  5.     def _rectangles(self):
  6.         r = Rectangle(width=1.5, height=1)
  7.         self.play(Create(r), run_time=0.5)
  8.         r = Rectangle(width=2, height=1.5)
  9.         self.play(Create(r), run_time=0.5)
  10.         r = Rectangle(width=3, height=2)
  11.         self.play(Create(r), run_time=0.5)
复制代码
运行效果:

4.2.3 圆角矩形

圆角矩形和矩形相比,多了一个参数corner_radius用来控制矩形四个角的弧度半径,
也就是控制矩形四个角的圆滑程度。
  1. class PolygonSample(Scene):
  2.     def construct(self):
  3.         self._rounded_rectangles()
  4.         self.wait()
  5.     def _rounded_rectangles(self):
  6.         r = RoundedRectangle(corner_radius=0.2, width=1.5, height=1)
  7.         self.play(Create(r), run_time=0.5)
  8.         r = RoundedRectangle(corner_radius=0.4, width=2, height=1.5)
  9.         self.play(Create(r), run_time=0.5)
  10.         r = RoundedRectangle(corner_radius=0.6, width=3, height=2)
  11.         self.play(Create(r), run_time=0.5)
复制代码
运行效果:

4.3 任意多边形

除了三角形和四边形,manim还提供了一个通用的Polygon对象,它会依次连接传入的坐标点列表,绘制任意多边形。
  1. class PolygonSample(Scene):
  2.     def construct(self):
  3.         self._polygons()
  4.         self.wait()
  5.     def _polygons(self):
  6.         p = Polygon([-3, 1, 0], [-1, 1, 0], [-2, -1, 0])
  7.         self.play(Create(p), run_time=0.5)
  8.         p = Polygon([1, 1, 0], [2, 0, 0], [3, 1, 0], [3, -1, 0], [1, -1, 0])
  9.         self.play(Create(p), run_time=0.5)
复制代码
运行效果:

4.4 正多边形

虽然 manim提供了绘制任意多边形的对象 Polygon,利用Polygon绘制正多边形理论上是完全可行的。
不过,要自己去计算各个正多边形的坐标点显然有些费时费力,
所以,manim中还提供了一个专门用来绘制正多边形的对象 RegularPolygon.
  1. class PolygonSample(Scene):
  2.     def construct(self):
  3.         self._reguler_polygons()
  4.         self.wait()
  5.     def _reguler_polygons(self):
  6.         p1 = RegularPolygon(n=6)  # 正六边形
  7.         p2 = RegularPolygon(n=8)  # 正八边形
  8.         p3 = RegularPolygon(n=10)  # 正十边形
  9.         vg = VGroup(p1, p2, p3)
  10.         vg.arrange(RIGHT, buff=SMALL_BUFF)
  11.         self.play(Create(vg))
复制代码
运行效果:

总结回顾

本篇主要介绍了平面几何中,使用 manim绘制各种基本图形的方法。

  • 只要提供点坐标就能绘制的图形有:点,线(直线,虚线,箭头线),还有任意多边形。
  • 需要提供角度或者半径信息的图形有:圆,椭圆,圆弧,圆角矩形
  • 提供边长信息的图形有:正方形,矩形
  • 最后,还有一个特殊的专门用来绘制正多边形的对象
本文关联的微信视频号短视频:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表