// Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "randomGenerator.h" #include RandomGenerator::RandomGenerator(QObject *parent) : QObject(parent) , m_rowCount(0) {} int RandomGenerator::rowCount() const { return m_rowCount; } void RandomGenerator::setRowCount(int rowCount) { if (m_rowCount == rowCount) return; m_rowCount = rowCount; emit rowCountChanged(rowCount); generateCaches(); } int RandomGenerator::activeSeriesIndex() const { return m_activeSeriesIndex; } void RandomGenerator::setActiveSeriesIndex(int index) { if (m_activeSeriesIndex == index) return; m_activeSeriesIndex = index; emit activeSeriesIndexChanged(index); nextCache(); } void RandomGenerator::nextCache() { m_currentCache = (m_currentCache + 1) % 60; if (m_activeSeriesIndex == 0) updateSurface3D(); else if (m_activeSeriesIndex < 3) updateScatter3D(m_activeSeriesIndex); else update2DGraph(m_activeSeriesIndex); } void RandomGenerator::generateCaches() { m_data.clear(); m_data.resize(m_cacheCount); for (int i = 0; i < m_cacheCount; i++) { QList &array = m_data[i]; array.reserve(m_rowCount); for (int j = 0; j < m_rowCount; j++) { qreal y = float(QRandomGenerator::global()->bounded(100)) / (100.0); array.append(y); } } } void RandomGenerator::clearCaches() { for (auto data : m_data) { data.clear(); } m_data.clear(); } void RandomGenerator::updateSurface3D() { if (!m_surface3D) return; QSurfaceDataArray dataArray; dataArray.resize(m_rowCount); for (int i = 0; i < m_rowCount; i++) { //append two points QVector3D pos = QVector3D(i, m_data[m_currentCache][i], 0); dataArray[i].append(QSurfaceDataItem(pos)); } m_surface3D->dataProxy()->resetArray(dataArray); } void RandomGenerator::updateScatter3D(int index) { QScatter3DSeries *series = nullptr; if (index == 1) series = m_scatter3D; else series = m_spline3D; if (!series) return; QScatterDataArray dataArray; dataArray.reserve(m_rowCount); for (int i = 0; i < m_rowCount; i++) { QVector3D pos = QVector3D(i, m_data[m_currentCache][i], 0); dataArray.append(QScatterDataItem(pos)); } series->dataProxy()->resetArray(dataArray); } void RandomGenerator::update2DGraph(int index) { QXYSeries *series = nullptr; if (index == 3) series = m_line2D; else if (index == 4) series = m_spline2D; else series = m_scatter2D; if (!series) return; series->clear(); for (int i = 0; i < m_rowCount; i++) { QPointF point = QPointF(i, m_data[m_currentCache][i]); series->append(point); } }