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

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

时间2025-08-03 02:26:41分类IT科技浏览7937
导读:概要 前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 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
企业网站内链优化方法详解(打造内部链接,优化网站用户体验) 优化网址(优化网站工具)