手写算法动画上位机:从排序到线性代数可视化

算法可视化桌面应用,支持 30+ 算法逐步动画演示,涵盖查找、排序、信号处理、控制、机器学习与线性代数。

一、项目背景

学习算法时,静态图解往往难以体现「每一步发生了什么」。这个项目把算法的执行过程录制成步骤流,再逐帧回放成动画,配合伪代码与操作说明,直观展示每一步的数据变化。

整个程序没有使用任何第三方 UI 库,窗口、控件、画布全部用 GDI+ 手绘。

二、功能概览

左侧导航采用「大类下拉 + 子分类列表」两层结构。

经典算法

分类 算法
查找算法 顺序、二分、插值、斐波那契、跳跃、指数、分块、哈希
排序算法 冒泡、选择、插入、归并、快速、堆
信号算法 信号生成、滑动平均、二阶滤波、卡尔曼滤波、FFT、DFT
控制算法 蛇形清扫、PID 阶跃响应
机器学习 K-Means、K 近邻、线性回归、梯度下降

线性代数

分类 算法
矩阵计算 加法、减法、数乘、相乘、转置、求逆
方程组计算 高斯消元、LU 分解
其他 幂迭代法、PCA 主成分

三、界面与交互

  • 无边框圆角窗口:自绘标题栏,支持拖动、双击最大化、边缘缩放
  • 动画回放:播放 / 暂停 / 单步 / 后退 / 进度拖动 / 0.5x~2x 调速
  • 九种画布渲染器:柱状图、波形图、频谱图、栅格地图、轨迹图、PID 曲线、散点图、矩阵表格、2D 向量
  • 坐标轴数值:所有画布均带横纵坐标刻度
  • 参数配置:数据量 10~5000,矩阵行列 2~6
  • 数据交换:CSV 导入(信号 / 数组 / 坐标 / 点集)与全局导出
  • 主题:浅灰底 + 白色圆角卡片,支持自定义窗口背景图

四、技术实现要点

1. 统一的算法接口与步骤录制

csharp 复制代码
public interface IAlgorithm
{
    string Category { get; }
    string Name { get; }
    RendererKind Renderer { get; }
    SceneKind Scene { get; }
    IReadOnlyList<string> PseudoCode { get; }
    void Run(AlgorithmContext ctx, StepRecorder recorder);
}

算法只负责「产出步骤」,不关心渲染:

csharp 复制代码
recorder.Record(new AnimStep
{
    Op = AnimOp.Swap,
    Indices = new[] { j, j + 1 },
    Extra = (int[])work.Clone(),
    Description = $"交换 A[{j}] 与 A[{j + 1}]"
});

渲染器从 AnimStep.Extra 取当前快照绘制,因此前进、后退、拖动进度条都能正确还原画面。

2. 按需快照,避免内存爆炸

排序算法是 O(n²) 步数,5000 个元素会产生千万级步骤。如果每步都克隆数组,内存直接爆掉。

解决方案是延迟构造:

csharp 复制代码
recorder.Record(() => new AnimStep
{
    Extra = (int[])work.Clone()   // 只有该步被采纳时才克隆
});

配合「按 50MB 快照预算自动计算采样间隔」,无论数据量多大,内存都有明确上限。

3. 异步生成 + 可取消

切换分类时,场景构建和步骤录制放到后台线程,界面不阻塞;同时用 CancellationToken 在录制点中断旧任务,避免后台继续占用 CPU。

4. 大数据量的像素聚合绘制

当柱状图数量超过画布像素宽度时,按像素列合并绘制,每列取该列内最高值。绘制开销固定为画布宽度量级,5000 个元素也能流畅播放。

5. 自绘圆角控件体系

  • RoundedPanel / RoundedButton / RoundedDropDown / WindowButton
  • 统一的 Theme 配色与圆角路径工具
  • 窗口无边框 + Region 圆角 + 系统投影

五、构建方式

powershell 复制代码
# 开发运行
dotnet run --project src/AlgorithmicArt

# 发布(框架依赖)
dotnet publish src/AlgorithmicArt/AlgorithmicArt.csproj -c Release -r win-x64 `
  --self-contained false -p:PublishSingleFile=true -o publish

# 发布(自包含单文件,免运行时)
dotnet publish src/AlgorithmicArt/AlgorithmicArt.csproj -c Release -r win-x64 `
  --self-contained true -p:PublishSingleFile=true `
  -p:EnableCompressionInSingleFile=true -o publish-standalone

六、工程结构

复制代码
src/AlgorithmicArt/
├── Core/
│   ├── Algorithm/        算法接口、步骤录制、场景构建、算法实现
│   ├── Replay/           回放引擎与状态机
│   └── Dispatch/         数据分发
├── Communication/        串口与协议解析
├── Render/               九类动画渲染器
├── Data/                 配置存储、CSV 导入、日志
└── UI/
    ├── MainForm.cs       主窗体(自绘标题栏 + 双层导航 + 状态栏)
    ├── Pages/            算法动画页
    └── Controls/         圆角控件与自定义画布

七、源码与下载

技术栈:.NET 8 / WinForms / GDI+ 双缓冲 / System.IO.Ports

八、后续计划

  • 补充行列式计算、克拉默法则、Gram-Schmidt 正交化
  • 增加树形与图算法渲染器
  • 支持动画导出为 GIF / 视频

如果这个项目对你有帮助,欢迎在 GitHub 点个 Star。

相关推荐
Pniubi1 小时前
快速排序(力扣基础)(递归)
java·数据结构·算法
roman_日积跬步-终至千里2 小时前
【数据Agent论文·分析与报告评测|27】ComInsight:原子洞察正确,组合后的结论就可靠吗?
人工智能·算法·机器学习·数据分析
goujunwe2 小时前
保险 GEO 信源矩阵搭建:代理人轻量化分层信源,构建 AI 认可的交叉佐证网络
人工智能·线性代数·矩阵
Samson Bruce2 小时前
【数学之美】
线性代数·算法·概率论
Mister Leon2 小时前
Nvidia Orin AGX实战之从量化到蒸馏:在 Orin 上落地的大模型压缩实战
人工智能·算法·机器学习
aqiu1111112 小时前
蓝桥杯真题复盘:Fibonacci 数列与黄金分割(C++ 算法详解)
c++·算法·蓝桥杯
phoenix@Capricornus3 小时前
LDA 协方差矩阵(MATLAB `fitcdiscr`)
算法·matlab·矩阵
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:拓扑排序课程表排课解析
c++·python·算法·bfs·信息学竞赛
HPtiger12 小时前
数据结构——选择排序
数据结构·算法·排序算法