Skip to main content
标签ad报错:该广告ID(9)不存在。
  主页 > Qt入门

一个qt/c++ demo,用于显示 Barnsley Tree(巴恩斯利树 分形图

2023-04-24 浏览:
标签ad报错:该广告ID(7)不存在。

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QVector>
#include <QPointF>
#include <QRandomGenerator>

// 巴恩斯利树的四个变换矩阵
const double tx1 = 0.85, ty1 = 0.04, sy1 = 0.16;
const double tx2 = -0.15, ty2 = 0.28, sy2 = 0.24;
const double tx3 = 0.2, ty3 = 0.2, sy3 = 0.173;
const double tx4 = 0.0, ty4 = 0.0, sy4 = 0.25;

// 使用四个变换矩阵生成巴恩斯利树
QVector<QPointF> generateBarnsleyTree(const int numPoints)
{
    QVector<QPointF> points;
    QPointF point(0.0, 0.0);

    for (int i = 0; i < numPoints; ++i) {
        double r = QRandomGenerator::global()->generateDouble();
        QPointF newPoint;

        if (r < 0.01) {  // 第一个变换矩阵
            newPoint.setX(tx1*point.x());
            newPoint.setY(ty1*point.y());
        } else if (r < 0.86) {  // 第二个变换矩阵
            newPoint.setX(tx2*point.x() + ty2*point.y());
            newPoint.setY(sy2*point.x() + ty2*point.y() + 1.6);
        } else if (r < 0.93) {  // 第三个变换矩阵
            newPoint.setX(tx3*point.x() - ty3*point.y());
            newPoint.setY(sy3*point.x() + ty3*point.y() + 1.6);
        } else {  // 第四个变换矩阵
            newPoint.setX(tx4*point.x());
            newPoint.setY(sy4*point.y());
        }

        points.append(newPoint);
        point = newPoint;
    }

    return points;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QVector<QPointF> points = generateBarnsleyTree(100000);

    // 将点集添加到场景中
    for (const auto &point : points) {
        scene.addEllipse(point.x(), -point.y(), 1.0, 1.0);
    }

    view.show();
    return app.exec();
}