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

manim,动画教程,基本,图形 · 浏览次数 : 317

小编点评

**平面几何中使用 manim绘制各种基本图形的方法** **1. 基本图形** * **点:** `Point()` * **线:** `Line()` * **虚线:** `Line()` * **箭头线:** `Line()` * **圆:** `Circle()` * **椭圆:** `Ellipse()` * **圆弧:** `Arc()` * **圆角矩形:** `RoundedRectangle()` **2. 多边形** * **三角形:** `Triangle()` * **四边形:** `Rectangle()` * **圆角矩形:** `RoundedRectangle()` * **正多边形:** `RegularPolygon()` **3. 特殊图形** * **圆:** `Circle()` * **圆角矩形:** `RoundedRectangle()` * **正多边形:** `RegularPolygon()` **4.绘制方法** * 使用 `create`方法创建图形 * 使用 `play`方法绘制图形 * 使用 `arrange`方法排列图形 * 使用 `RIGHT`参数排列图形 * 使用 `buff`参数控制图形大小 **5. 示例** ```python # 点 point = Point(x=3, y=4) # 线 line = Line(start_point=Point(x=1, y=2), end_point=Point(x=5, y=4)) # 圆 circle = Circle(radius=2) # 正多边形 regular_polygon = RegularPolygon(n=10) ``` **6.总结** 使用 manim绘制各种基本图形的方法方便快捷。通过提供点坐标、角度或半径等信息,可以绘制各种图形,包括点、线、圆、椭圆、圆弧、圆角矩形、正多边形、圆、圆角矩形和正多边形。

正文

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

1. 点

是最简单图形,也是其他所有图形的基础。
绘制其他任何图形时,都是用来定位的。

manim中生成一个点很方便,只要给定一个坐标即可。
这里的坐标包含 [x, y, z]3个维度,如果绘制二维图形,将第三个坐标 z固定为 0

class DotSample(Scene):
    def construct(self):
        # 绘制 9个点
        for x in range(-1, 2):
            for y in range(1, -2, -1):
                p = Dot([x, y, 0])
                self.play(Create(p), run_time=0.5)

按照 3x3的格式绘制9个点

manim -p .\samples.py DotSample

out01.gif

2. 线

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

2.1 直线

提供任意2个点,manim通过 Line来绘制线。

class LineSample(Scene):
    def construct(self):
        self._lines()

    def _lines(self):
        # 绘制 3 条线
        l = Line([-1, 1, 0], [1, 1, 0])
        self.play(Create(l), run_time=0.5)

        l = Line([-1, 0, 0], [1, 0, 0])
        self.play(Create(l), run_time=0.5)

        l = Line([-1, -1, 0], [1, -1, 0])
        self.play(Create(l), run_time=0.5)

运行效果:
out.gif

2.2 带箭头的线

绘制带箭头的线同样只要提供2个点。
只是绘制的对象不用 Line,而是用 Arrow

class LineSample(Scene):
    def construct(self):
        self._arrows()

    def _arrows(self):
        a = Arrow([-1, 1, 0], [1, 1, 0])
        self.play(Create(a), run_time=0.5)

        a = Arrow([-1, 0, 0], [1, 0, 0])
        self.play(Create(a), run_time=0.5)

        a = Arrow([-1, -1, 0], [1, -1, 0])
        self.play(Create(a), run_time=0.5)

运行效果:
out.gif

2.3 虚线

绘制虚线使用 DashedLine

class LineSample(Scene):
    def construct(self):
        self._dashedLines()
        self.wait()

    def _dashedLines(self):
        dl = DashedLine([-1, 1, 0], [1, 1, 0])
        self.play(Create(dl), run_time=0.5)

        dl = DashedLine([-1, 0, 0], [1, 0, 0])
        self.play(Create(dl), run_time=0.5)

        dl = DashedLine([-1, -1, 0], [1, -1, 0])
        self.play(Create(dl), run_time=0.5)

运行效果:
out.gif

3. 圆

绘制只要提供半径即可,圆心默认在屏幕的中心。
绘制圆使用 Circle

class CircleSample(Scene):
    def construct(self):
        self._circles()
        self.wait()

    def _circles(self):
        c = Circle(radius=1)
        self.play(Create(c), run_time=0.5)

        c = Circle(radius=2)
        self.play(Create(c), run_time=0.5)

        c = Circle(radius=3)
        self.play(Create(c), run_time=0.5)

运行效果:
out.gif

3.1 椭圆

manim也支持绘制椭圆,使用 Ellipse
绘制椭圆的两个参数 widthheight分别控制椭圆最大宽度和最大高度。

class CircleSample(Scene):
    def construct(self):
        self._ellipses()
        self.wait()

    def _ellipses(self):
        e = Ellipse(width=1, height=0.5)
        self.play(Create(e), run_time=0.5)

        e = Ellipse(width=2, height=1)
        self.play(Create(e), run_time=0.5)

        e = Ellipse(width=3, height=1.5)
        self.play(Create(e), run_time=0.5)

运行效果:
out.gif

3.2 圆弧

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

  1. angle:圆弧的弧度
  2. start_angle: 开始的角度,默认 0
  3. radius:圆弧的半径
