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

一个qt/c++ demo,用于显示 Spiral Fractal(螺旋分形) 分形图

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

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPen>

// 计算点(x, y)围绕中心点(centerX, centerY),旋转角度为angle,距离为radius处的新坐标
void calculatePoint(double centerX, double centerY, double radius, double angle, double &x, double &y)
{
    x = centerX + radius * qCos(angle);
    y = centerY + radius * qSin(angle);
}

// 递归生成 Spiral Fractal 分型图
void generateSpiralFractal(QGraphicsScene &scene, double centerX, double centerY, double radius, double angle, double dAngle, int depth)
{
    if (depth == 0) { // 达到深度限制,停止递归
        return;
    }

    QPen pen;
    pen.setColor(Qt::GlobalColor::darkGreen); // 设置颜色

    double x1, y1, x2, y2;
    calculatePoint(centerX, centerY, radius, angle, x1, y1); // 计算起始点坐标
    calculatePoint(centerX, centerY, radius * 2, angle + dAngle, x2, y2); // 计算终止点坐标

    scene.addLine(x1, y1, x2, y2, pen); // 绘制线段

    double newRadius = radius / 2.0; // 新半径为原来的一半
    double newAngle = angle + dAngle; // 新角度为原来的加上偏移角度

    // 继续递归生成子级 Spiral Fractal 分型图
    generateSpiralFractal(scene, centerX, centerY, newRadius, newAngle, dAngle, depth - 1);
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    double centerX = 200; // 中心点横坐标
    double centerY = 200; // 中心点纵坐标
    double radius = 180; // 初始半径
    double angle = 0.0; // 初始角度
    double dAngle = 0.15; // 每一级的偏移角度
    int depth = 12; // 深度

    generateSpiralFractal(scene, centerX, centerY, radius, angle, dAngle, depth);

    view.show();

    return app.exec();
}