首页IT科技圆规讲解(【manim】之圆规动画)

圆规讲解(【manim】之圆规动画)

时间2025-09-16 02:47:41分类IT科技浏览10253
导读:概要 前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 manim 库的动画函数。...

概要

前端时间做尺规作图相关的动画的时候                  ,封装了一个圆规的动画                             ,顺便研究了下 manim 库的动画函数                    。

manim 本身就是做动画的库          ,所以              ,基于它封装自定义的动画非常方便                            。

动画原理

对于单个的元素                            ,manim本身就提供了非常多的动画函数         。

比如:创建/消除的动画               ,移动元素的动画          ,旋转元素的动画等等                            ,具体可以参考: Animations

如果是做一些简单的演示视频的话                    ,这些内置的动画函数满足要求绰绰有余               。

但是     ,对于多个元素联动的动画                            ,则需要编写各个元素之间的联动规则                         ,来封装符合要求的动画                             。

下面以圆规动画为例,演示多元素动画如何封装             。

圆规动画目的还是画出一个 圆弧                       ,只是在绘制的圆弧的过程中展示了圆弧的起点                              ,终点以及连接起点终点之间的线          。

这样     ,实际使用圆规作图的时候                  ,可以更好的理解 圆弧是如何画出来的                              。

函数的签名如下:

def ruler(sc: Scene, p1, p2, angle=PI, axis=OUT): """ 圆规动画 Parameters --------- sc 绘制动画的场景 p1 代表圆规的针                             ,绘制时不动的点 p2 代表圆规的笔芯          ,绘制圆弧的点 angle 绘制圆弧的角度              ,默认PI                            ,相当于绘制半个圆 axis 只有2个值 IN/OUT               ,分别表示顺时针还是逆时针作弧 """ # 省略                  。     。                              。 return arc

各个参数的含义参见注释                       。

实现动画的思路如下:

构建3个元素          ,也就是d1(根据参数中p1坐标绘制的点),d2(根据参数中p2坐标绘制的点)以及 dl(连接p1和p2的虚线) 设置dl的动画                            ,随着 d1和d2变化不断重新绘制(这里 d1其实是不会变的) 再设置圆弧的动画                    ,随着 d2的变动     ,不断绘制新的圆弧 通过 manim自带的动画函数让 d2先动                            ,其他动画则会随之一起 最后删除不必要的元素                         ,只保留圆弧在 场景(sc)中 def ruler(sc: Scene, p1, p2, angle=PI, axis=OUT): """ 圆规动画 Parameters --------- sc 绘制动画的场景 p1 代表圆规的针,绘制时不动的点 p2 代表圆规的笔芯                       ,绘制圆弧的点 angle 绘制圆弧的角度                              ,默认PI     ,相当于绘制半个圆 axis 只有2个值 IN/OUT                  ,分别表示顺时针还是逆时针作弧 """ d1 = Dot(point=p1, color=RED) d2 = Dot(point=p2, color=GREEN) dl = DashedLine(d1.get_center(), d2.get_center()) r = np.linalg.norm(p2 - p1) arc = ArcBetweenPoints(p2, p2) dl.add_updater(lambda z: z.become(DashedLine(d1.get_center(), d2.get_center()))) if np.array_equal(axis, OUT): arc.add_updater( lambda z: z.become( ArcBetweenPoints(p2, d2.get_center(), radius=r, stroke_color=GREEN) ) ) if np.array_equal(axis, IN): arc.add_updater( lambda z: z.become( ArcBetweenPoints(d2.get_center(), p2, radius=r, stroke_color=GREEN) ) ) sc.add(d1, d2, dl, arc) sc.play( Rotate( d2, about_point=d1.get_center(), axis=axis, angle=angle, rate_func=linear, ) ) arc.clear_updaters() dl.clear_updaters() sc.remove(d1, d2, dl) return arc

动画效果

封装之后                             ,使用起来非常简单:

# -*- coding: utf-8 -*- from manim import * import numpy as np class Sample(Scene): def construct(self): ruler(self, np.array([-1, 0, 0]), np.array([-1, 1, 0])) ruler(self, np.array([1, 0, 0]), np.array([1, 1, 0]), axis=IN) self.wait()

上面演示了逆时针(默认是逆时针)和顺时针方式绘制半圆。

各个元素的颜色等相关属性          ,没有暴露到函数参数中              ,可以直接在代码中修改                         。

这里主要演示如何基于 manim制作多元素动画的                            。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
企业网站SEO 优化网站响应时间的方法(提高用户体验,增加转化率)