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

一个qt/c++ demo,用于显示 Heighway Dragon Curve(海维龙形曲线) 分形图

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

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

// 递归生成 Heighway Dragon Curve 分形的点集
void generateDragonCurve(QGraphicsScene &scene, QPointF p1, QPointF p2, int depth)
{
    if (depth == 0) {
        // 添加线段
        QPen pen;
        pen.setColor(Qt::GlobalColor::magenta);
        scene.addLine(p1.x(), p1.y(), p2.x(), p2.y(), pen);
        return;
    }

    // 计算下一级曲线和旋转后的位置
    double length = qSqrt(qPow(p2.x() - p1.x(), 2.0) + qPow(p2.y() - p1.y(), 2.0));
    QPointF mid((p1.x() + p2.x()) / 2.0, (p1.y() + p2.y()) / 2.0);
    double angle = qAtan2(p2.y() - p1.y(), p2.x() - p1.x());
    angle += M_PI / 2.0;
    double x = mid.x() + (length / 2.0) * qCos(angle);
    double y = mid.y() + (length / 2.0) * qSin(angle);
    QPointF newPoint(x, y);

    // 递归生成分形
    generateDragonCurve(scene, p1, newPoint, depth - 1);
    generateDragonCurve(scene, newPoint, p2, depth - 1);
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    QPointF p1(100, 100);
    QPointF p2(500, 100);
    generateDragonCurve(scene, p1, p2, 12); // 生成 Heighway Dragon Curve 分形

    view.show();

    return app.exec();
}