示例目标与版本边界
跳转到“示例目标与版本边界”原笔记收集了曲面、单色瀑布线、多色瀑布线三种效果,并混有 Qt 3 风格入口与未提供定义的 Line3D、ThemeManager。因此下面将数学数据与渲染库接口分开,保留可理解的实验内容,不把旧片段标成现代 Qt 的完整可运行项目。QwtPlot3D 项目入口
曲面数据
跳转到“曲面数据”原函数是 Rosenbrock 函数取对数后缩放:
在 处 q=0,直接求对数会得到非有限值。演示绘图可设正下限,但应说明这会截断谷底,而不是改变原函数定义:
#include <algorithm>#include <cmath>
double displaySurface(double x, double y){ const double q = (1.0 - x) * (1.0 - x) + 100.0 * (y - x * x) * (y - x * x); constexpr double floorValue = 1e-12; return std::log(std::max(q, floorValue)) / 8.0;}原设置为 41×31 网格,x 范围约为 [-1.73,1.5],y 范围 [-1.5,1.5]。网格数控制采样密度,轴显示范围不应替代对非法数据的处理。

瀑布线数据
跳转到“瀑布线数据”原线图固定不同 x 位置,沿 y 采样 。这里 y 是正弦相位参数,单位为弧度;若把 y 改成时间,公式应明确写入角频率。用整数索引生成样本可避免浮点循环累计误差:
#include <cmath>#include <vector>
struct Point3 { double x, y, z; };using Curve = std::vector<Point3>;
std::vector<Curve> makeWaterfall(){ std::vector<Curve> curves; for (int line = 0; line < 10; ++line) { Curve curve; curve.reserve(1000); const double x = 1.0 + 10.0 * line; for (int sample = 0; sample < 1000; ++sample) { const double y = 0.1 * sample; curve.push_back({x, y, 10.0 * std::sin(y)}); } curves.push_back(curve); } return curves;}这个数据生成函数只依赖 C++ 标准库。将每条曲线交给所选版本的绘图接口时,应保持曲线边界,不把上一条末尾和下一条开头连起来。线条颜色可按 line % colorCount 循环;颜色只区分序列,不应暗示没有定义的物理量。


迁移旧渲染代码时检查
跳转到“迁移旧渲染代码时检查”QApplication::setMainWidget属于旧 Qt 用法;现代入口通常创建窗口、show,再进入事件循环。updateGL、LINE3D_STYLE、Line3D和updateData(data)必须与实际 QwtPlot3D 版本/分支对照,缺少对应声明不能靠复制片段补齐。- 原
ThemeManager是未提供实现的外部依赖,不属于这段数据生成逻辑。 - 正弦数据覆盖 -10 到 10,设置 z 最小值为 0 会裁掉负半周。
- 原注释把
QChar(0x38f)叫作 Ω,普通大写 Omega 应为 U+03A9;最稳妥的是使用实际物理量与单位作轴标题。
本文验证了数学定义与代码结构,尚未在原 QwtPlot3D 工程中构建运行。复现时记录 Qt、QwtPlot3D 分支/版本、OpenGL 环境及构建文件。
原始记录
跳转到“原始记录”本笔记由 CSDN 原始记录 的文字与图片重新整理;正文中的代码、适用条件与说明已按本次审读补充。