今天,我们将介绍 Manim 中两个用于交替变换的动画类:CyclicReplaceSwap

无论是在展示数学概念的动态变化,还是在图形设计中呈现元素的巧妙交互,这两个动画类都扮演着重要角色。

它们以各自独特的方式,为我们提供了丰富的创意表达空间。

  1. CyclicReplace:循环替换一组对象的位置
  2. Swap:交换两个特定对象的位置

1. 动画概述

1.1. CyclicReplace

当你需要循环替换一组对象的位置时,CyclicReplace 是一个非常有用的动画类。

例如,有一组按顺序排列的元素,并且想要给人一种元素依次循环移动位置的视觉效果,类似于一个循环队列的元素循环操作,那么使用 CyclicReplace 可以很好地实现这一效果。

它可以用于展示元素之间的循环依赖关系,或者周期性的位置调整,给人一种周期性变化的直观感受。

CyclicReplace 的特点是将一组 Mobject按照某种循环顺序进行位置交换。

比如,对于一组元素 [A, B, C, D],它可能会将 A 的位置替换为 B 的位置,B 的位置替换为 C 的位置,以此类推,最后将 D 的位置替换为 A 的位置。

它的参数主要有:

参数名称 类型 说明
mobjects [Mobject] 要进行变换的 mobject 列表
path_arc float mobjects 到达目标位置所遵循的弧的角度

1.2. Swap

Swap 动画类适用于需要交换两个特定对象位置的场景。

当你有两个对象,你想清晰地展示它们位置的互换时,使用 Swap 动画可以实现直接交换位置的效果。

常见的应用场景包括交换等式中的两个元素,交换图表中的两个数据点或交换布局中的两个元素,以强调它们的等价性或某种关联关系。

也可以用于对比前后两个对象位置不同但功能或属性相同的情况,通过交换位置来突出它们的互换性。

CyclicReplace 不同,Swap 主要针对两个对象进行操作。

它将精确地交换这两个对象的位置,使它们在动画结束时位置互换。

它的参数主要有:

参数名称 类型 说明
mobjects [Mobject] 参与交换的 Mobject
path_arc float 象在交换过程中所遵循的弧的角度

2. 使用示例

下面通过示例来演示在哪些场景下可以使用上面的两个动画类。

2.1. 元素的循环移动

这个示例展示了三个不同形状(圆形正方形三角形)的循环位置替换,直观地体现了 CyclicReplace 如何循环移动一组对象。

circle = Circle()
square = Square()
triangle = Triangle() shapes = VGroup(circle, square, triangle)
shapes.arrange(RIGHT) self.add(shapes)
self.play(CyclicReplace(*shapes))
self.play(CyclicReplace(*shapes))
self.play(CyclicReplace(*shapes))

2.2. 模拟循环队列的元素移动

这个示例模拟了一个简单的循环队列,数字 15 按顺序排列,通过 CyclicReplace 动画展示了它们像在循环队列中一样循环移动位置。

numbers = [Text(str(i)) for i in range(1, 6)]
number_group = VGroup(*numbers).arrange(RIGHT) self.add(number_group)
self.play(CyclicReplace(*number_group))
self.play(CyclicReplace(*number_group))
self.play(CyclicReplace(*number_group))
self.play(CyclicReplace(*number_group))
self.play(CyclicReplace(*number_group))

2.3. 交换等式两边的元素

在数学等式的场景中,先展示一个简单的等式 x + 5 = 10,然后使用 Swap 交换等式中的元素。

eq = MathTex(r"x + 5 = \quad 10")
eq[0][0].set_color(GREEN)
eq[0][2].set_color(BLUE)
eq[0][4:6].set_color(RED) self.add(eq)
self.play(Swap(eq[0][0], eq[0][2]))
self.wait()
self.play(Swap(eq[0][0:3], eq[0][4:6]))

2.4. 对称交换两个图形的位置

这个示例通过交换左右两个不同图形(圆形正方形)的位置,展示了 Swap 在图形布局中用于突出对称关系位置交换的效果。

