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

一个qt/c++ demo,用于显示 Pythagorean Tree(勾股树) 分形图

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

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

// 计算勾股树三角形的三个顶点
void calculateTriangle(double x, double y, double size, double angle, QPointF &p1, QPointF &p2, QPointF &p3)
{
    double x2 = x + size * qCos(angle);
    double y2 = y - size * qSin(angle);
    p1.setX(x);
    p1.setY(y);
    p2.setX(x + size);
    p2.setY(y);
    p3.setX(x2);
    p3.setY(y2);
}

// 递归生成勾股树分型图
void generatePythagoreanTree(QGraphicsScene &scene, QPointF origin, double size, double angle, int depth)
{
    if (depth == 0) { // 达到深度限制,停止递归
        return;
    }

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

    QPointF p1, p2, p3;
    calculateTriangle(origin.x(), origin.y(), size, angle, 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);

    // 计算下一层位置和大小
    QPointF newOrigin = p3;
    double newSize = size * 0.7;

    // 左子树
    double newAngle = angle + M_PI / 4.0;
    generatePythagoreanTree(scene, newOrigin, newSize, newAngle, depth - 1);

    // 右子树
    newAngle = angle - M_PI / 4.0;
    generatePythagoreanTree(scene, newOrigin, newSize, newAngle, depth - 1);
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QPointF origin(200, 500); // 根节点位置
    double size = 200; // 根节点大小
    double angle = -M_PI / 2.0; // 根节点角度
    int depth = 8; // 深度

    generatePythagoreanTree(scene, origin, size, angle, depth);

    view.show();

    return app.exec();
}