技术报告(Tech Report)¶
QWT 技术报告面向希望深入理解库内部原理的开发者,按学术论文的标准撰写,包含摘要、推导、可复现的实验数据与参考文献。它回答的是"为什么这样设计、性能到底有多好",而不是"如何使用"。
如果你只想快速画出想要的图,请阅读使用指南,那里有面向用户的分步教程。
技术报告 vs 使用指南教程¶
| 使用指南(use-guide) | 技术报告(tech-report) | |
|---|---|---|
| 读者 | 想快速完成绘图任务的用户 | 想深入理解原理与性能的开发者、算法工程师 |
| 回答的问题 | "这个功能怎么用?" | "它为什么这样设计?数学依据是什么?实测表现如何?" |
| 行文风格 | 通俗易懂、循序渐进、可直接运行的完整示例 | 论文式:摘要 → 引言 → 推导 → 实验 → 讨论 → 参考文献 |
| 插图 | 示例程序运行截图、效果对比图 | matplotlib 数据图(实验结果)+ mermaid 结构图(流程/架构) |
| 数学公式 | 尽量避免,出现时只给结论 | 按需完整推导,TeX 语法($...$ / $$...$$) |
| 篇幅 | 一篇解决一个任务 | 不设下限,以论证完整为准 |
两者互相引用:教程在"深入了解"处链接技术报告,技术报告在"代码实践"处链接教程与示例程序。
写作标准¶
技术报告按发论文的标准要求,除遵守 文档编写指南 的通用规则(平台无关 Markdown、mermaid 优先、英文注释规范等)外,还必须满足:
- 论文结构:开头给出摘要(一段话概括问题与方法)与"核心结论"速览(要点列表);正文按"引言 → 问题形式化 → 方法/推导 → 实验 → 讨论 → 小结 → 参考文献"组织;性质与定理给出证明或证明思路。
- 实验可复现:每个实验数字都能被复现。matplotlib 绘图脚本与原始数值统一放在
docs/assets/algorithms/(Python + matplotlib + numpy),文中注明脚本文件名。 - 基准注明环境:性能数据必须注明 QWT/Qt 版本、编译配置、画布尺寸与硬件类别,并声明"绝对数值随硬件变化、相对关系稳定"。
- 图表分工:数据图(曲线、散点、热力图、对比条形图)用 matplotlib 生成 PNG;流程图、架构图、时序图用 mermaid 内嵌。图片统一放
docs/assets/algorithms/,文件名以fig_开头。 - 诚实的失效分析:每篇报告必须包含方法/实现的失效模式清单,不回避负面数据。
- 引用具体:引用源码给出文件路径(如
src/plot/qwt_point_mapper.cpp),引用示例给出目录(如examples/bench/renderbench)。
现有报告¶
渲染管线与性能¶
这一组报告沿着数据量、视觉质量、后端选择与流式更新的线索,覆盖 QwtPlotCurve 从数据到像素的整条路径,以及 3D 侧的 GPU 管线。降采样篇处理点太多画不动的情况,平滑篇处理画出来像噪声的情况,SIMD 篇展开降采样核心内循环的向量化实测,NaN 篇讨论缺失数据的语义与代价,Raster/GL 篇给出画布后端的选型判据,流式篇把这些因素组合成实时应用的帧预算模型。
| 报告 | 主题 | 关键源码 | 配套示例 |
|---|---|---|---|
| LTTB 降采样算法原理与 QWT7 的 MinMax 桶实现 | 可视化带宽瓶颈、经典 LTTB 推导、MinMax 桶变体的三条性质、SIMD argmin/argmax、像素级保真度实验 | src/plot/qwt_point_mapper.cpp、src/core/qwt_simd_argminmax.cpp |
examples/bench/renderbench、examples/2D/nanperf |
曲线管线中的像素吸附:QwtPointMapper::RoundPoints 与密集曲线阶梯 |
顶点吸附到设备像素格点的形式化、为何密集抗锯齿曲线退化而稀疏曲线不受影响、逐路径映射器开销与折线几何统计、渲染混合比例实验、AA 感知的对齐规则 | src/plot/qwt_point_mapper.cpp、src/plot/qwt_plot_curve.cpp、src/plot/qwt_painter.cpp |
examples/2D/downsample_demo |
| 曲线渲染平滑:高斯卷积、Savitzky-Golay 回归与特征保护 | 偏差-方差分解、两种滤波核的完整推导(矩条件、噪声增益恒等式)、MAD 特征保护、端到端像素实验 | src/plot/qwt_curve_smoothing.cpp |
examples/2D/curvesmoothing |
| SIMD argmin/argmax 向量化基准 | AVX2 / SSE4.2 / 标量三路运行时派发实测:加速比-数组长度、缓存层级带宽与 roofline、桶大小敏感性与"SIMD 是否划算"的定量判据、三路 NaN 语义差异矩阵 | src/core/qwt_simd_argminmax.*、src/plot/qwt_point_mapper.cpp |
examples/bench/renderbench |
| Raster 与 OpenGL 渲染管线 | 两条画布管线的帧时间分解(变换/光栅化/合成/blit)、GL canvas 的 QPainter-on-FBO 真实结构、点数×曲线数×画布尺寸矩阵与选型交叉点判据 | src/plot/qwt_plot_canvas.*、src/plot/qwt_plot_opengl_canvas.* |
examples/2D/refreshtest、examples/2D/realtime |
| NaN 数据的渲染语义与性能代价 | NaN"跳过而非切段"的桥接语义矩阵(5 种绘制属性 × NaN 分布模式)、视觉伪差像素级扫描、NaN 比例-帧时间曲线族与 boundingRect 分解 | src/plot/qwt_point_mapper.cpp、src/plot/qwt_plot_curve.cpp |
examples/2D/nanperf |
| 实时流式数据渲染策略 | 环形缓冲 / WindowedSeriesData / 全量 setData 三种数据通路的成本剖析、DirectPainter 增量重绘的真实边界、帧预算与端到端延迟模型(144 个配置实测) | src/plot/qwt_plot_directpainter.*、src/core/qwt_series_data.h |
examples/2D/oscilloscope、examples/2D/realtime、examples/2D/cpuplot |
| 3D 表面渲染的 VBO/VAO 管线 | Qwt3DSurface 数据上传策略、GLSL 3.3 Core 着色器逐阶段成本、帧率-网格规模标度拟合、gl2ps 矢量导出的取舍 | src/plot3d/ |
examples/3D/qwtplot3d、examples/3D/waterfall3D |
与其他库的横向对比¶
上面各组报告都是在 QWT 内部做自我测量:同一套实现、不同配置。下面这篇把 QWT 与备选方案放在一起测,由 examples/bench/chartbench 中的基准程序按相同的协议驱动四个库。
| 报告 | 主题 | 关键源码 | 配套示例 |
|---|---|---|---|
| Qt 绘图库渲染性能对比 | Qwt 与 QCustomPlot 2.1、Qt Charts 6.7、QIm(ImPlot)的八维对比(点数、曲线数、画布尺寸、数据交接与重绘、降采样的代价与逐像素保真度、帧时间分布、每采样内存、启动开销),外加栅格与 OpenGL 后端对比,以及 Qt Charts OpenGL 序列路径的实测阴性结果 | src/plot/qwt_point_mapper.cpp、src/plot/qwt_plot_curve.cpp、examples/bench/chartbench/、QCustomPlot QCPGraph::getOptimizedLineData、ImPlot RendererLineStrip |
examples/bench/chartbench |
算法与数据语义¶
这一组报告讨论五个组件的数学基础与实现细节:样条的收敛阶、裁剪的正确性、刻度的数论、统计量的估计器选择,以及色彩感知的定量评测。
| 报告 | 主题 | 关键源码 | 配套示例 |
|---|---|---|---|
| QwtSpline 样条家族 | 六种参数化增量公式与仿射等价性、矩法三对角推导与 O(h⁴)/O(h²) 收敛阶实测、弦长参数化起环机理、Fitted 属性的渲染代价 | src/plot/qwt_spline* |
examples/2D/splineeditor、tests/splineprof |
| 多边形裁剪算法(QwtClipper) | Sutherland–Hodgman 逐函数算法识别与正确性证明、平移/缩放顶点放大率实测、退化输入行为矩阵(2337 组 C++ 位级交叉验证) | src/core/qwt_clipper.* |
examples/2D/animation |
| 刻度引擎的"漂亮数字"算法 | {1,2,5} 步长基准集合的十进对偶闭包唯一性与 minimax 差距、线性/对数/日期三引擎剖析、日期刻度八级回退决策树(3013 组 C++ 交叉验证) | src/core/qwt_scale_engine.*、src/plot/qwt_date_scale_engine.* |
examples/2D/bode、examples/2D/stockchart |
| 箱线图统计量的分位数算法 | QwtBoxStatisticsCalculator 的 R-7 分位数身份判定(34,440 探针零失配)、九种 R 型定义的差异与衰减规律、1.5×IQR 离群判定敏感性与小样本病态 | src/core/qwt_box_statistics.* |
examples/2D/boxchart |
| 科学 Colormap 的色彩科学评估 | 22 种预设的 CIEDE2000 感知均匀性、亮度单调性、色觉缺陷模拟下的可区分性评测与场景化选择指南 | src/core/qwt_colormap_preset.*、src/core/qwt_colormap.* |
examples/2D/colormap |
教程级入口:渲染组对应渲染性能与曲线平滑与 NaN 数据处理,算法组对应刻度计算引擎、箱形图与 Colormap 预设。
图表复现¶
docs/assets/algorithms/ 下的 Python 脚本可直接运行复现全部插图与数值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
横向对比那篇读的不是一次性采集的 CSV,它自己会运行程序,因此复现路径是:
1 2 3 4 5 6 7 | |
性能类报告另附 C++ 基准与本机原始数据:simd_bench.cpp、raster_opengl_bench.cpp、nan_bench.cpp、streaming_bench.cpp、surface3d_bench.cpp(计时)、roundpoints_bench.cpp、roundpoints_render_check.cpp(计时 / 渲染探针)与 clipper_check.cpp、scaleengine_check.cpp、surface_export_check.cpp、lighting_render_check.cpp、boxstats_check.cpp、nan_mapper_check.cpp(正确性交叉验证,不计时)。编译命令写在各 .cpp 文件头部注释(MSVC 2019 + Qt 5.15,依赖仓库构建产物);*_results.csv 的 # 头注记录了采集机器的硬件、编译配置与计时协议。在另一台机器上复现的路径:重新编译运行 bench 得到新 CSV,再重跑对应 Python 脚本重新生成插图与分析数值;交叉验证 harness 可直接运行比对语义。新增报告的实验脚本也应放入此目录,命名与报告主题对应,并在报告"实验"一节注明脚本名。