多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Sorting-Algorithms-Blender 圆环可视化 sort_circle 深度解析:360° HSV 色彩映射的巧妙设计

Sorting-Algorithms-Blender 圆环可视化 sort_circle 深度解析:360° HSV 色彩映射的巧妙设计 Sorting-Algorithms-Blender 圆环可视化 sort_circle 深度解析360° HSV 色彩映射的巧妙设计【免费下载链接】Sorting-Algorithms-BlenderSorting algorithms visualized using the Blender Python API.项目地址: https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-BlenderSorting-Algorithms-Blender 是一个基于 Blender Python API 的排序算法可视化开源项目其中 sort_circle 圆环可视化是最具巧思的模块之一180 个细长立方体如钟表指针般围成 360° 圆环每个元素用 HSV 色环上独一无二的颜色编码排序时指针旋转交换、色彩流动成完整的彩虹。本文将深度解析 sort_circle 的 HSV 色彩映射设计原理并带你理解这套动画的搭建与运行方式。一、什么是 sort_circleBlender 排序可视化项目的圆环流派项目用 bpy 脚本在 Blender 中生成网格物体并通过逐帧插入关键帧来动画化排序过程共提供四种可视化风格目录排序依据下标表达方式特色sort_circle材质的 HSV 值立方体的旋转角度HSV 覆盖 360°sort_color材质的红 绿通道平面的位置自定义颜色渐变sort_combined材质的红 绿通道平面的位置二维数组堆叠成立方体sort_scale立方体的缩放立方体的位置附带访问/比较计数器其中 sort_circle/ 目录下共收录了 5 个算法的圆环实现bubble_sort_circle.pyselection_sort_circle.pyheap_sort_circle.pymerge_sort_circle.pyquick_sort_circle.py插入排序与希尔排序未出现在圆环流派中可在 sort_color/ 与 sort_scale/ 中找到它们的身影。二、360° 圆环舞台如何搭建180 个立方体的角度分配原理圆环舞台的核心逻辑在setup_array()函数中程序创建count个细长立方体缩放为(0.04525, 0.1, 1.25)的指针形状随后把第 i 个立方体绕 Y 轴旋转i * 2°ob.rotation_euler (0, math.radians(i*2), 0)关键点在于180 × 2° 360°默认count 180时指针恰好铺满一整圈每个角度槽位对应唯一下标。排序开始时random.shuffle(index)打乱颜色分布每个立方体被随机旋转到某个角度槽位排序过程中算法不断改写rotation_euler.y让指针归位到正确角度。两个细节值得一提origin_to_bottom()把立方体原点移到底部使旋转围绕底座进行视觉上就像指针绕轴心摆动最后添加的圆锥体则恰好遮住圆心处重叠的底座让画面更干净。三、核心设计HSV 色彩映射如何把颜色变成可排序的数值3.1 为什么选择 HSV 色环而不是直接比较 RGB排序的前提是可比大小。RGB 三个通道相互纠缠直接比较元组无法反映颜色在视觉上的先后次序而 HSV 的色相 H 天然是环形有序的——红橙黄绿青蓝紫首尾相接正好可以映射到 360° 的圆环上。于是作者把数值大小编码成色相位置颜色即数值这是整个设计最漂亮的一步。3.2 六段 RGB 渐变如何拼出完整 360° 色环有趣的是作者并没有直接用 HSV 生成颜色而是用numpy.linspace把 RGB 拆成 6 段线性渐变每段 60°首尾相连即完整色环。每段只变化一个通道、固定另外两个通道值恒为 255/0保证饱和度与亮度恒定以 bubble_sort_circle.py 中的 R 通道为例colors_r1 np.linspace(0, 255, count//6) # 第一段 R 从 0 升到 255 colors_r2 np.linspace(255, 255, count//6) # 第二段 R 保持 2556 段的颜色走向如下count180时每段 30 个颜色段索引范围颜色走向色相区间10–29蓝 → 品红240° → 300°230–59品红 → 红300° → 360°360–89红 → 黄0° → 60°490–119黄 → 绿60° → 120°5120–149绿 → 青120° → 180°6150–179青 → 蓝180° → 240°段与段之间首尾色完全一致因此整条渐变是连续无断点的正好绕完色环 360°。由于下标 i 同时驱动旋转角度 2i°与色相颜色和角度同步增长圆环天然呈现出彩虹渐变。3.3 mat_to_hsv 反解原理材质颜色如何变回可比较的数值排序时算法需要比较两个元素的大小于是作者写了一个反向转换函数mat_to_hsv()从物体材质的diffuse_color取出 RGB再用colorsys.rgb_to_hsv转回 HSV 元组hsv colorsys.rgb_to_hsv(r, g, b) # 返回 (h, s, v)比较时直接写hsv1 hsv2对元组做字典序比较。3.4 点睛之笔比较 HSV 元组等价于比较色相这里藏着一个非常精妙的设计由于色环上每个颜色的饱和度恒为 1、亮度恒为 255所有元组的 s、v 分量完全相同hsv1 hsv2实际上退化为纯色相 h 的比较。也就是说比较颜色 比较色相 比较它在圆环上的角度位置三个维度被巧妙地统一成一条有序链排序算法只需一行if hsv1 hsv2就能工作。即便传入的是 0–255 范围的数值rgb_to_hsv的色相计算本身与尺度无关结果依然正确。四、关键帧动画机制bpy 如何让排序过程动起来动画的核心是keyframe_insert(data_pathrotation_euler, framef)在指定帧写入旋转关键帧Blender 会自动补间插值形成指针旋转动画。不同算法插帧节奏不同算法插帧策略平均时间复杂度冒泡每轮先给全部指针插帧交换后再补一帧O(n²)选择每轮一次 iframe交换后插帧O(n²)堆全局 iframe堆化/交换时全体插帧O(n log n)归并全局 iframe每次归并写入后全体插帧O(n log n)快速全局 iframe分区交换时全体插帧O(n log n)冒泡排序把每轮扫描作为一帧交换前后各记录一次节奏最密其余四个算法则用全局iframe计数器每完成一次元素移动就推进一帧画面干净利落。五、新手 3 步运行 sort_circle 脚本获取代码git clone https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender启动 Blender在文本编辑器Text Editor中打开任意脚本例如 quick_sort_circle.py点击 Run Script播放按钮等待片刻即可在视口中看到排序动画脚本会自动清空场景中已有的物体与材质请放心运行。项目说明详见 README.md。六、调整元素数量与避坑指南count 必须是 6 的倍数色环按count // 6均分六段非 6 的倍数会导致部分颜色缺失selection_sort_circle.py 中注释only 360 x n is valid就是在提醒这一点默认 180 恰好以 2° 步长铺满 360°。色彩管理参数setup_array()会把曝光度设为 -3.75、伽马 0.5、Standard 变换这是作者为了让鲜艳颜色正确显示而做的专门调校不建议随意改动。注意局限这类可视化只展示元素移动并不直接反映算法效率复杂度对比建议参考 README 中的 Big O 表格。项目 README 也提到未来的改进方向包括提升setup_array()效率以支持更多物体、加入音频可听化、增加更多算法等。七、总结sort_circle 圆环可视化之所以耐看在于它把数值、角度、颜色三者用 360° 圆周统一起来六段 RGB 渐变构造完整色环材质即数值角度即下标旋转关键帧驱动动画而mat_to_hsv的元组比较让所有排序算法只需一行判断即可工作。对想学习 Blender Python API 或可视化排序算法的朋友来说这套设计是极佳的学习范本——跑一个脚本你就能直观看到冒泡、选择、堆、归并、快速五种算法在彩虹圆环上的不同舞步。【免费下载链接】Sorting-Algorithms-BlenderSorting algorithms visualized using the Blender Python API.项目地址: https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表