Sorting-Algorithms-Blender 立方体可视化 sort_combined 揭秘:多个 2D 数组如何拼成一个排序 3D 魔方
【免费下载链接】Sorting-Algorithms-BlenderSorting algorithms visualized using the Blender Python API.项目地址: https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender
Sorting-Algorithms-Blender 是一个基于Blender Python API的开源排序算法可视化项目,而sort_combined正是其中视觉冲击力最强的模块:它把 6 张互相独立的 2D 数组"面板"拼接成一个会自动旋转的 3D 立方体,6 个面各自上演一种经典排序算法。本文不堆砌代码,只讲原理,带你彻底看懂combined_sort_cube.py是如何让排序"立"起来的。
一、Sorting-Algorithms-Blender 是什么?四种可视化玩法一览
这个项目核心思路很简单:运行脚本后,Blender 会生成大量基础网格(平面、长方体),并在排序过程中按元素位置逐帧插入关键帧(Keyframe),从而把抽象的数组交换变成看得见的动画。
除了sort_combined,项目还提供了三种各具特色的可视化方案,全部集中在仓库根目录的四个文件夹中:
| 模块 | 排序依据 | 索引表示 | 特色 |
|---|---|---|---|
| sort_circle | 材质的 HSV 色相 | 长方体旋转 | 色相 = 360° |
| sort_color | 材质的红 + 绿 | 平面位置 | 自定义渐变色 |
| sort_combined | 材质的红 + 绿 | 平面位置 | 多个 2D 数组拼成立方体 |
| sort_scale | 长方体缩放 | 长方体位置 | 带访问与比较计数器 |
其中sort_combined是项目 README 中重点展示的"王牌模块",对应的核心文件只有一个:combined_sort_cube.py。
二、sort_combined 的宏伟蓝图:6 个 2D 数组如何拼出一个排序魔方
魔方的结构并不复杂:一个面 = 一个 10×10 的 2D 数组,6 个面 = 6 个 2D 数组,各自独立完成一种排序。脚本通过setup_array()函数(源码位置)生成这些面板,再用不同的"摆放参数"把它们立到魔方的不同方位上。
每个面的"姿势"由参数variation(1~6)决定,核心差异只有三件事:偏移量(offset)、旋转角度、平移距离:
if variation == 1: # 正面 offset = -0.1 if variation == 2: # 顶面 offset = 0.1 rotationX = 90 if variation == 3: # 底面 offset = 0.1 moveY = count * -2 if variation == 4: # 背面 offset = -0.1 rotationX = 90 moveZ = count * 26 个面板与 6 种算法的对应关系如下:
| 变体 | 摆放方位 | 运行的排序算法 | 对应函数 |
|---|---|---|---|
| 1 | 正面 | Shell Sort(希尔排序) | shell_sort() |
| 2 | 顶面 | Insertion Sort(插入排序) | insertion_sort() |
| 3 | 底面 | Bubble Sort(冒泡排序) | bubble_sort() |
| 4 | 背面 | Quick Sort(快速排序) | quick_sort() |
| 5 | 左侧 | Selection Sort(选择排序) | selection_sort() |
| 6 | 右侧 | Merge Sort(归并排序) | merge_sort() |
默认size = 10(源码位置),也就是说每个面有 10×10 = 100 个小平面,整个魔方共 600 个平面同时参与动画,场面相当壮观。
三、第一步:setup_array 如何把 2D 数组"立"成魔方的面
setup_array(count, variation)是整段代码的地基,它完成三件关键工作:
- 生成平面网格:按
j*2、i*2的间距铺出一整排小平面,存进二维数组Matrix; - 赋予"身份":创建名为
Parent + 编号的父对象,把所有平面挂到父对象下,随后按变体参数旋转、平移父对象——这样整个 2D 数组就被整体"立"到了魔方的某个面上; - 打乱初始顺序:每一行都执行
random.shuffle(),保证每个面都以乱序状态开始排序,动画效果更直观。
值得一提的是,每个面还会生成一张"日落渐变"(sunset gradient)材质:红色从 0 渐变到 255、绿色从 0 渐变到 200、蓝色从 200 渐变到 100,让 10 列平面拥有从暖到冷的连续色带,视觉上极具辨识度。
四、颜色即数值:get_rg 如何用材质颜色排序
这是sort_combined最巧妙的设计:排序比较的"数值"不是数字,而是材质颜色。
排序时,算法不断读取两个平面的diffuse_color(漫反射颜色),再交给get_rg()函数(源码位置)提取红色通道 R 与绿色通道 G,二者相加得到比较值rg。谁的 R+G 大,谁就"更大",需要往后排。
这种做法的好处显而易见:观众无需理解复杂的数值交换,只需盯着颜色深浅就能直观看出"大的往右、小的往左"的排序过程,非常适合教学演示。
五、六个面、六种算法:每一面都在独立排序
脚本按"正面 → 顶面 → 底面 → 背面 → 左面 → 右面"的顺序依次处理,每个面内的 10 行数组分别跑一遍对应算法。每次元素交换,脚本都会插入关键帧,让平面平滑地"滑"到新位置。
由于每个面的排序都会生成大量关键帧,脚本还做了帧号衔接处理:每完成一个面,main_frame会跳到上一个面结束的帧号并预留 25 帧空档,避免六个面的动画在时间轴上互相重叠。
六、middle_pivot 旋转魔法:让魔方逐面"翻给你看"
六个面排完后,高潮来了:脚本创建一个名为middle_pivot的小立方体(源码位置),把六个Parent全部挂到它下面,然后通过旋转关键帧让整个魔方逐面翻转(源码位置):
- 希尔排序完成 → 绕 X 轴旋转 90°,露出顶面;
- 插入排序完成 → 继续转到 180°,露出底面;
- 冒泡排序完成 → 转到 270°,露出背面;
- 快速排序完成 → 绕 Z 轴旋转,露出左面;
- 选择排序完成 → 再绕 Z 轴旋转,露出右面(归并排序)。
就这样,观众能在同一个动画里,看到 6 种排序算法在同一个 3D 魔方上轮番演出,互不干扰又浑然一体——这正是sort_combined名称的由来:combined(组合)。
七、5 步上手:在 Blender 中亲手生成排序魔方
想亲自体验并不难,只需要 5 步:
- 从官网下载并安装免费的 Blender(任意较新版本即可);
- 将项目克隆到本地:
git clone https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender; - 打开 Blender,在顶部编辑器类型中选择Text Editor(文本编辑器);
- 打开
sort_combined/combined_sort_cube.py文件; - 点击文本编辑器里的"运行脚本"按钮(Play 图标),稍等片刻,一个自动排序的 3D 魔方就会出现在视口中。
💡 小技巧:想体验更大规模的魔方,可以把脚本末尾的size = 10调大(如 12 或 15),动画会更有气势;注意该值必须是整数,且平面数量随size²增长,太大可能导致 Blender 卡顿。
八、写在最后:你能从 sort_combined 中学到什么
对初学者而言,这个模块是理解"数据结构可视化"的绝佳样本:二维数组如何组织、材质如何充当数据载体、关键帧如何驱动动画、父子对象如何实现整体旋转,都能在 combined_sort_cube.py 里找到最直观的答案。
对进阶玩家来说,项目还提供了各算法时间复杂度的 Big O 对照表(见仓库 README 的 Big O 章节),配合动画一起学习,抽象复杂度的概念也能瞬间"落地"。
如果你正想找一种有趣的方式入门排序算法,或者想在 Blender 里做点酷炫的数学动画,不妨就从这枚会自己排序的 3D 魔方开始吧!🎲
【免费下载链接】Sorting-Algorithms-BlenderSorting algorithms visualized using the Blender Python API.项目地址: https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考