CppQt3D-DataVisualization Simple LorenzSystem By Q3DScatter

环境搭建:

Qt 6.7.2 MSVC 2019 64bit

CMake latest

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Core Core5Compat DataVisualization)

#executable(...) 之后

target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::DataVisualization)

#Simple Lorenz System
class LorenzSystemTest {
public:
    LorenzSystemTest(double sigma, double rho, double beta)
        : sigma(sigma), rho(rho), beta(beta) {}

    void step(double dt) {
        double dx = sigma * (y - x);
        double dy = x * (rho - z) - y;
        double dz = x * y - beta * z;

        x += dx * dt;
        y += dy * dt;
        z += dz * dt;
    }

    double x = 1.0, y = 1.0, z = 1.0; // 初始条件

private:
    double sigma, rho, beta;
};

GTEST 验证及绘制(不考虑内存问题,仅作示例)

TEST(ChaoticSystemTest,LorenzScatterTest) {
    // 创建 3D 图表窗口
    Q3DScatter *scatter = new Q3DScatter();
    scatter->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
    scatter->setFlags(scatter->flags() ^ Qt::FramelessWindowHint); // 显示窗口边框
    scatter->setAxisX(new QValue3DAxis);
    scatter->setAxisY(new QValue3DAxis);
    scatter->setAxisZ(new QValue3DAxis);
    scatter->axisX()->setTitle("X");
    scatter->axisY()->setTitle("Y");
    scatter->axisZ()->setTitle("Z");
    scatter->setTitle("Lorenz System - 3D View");

    // 创建数据系列
    QScatter3DSeries *series = new QScatter3DSeries;
    series->setItemLabelFormat("(@xLabel, @yLabel, @zLabel)");
    series->setMesh(QAbstract3DSeries::MeshPoint); // 设置点的形状
    series->setBaseColor(Qt::blue); // 设置点的颜色

    // 初始化 Lorenz System
    LorenzSystemTest lorenz(10.0, 28.0, 8.0 / 3.0); // 经典参数
    double dt = 0.01; // 时间步长
    int steps = 10000; // 总步数

    // 生成 Lorenz System 数据
    QScatterDataArray data;
    for (int i = 0; i < steps; ++i) {
        lorenz.step(dt);
        data << QVector3D(lorenz.x, lorenz.y, lorenz.z);
    }

    // 设置数据
    series->dataProxy()->addItems(data);
    scatter->addSeries(series);

    // 显示窗口
    scatter->resize(800, 600);
    scatter->show();
}

演示图:

image-20250214100135854

posted @ 2025-02-14 10:07  Neko_Code  阅读(29)  评论(0)    收藏  举报