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

一个qt/c++ demo,用于显示 Serpinski Polygon(谢尔宾斯基多边形) 分形图

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);
}

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

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

    QPointF p1, p2, p3;
    calculateTriangle(center.x(), center.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);

    // 继续递归生成子级 Serpinski Polygon 分型图
    QPointF newCenter = (p1 + p2 + p3) / 3.0; // 重心坐标
    double newSize = size / 2.0;

    generateSerpinskiPolygon(scene, newCenter, newSize, angle, depth - 1); // 顶部子级
    generateSerpinskiPolygon(scene, newCenter, newSize, angle + M_PI / 3.0, depth - 1); // 左下角子级
    generateSerpinskiPolygon(scene, newCenter, newSize, angle - M_PI / 3.0, depth - 1); // 右下角子级
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

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

    generateSerpinskiPolygon(scene, center, size, angle, depth);

    view.show();

    return app.exec();
}