class CircleSample(Scene):
    def construct(self):
        self._arcs()
        self.wait()

    def _arcs(self):
        # 90度圆弧,半径1
        a = Arc(angle=PI / 2, radius=1)
        self.play(Create(a), run_time=0.5)

        # 180度圆弧,半径2
        a = Arc(angle=PI, radius=2)
        self.play(Create(a), run_time=0.5)

        # 30度圆弧,半径2,从270度开始绘制
        a = Arc(angle=PI / 6, start_angle=PI * 1.5, radius=2)
        self.play(Create(a), run_time=0.5)

运行效果:
out.gif

4. 多边形

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

4.1 等边三角形

manim中专门有绘制等边三角形的对象 Triangle

class PolygonSample(Scene):
    def construct(self):
        self._triangles()
        self.wait()

    def _triangles(self):
        t = Triangle()
        self.play(Create(t))

运行效果:
out.gif

4.2 四边形

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

4.2.1 正方形

绘制正方形主要有一个参数,就是 side_length(正方形的边长)。

class PolygonSample(Scene):
    def construct(self):
        self._squares()
        self.wait()

    def _squares(self):
        s = Square(side_length=1)
        self.play(Create(s), run_time=0.5)

        s = Square(side_length=1.5)
        self.play(Create(s), run_time=0.5)

        s = Square(side_length=2)
        self.play(Create(s), run_time=0.5)

运行效果:
out.gif

4.2.2 矩形

绘制矩形有两个主要的参数,分别代表矩形的高 height和宽 width

class PolygonSample(Scene):
    def construct(self):
        self._rectangles()
        self.wait()

    def _rectangles(self):
        r = Rectangle(width=1.5, height=1)
        self.play(Create(r), run_time=0.5)

        r = Rectangle(width=2, height=1.5)
        self.play(Create(r), run_time=0.5)

        r = Rectangle(width=3, height=2)
        self.play(Create(r), run_time=0.5)

运行效果:
out.gif

4.2.3 圆角矩形

圆角矩形和矩形相比,多了一个参数corner_radius用来控制矩形四个角的弧度半径,
也就是控制矩形四个角的圆滑程度。

class PolygonSample(Scene):
    def construct(self):
        self._rounded_rectangles()
        self.wait()

    def _rounded_rectangles(self):
        r = RoundedRectangle(corner_radius=0.2, width=1.5, height=1)
        self.play(Create(r), run_time=0.5)

        r = RoundedRectangle(corner_radius=0.4, width=2, height=1.5)
        self.play(Create(r), run_time=0.5)

        r = RoundedRectangle(corner_radius=0.6, width=3, height=2)
        self.play(Create(r), run_time=0.5)

运行效果:
out.gif

4.3 任意多边形

除了三角形和四边形,manim还提供了一个通用的Polygon对象,它会依次连接传入的坐标点列表,绘制任意多边形。

class PolygonSample(Scene):
    def construct(self):
        self._polygons()
        self.wait()

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

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

运行效果:
out.gif

4.4 正多边形

虽然 manim提供了绘制任意多边形的对象 Polygon,利用Polygon绘制正多边形理论上是完全可行的。
不过,要自己去计算各个正多边形的坐标点显然有些费时费力,
所以,manim中还提供了一个专门用来绘制正多边形的对象 RegularPolygon.

class PolygonSample(Scene):
    def construct(self):
        self._reguler_polygons()
        self.wait()

    def _reguler_polygons(self):
        p1 = RegularPolygon(n=6)  # 正六边形
        p2 = RegularPolygon(n=8)  # 正八边形
        p3 = RegularPolygon(n=10)  # 正十边形

        vg = VGroup(p1, p2, p3)
        vg.arrange(RIGHT, buff=SMALL_BUFF)
        self.play(Create(vg))

运行效果:
out.gif

总结回顾

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

  1. 只要提供点坐标就能绘制的图形有:点,线(直线,虚线,箭头线),还有任意多边形。
  2. 需要提供角度或者半径信息的图形有:圆,椭圆,圆弧,圆角矩形
  3. 提供边长信息的图形有:正方形,矩形
  4. 最后,还有一个特殊的专门用来绘制正多边形的对象

本文关联的微信视频号短视频:
manim-基本图形-视频号.png

与【manim动画教程】-- 基本图形相似的内容:

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

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

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

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

【manim】之目录动画

概要 最近,结合视频剪辑工具剪映制作短视频时, 如果不是数学相关的内容,使用视频剪辑工具配置字幕,添加图片等等比 manim更加方便。 所以,用 manim封装一个目录的动画,用来配合剪辑工具中的其他资源。 代码封装 基于manim封装一个目录显示的 class。 主要属性就是 titles,也就是

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

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

【manim动画教程】-- 安装

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

【manim】之圆规动画

概要 前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 manim 库的动画函数。 manim 本身就是做动画的库,所以,基于它封装自定义的动画非常方便。 动画原理 对于单个的元素,manim本身就提供了非常多的动画函数。 比如:创建/消除的动画,移动元素的动画,旋转元素的动画

【manim】之滚动字幕

概要 manim 是一个做数学视频的 python 库,这个库功能非常强大。具体可以参考官方介绍:https://github.com/ManimCommunity/manim/ 它本身只是封装数学相关的几何体和一些基础动画,所以,制作视频时,需要进一步封装更复杂的动画来满足视频的要求。最近做的一个

manim边学边做--MathTex

上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,对于复杂的数学公式,可以使用MathTex类。 MathTex类继承自SingleStringMathTex,在其基础之上增加了更多的功能。其实,MathTex是制作数学动画时常用的类,反而SingleStringMa

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

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

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

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