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

一个qt/c++ demo,用于显示 Gasket Fractal(镂垫分形) 分形图

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

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

// 计算边长为size、中心点为(centerX, centerY)、角度为angle的正三角形的三个顶点
void calculateTriangle(double centerX, double centerY, double size, double angle, QPointF &p1, QPointF &p2, QPointF &p3)
{
    double r = size * qSqrt(3) / 6.0; // 正三角形外接圆半径
    double x1 = centerX + r * qSin(angle);
    double y1 = centerY - r * qCos(angle);
    double x2 = centerX + r * qSin(angle + 2.0 / 3.0 * M_PI);
    double y2 = centerY - r * qCos(angle + 2.0 / 3.0 * M_PI);
    double x3 = centerX + r * qSin(angle + 4.0 / 3.0 * M_PI);
    double y3 = centerY - r * qCos(angle + 4.0 / 3.0 * M_PI);
    p1.setX(x1);
    p1.setY(y1);
    p2.setX(x2);
    p2.setY(y2);
    p3.setX(x3);
    p3.setY(y3);
}

// 递归生成 Gasket Fractal 分型图
void generateGasketFractal(QGraphicsScene &scene, QPointF center, double size, int depth)
{
    if (depth == 0) { // 达到深度限制,停止递归
        return;
    }

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

    QPointF p1, p2, p3;
    calculateTriangle(center.x(), center.y(), size, 0, p1, p2, p3);

    // 绘制三角形
    scene.addLine(p1.x(), p1.y(), p2.x(), p2.y(), pen);
    scene.addLine(p2.x(), p2.y(), p3.x(), p3.y(), pen);
    scene.addLine(p3.x(), p3.y(), p1.x(), p1.y(), pen);

    // 继续递归生成子级 Gasket Fractal 分型图
    QPointF newCenter1 = (p1 + p2) / 2.0; // 上方中心点坐标
    QPointF newCenter2 = (p2 + p3) / 2.0; // 左下角中心点坐标
    QPointF newCenter3 = (p3 + p1) / 2.0; // 右下角中心点坐标
    double newSize = size / 2.0;

    generateGasketFractal(scene, newCenter1, newSize, depth - 1); // 上方子级
    generateGasketFractal(scene, newCenter2, newSize, depth - 1); // 左下角子级
    generateGasketFractal(scene, newCenter3, newSize, depth - 1); // 右下角子级
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QPointF center(200, 200); // 中心点位置
    double size = 400; // 初始大小
    int depth = 5; // 深度

    generateGasketFractal(scene, center, size, depth);

    view.show();

    return app.exec();
}