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

一个qt/c++ demo,用于显示 Gosper Curve(高斯波曲线) 分形图

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

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

// 根据递归深度生成高斯波曲线的点集
QVector<QPointF> generateGosperCurve(const int depth)
{
    QVector<QPointF> points;

    double x = 0.0, y = 0.0;
    double angle = 0.0;

    for (int i = 0; i < depth; ++i) {
        // 第一步
        points.append(QPointF(x, y));
        x += qPow(2, -i) * qCos(angle);
        y += qPow(2, -i) * qSin(angle);

        // 第二步
        angle += M_PI / 3.0;
        points.append(QPointF(x, y));
        x += qPow(2, -i) * qCos(angle);
        y += qPow(2, -i) * qSin(angle);

        // 第三步
        angle -= 2.0 * M_PI / 3.0;
        points.append(QPointF(x, y));
        x += qPow(2, -i) * qCos(angle);
        y += qPow(2, -i) * qSin(angle);

        // 第四步
        angle += M_PI / 3.0;
        points.append(QPointF(x, y));
        x += qPow(2, -i) * qSin(angle);
        y -= qPow(2, -i) * qCos(angle);

        // 第五步
        points.append(QPointF(x, y));
        x -= qPow(2, -i) * qSin(angle);
        y -= qPow(2, -i) * qCos(angle);

        // 第六步
        angle += M_PI / 3.0;
        points.append(QPointF(x, y));
        x -= qPow(2, -i) * qCos(angle);
        y -= qPow(2, -i) * qSin(angle);

        // 第七步
        angle -= 2.0 * M_PI / 3.0;
        points.append(QPointF(x, y));
        x -= qPow(2, -i) * qCos(angle);
        y -= qPow(2, -i) * qSin(angle);

        // 回到原点
        angle += M_PI / 3.0;
        points.append(QPointF(x, y));
    }

    return points;
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QVector<QPointF> points = generateGosperCurve(6);

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

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