跳转到内容
新建笔记

QwtPlot3D 曲面与瀑布线:数据组织和旧代码整理

原笔记收集了曲面、单色瀑布线、多色瀑布线三种效果,并混有 Qt 3 风格入口与未提供定义的 Line3D、ThemeManager。因此下面将数学数据与渲染库接口分开,保留可理解的实验内容,不把旧片段标成现代 Qt 的完整可运行项目。QwtPlot3D 项目入口

原函数是 Rosenbrock 函数取对数后缩放:

q(x,y)=(1−x)2+100(y−x2)2,z=ln⁡q8.q(x,y)=(1-x)^2+100(y-x^2)^2,\qquad z=\frac{\ln q}{8}.

在 (1,1)(1,1) 处 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 采样 z=10sin⁡(y)z=10\sin(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 原始记录 的文字与图片重新整理;正文中的代码、适用条件与说明已按本次审读补充。