使用 Python Manim 实现冒泡排序可视化动画
本文详细介绍如何利用 Python 的 Manim 引擎制作冒泡排序可视化动画。通过逐步讲解场景初始化、元素动态交换逻辑以及底层数据结构同步技巧,帮助开发者快速掌握 Manim 核心用法,实现流畅的算法教学视频素材。
Manim 简介与环境说明
Manim 是一个用于精确编程动画的引擎,最初由 3Blue1Brown 开发,专为创建解释性数学与计算机科学视频而设计。目前主要分为两个分支:原始的 3b1b/manim(常用命令为 manimgl)以及致力于更稳定测试与社区协作的 ManimCommunity 版本。本教程基于 ManimGL 分支进行演示,其动画语法能完美支持教学场景下的元素交互需求。
构建基础可视化场景
第1步:初始化元素与排版
目的:在画布上创建代表数组数值的矩形条,并按顺序排列以便观察排序过程。
入口:新建 main.py 文件。
我们继承 Scene 基类并重写 construct 方法搭建场景。利用 Rectangle 绘制矩形条,将其高度映射为数组数值大小,同时叠加 Text 显示具体数字。最后将所有组合元素放入 VGroup 中,并通过 arrange(RIGHT, aligned_edge=DOWN) 实现右向依次排列且底部对齐。
from manimlib import *
class Test(Scene):
def construct(self):
COLOR = [BLUE, GREEN, RED, PINK, ORANGE, MAROON_B, TEAL, PURPLE_B, GREY_BROWN]
arr = [4, 2, 3, 1, 5]
g = VGroup()
for i in range(len(arr)):
r1 = Rectangle(width=1, height=arr[i], fill_color=COLOR[i%len(COLOR)], fill_opacity=1)
t1 = Text(str(arr[i])).scale(0.5)
rec = VGroup(r1, t1)
g.add(rec)
g.arrange(RIGHT, aligned_edge=DOWN)
self.add(g)
self.wait()

使用命令行执行渲染:
manimgl main.py Test
实现元素平滑交换
第2步:定位目标坐标并触发动画
目的:让相邻的两个数值条在满足大小条件时平滑互换位置,保持视觉对齐。
操作:调用 generate_target() 预设目标状态。
直接使用内置的 CyclicReplace 会导致元素交换后顶部对齐错乱。更稳健的做法是利用元素的 target 属性:先生成目标状态,通过 next_to(vm2, ORIGIN, aligned_edge=DOWN) 指定目标位置,再使用 MoveToTarget 驱动动画播放。
g[0].generate_target()
g[0].target.next_to(g[1], ORIGIN, aligned_edge=DOWN)
g[1].generate_target()
g[1].target.next_to(g[0], ORIGIN, aligned_edge=DOWN)
self.play(MoveToTarget(g[0]), MoveToTarget(g[1]))
self.wait()


编写完整冒泡排序动画
第3步:整合比较、高亮与数据同步逻辑
目的:完整实现冒泡排序算法的每一步可视化对比,处理动画对象与底层列表索引的不同步问题。
重要参数:使用 Indicate 增加红圈对焦提示,提升教学清晰度。
在执行多次交换时,直接对 VGroup 使用切片或索引赋值会触发 TypeError: 'VGroup' object does not support item assignment。因此需维护一个独立的列表(如 self.vmArr)来同步存储可视化对象。当底层数组发生数值交换时,同步更新该列表的索引对应关系。
from manimlib import *
class BubbleSort(Scene):
def construct(self):
self.COLOR = [BLUE, GREEN, RED, PINK, ORANGE, MAROON_B, TEAL, PURPLE_B, GREY_BROWN]
self.bubbleSort([4, 2, 3, 1, 5])
def init_vmobj(self, arr):
self.vmArr = []
g = VGroup()
for i in range(len(arr)):
# 高度除以2使画面比例更协调
r1 = Rectangle(width=1, height=arr[i]/2, fill_color=self.COLOR[i%len(self.COLOR)], fill_opacity=1)
t1 = Text(str(arr[i])).scale(0.5)
rec = VGroup(r1, t1)
self.vmArr.append(rec)
g.add(rec)
g.arrange(RIGHT, aligned_edge=DOWN)
self.add(g)
self.wait()
def bubbleSort(self, arr):
self.init_vmobj(arr)
n = len(arr)
for i in range(1, n):
for j in range(0, n-i):
# 高亮当前比较的一对元素
self.play(Indicate(self.vmArr[j]))
self.play(Indicate(self.vmArr[j+1], color=RED))
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
self.cyc_move(self.vmArr[j], self.vmArr[j+1])
# 同步更新可视化对象列表的索引
self.vmArr[j], self.vmArr[j+1] = self.vmArr[j+1], self.vmArr[j]
return arr
def cyc_move(self, vm1, vm2):
vm1.generate_target()
vm1.target.next_to(vm2, ORIGIN, aligned_edge=DOWN)
vm2.generate_target()
vm2.target.next_to(vm1, ORIGIN, aligned_edge=DOWN)
self.play(MoveToTarget(vm1), MoveToTarget(vm2))
self.wait()

运行验证与总结
完成判断:终端渲染窗口逐帧播放比较与移动指令,最终所有矩形条按高度从高到低(或从低到高,取决于实际逻辑方向)整齐排列,且无重叠错位。
以上就是使用 Python 结合 Manim 库实现冒泡排序算法动画的详细内容。通过分离底层数值计算与顶层动画呈现,能够有效避开图形组对象赋值限制,适用于各类算法逻辑的教学视频制作。更多关于 Python 可视化编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













