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

一个qt/c++ demo,用于显示 Sierpinski Arrowhead Curve(谢尔宾斯基箭头曲线) 分形图

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

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

// 递归生成 Sierpinski Arrowhead Curve 的点集
void generateArrowhead(QGraphicsScene &scene, const QVector<QPointF> &points, double angle, double length, int depth)
{
    if (depth == 0) {
        // 添加直线
        QPen pen;
        pen.setColor(Qt::GlobalColor::red);
        for (int i = 0; i < points.size() - 1; i++) {
            scene.addLine(points[i].x(), points[i].y(), points[i + 1].x(), points[i + 1].y(), pen);
        }
        return;
    }

    // 计算下一个点的位置和角度
    double x = points.last().x();
    double y = points.last().y();
    double x1 = x + length * qCos(angle);
    double y1 = y + length * qSin(angle);
    double x2 = x + length * qCos(angle - M_PI / 3.0);
    double y2 = y + length * qSin(angle - M_PI / 3.0);
    double x3 = x + length * qCos(angle + M_PI / 3.0);
    double y3 = y + length * qSin(angle + M_PI / 3.0);

    // 递归生成子谢尔宾斯基箭头曲线
    QVector<QPointF> newPoints1 = points;
    newPoints1.append(QPointF(x1, y1));
    generateArrowhead(scene, newPoints1, angle, length / 2.0, depth - 1);
    QVector<QPointF> newPoints2 = points;
    newPoints2.append(QPointF(x2, y2));
    generateArrowhead(scene, newPoints2, angle - M_PI / 3.0, length / 2.0, depth - 1);
    QVector<QPointF> newPoints3 = points;
    newPoints3.append(QPointF(x3, y3));
    generateArrowhead(scene, newPoints3, angle + M_PI / 3.0, length / 2.0, depth - 1);
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QVector<QPointF> points;
    points.append(QPointF(200, 200));
    generateArrowhead(scene, points, 0.0, 200.0, 5); // 生成 Sierpinski Arrowhead Curve

    view.show();

    return app.exec();
}