left_circle = Circle().shift(LEFT)
right_square = Square().shift(RIGHT) self.add(left_circle, right_square)
self.wait(0.5)
self.play(Swap(left_circle, right_square))

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(swap.py),

下载地址: 完整代码 (访问密码: 6872)

manim边做边学--交替变换的更多相关文章

  1. 边做边学入门微信小程序之仿豆瓣评分

    微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...

  2. Batch Normalization原理及其TensorFlow实现——为了减少深度神经网络中的internal covariate shift,论文中提出了Batch Normalization算法,首先是对”每一层“的输入做一个Batch Normalization 变换

    批标准化(Bactch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanish ...

  3. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

  4. WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画

    原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同 ...

  5. 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good

    作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...

  6. 【Leetcode 做题学算法周刊】第四期

    首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...

  7. Cocos Creator绕远做圆周运动,且变换运动物体的角度

    需求:绕远做圆周运动 并且精灵的角度要随着位置的改变而改变 网上有很多做圆周运动的代码,但是要不然就是角度不变 要不然就是cocos版本老旧 摘了一段3.x的圆周运动,自己加了角度变换 圆周运动,已知 ...

  8. 做fzu oj 1045 做减法学到的sprintf()函数

    题目 做题一直输不出答案,于是就上网去百度了这题的解题,发现解答十分的简短,而且其中我看见了平时没见过的函数,sprintf(). 于是就百度sprintf()的使用. 如下: 函数功能:把格式化的数 ...

  9. 【Leetcode 做题学算法周刊】第一期

    首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...

  10. 【Leetcode 做题学算法周刊】第二期

    首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...

随机推荐

  1. vite3+vue3 实现前端部署加密混淆 javascript-obfuscator

    安装 pnpm install javascript-obfuscator 安装之后 在项目根目录新建一个 obfuscator.js 在 obfuscator.js 写入以下代码 直接复制粘贴 ` ...

  2. nemu-wsl-环境配置

    实在是不愿意用学校的虚拟平台,觉得在自己的电脑上留存一部分真的很有意思,也想捣鼓一下,于是在自己电脑上配置下最基本的环境,做下记录 准备好wsl 因为要求环境是 Ubuntu 18.04 和 gcc- ...

  3. UML 基础:类图

    这是关于统一建模语言.即UML 里采用的基本图的一系列文章的一部分.在我 先前关于序列图的文章 里,我把重点从 UML 1.4 版,转移到 OMG的采用UML 2.0版草案规范(又称为UML 2).在 ...

  4. golang之常用标准库汇总

    1. import "runtime/debug" func Stack func Stack() []byte Stack 返回格式化的go程的调用栈踪迹. 对于每一个调用栈,它 ...

  5. Codeforces Round #826 (Div

    Codeforces Round #826 (Div. 3) Minimize the Thickness 给定数组a,要求将数组a分成若干个子序列,并且使得每个子序列中的元素和都相等,设这些子序列中 ...

  6. vue 存储cookie 与使用

    安装cookie依赖包 npm i @vueuse/integrations 安装cookie npm i universal-cookie 使用cookie import {useCookies} ...

  7. DA14531芯片固件逆向系列(3)- BLE收包流程分析及漏洞挖掘思路分享

    文章首发于 https://xz.aliyun.com/t/9194 前言 本文介绍定位和分析DA14531收包流程的方法,并提供简单的BLE协议漏洞挖掘思路. 定位收包函数 通过查看DA14531的 ...

  8. 关于 Envoy on Windows

    Window Image in hub.cocker.com envoy 的镜像位于 https://hub.docker.com/u/envoyproxy 之下,其中 Windows 包括如下 4 ...

  9. HttpClientFacotry Part 4: 集成 Polly 处理瞬时失效

    HttpClientFacotry Part 4: 集成 Polly 处理瞬时失效 原文地址:https://www.stevejgordon.co.uk/httpclientfactory-usin ...

  10. 扩容ext4分区容量16TB限制

    #扩容ext4分区容量16TB限制 环境: 系统 ubuntu 16 resize2fs 1.42.13 (17-May-2015) 使用resize2fs扩容时如下提示 resize2fs /dev ...