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

一个qt/c++ demo,用于显示 Menger Sponge(曼戈尔海绵) 分形图

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

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

// 生成 Menger Sponge 的点集
void generateMengerSponge(QVector<QVector3D> &points, const QVector3D &center, qreal size, int depth)
{
    if (depth == 0) {  // 递归终止条件
        return;
    }

    // 计算子块大小、中心位置及相应缩放比例
    qreal childSize = size / 3.0;
    qreal childScale = childSize / size;
    QVector3D childCenter;

    // 生成 27 个子块并添加到点集中
    for (int z = -1; z <= 1; ++z) {
        for (int y = -1; y <= 1; ++y) {
            for (int x = -1; x <= 1; ++x) {
                if (qAbs(x) + qAbs(y) + qAbs(z) > 1) {  // 留下中心立方体的 20 个子块
                    continue;
                }
                childCenter.setX(center.x() + x * childSize);
                childCenter.setY(center.y() + y * childSize);
                childCenter.setZ(center.z() + z * childSize);
                points.append(childCenter);

                // 递归生成子块
                generateMengerSponge(points, childCenter, childSize, depth - 1);
            }
        }
    }
}

// 将 Menger Sponge 的点集转换为线段集
void pointsToSegments(QGraphicsScene *scene, const QVector<QVector3D> &points, qreal size)
{
    QVector<QPoint> segments;
    for (int i = 0; i < points.size(); ++i) {
        for (int j = i+1; j < points.size(); ++j) {
            if (qFuzzyCompare(points[i].distanceToPoint(points[j]), size)) {
                segments.append(QPoint(i, j));
            }
        }
    }

    // 将线段添加到场景中
    for (const auto &segment : segments) {
        const QVector3D &start = points[segment.x()];
        const QVector3D &end = points[segment.y()];
        scene->addLine(start.x(), start.y(), end.x(), end.y());
    }
}

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

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    const qreal size = 300.0;
    const QVector3D center(400.0, 400.0, 400.0);
    QVector<QVector3D> points;
    points.append(center);
    generateMengerSponge(points, center, size, 3);
    pointsToSegments(&scene, points, size);

    view.show();
    return app.exec();
}