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

一个qt/c++ demo,用于显示 Dendrite(树枝形图案) 分形图

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

#include <QtWidgets>
#include <QPainter>

class Dendrite : public QWidget {
public:
    Dendrite(QWidget *parent = nullptr) : QWidget(parent) {

        QPixmap pixmap("https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Dendrit-1.png/220px-Dendrit-1.png");

        setFixedSize(600, 600);
        setWindowTitle("Dendrite 分形图案");

        image = QImage(size(), QImage::Format_RGB32);
        image.fill(Qt::white);

        drawDendrite();

        label = new QLabel(this);
        label->setPixmap(pixmap.scaledToWidth(400));
        label->move(100, 450);
    }

private:
    QImage image;
    QLabel* label;

    void drawLine(QPainter& painter, double x1, double y1, double x2, double y2) {
        painter.drawLine(QPointF(x1, y1), QPointF(x2, y2));
    }

    void drawDendrite(QPainter& painter, double x1, double y1, double x2, double y2, int level) {
        if (level <= 0) {
            drawLine(painter, x1, y1, x2, y2);
            return;
        }

        double x3 = (2 * x1 + x2) / 3;
        double y3 = (2 * y1 + y2) / 3;

        double x4 = (x1 + 2 * x2) / 3;
        double y4 = (y1 + 2 * y2) / 3;

        double x5 = (x3 + x4) / 2 - (y4 - y3) * sqrt(3) / 2;
        double y5 = (y3 + y4) / 2 - (x3 - x4) * sqrt(3) / 2;

        drawDendrite(painter, x1, y1, x3, y3, level - 1);
        drawDendrite(painter, x3, y3, x5, y5, level - 1);
        drawDendrite(painter, x5, y5, x4, y4, level - 1);
        drawDendrite(painter, x4, y4, x2, y2, level - 1);
    }

    void drawDendrite() {
        QPainter painter(&image);

        painter.setPen(QPen(Qt::black, 2));

        drawDendrite(painter, 50, 300, 550, 300, 8);

        painter.end();
    }

    void paintEvent(QPaintEvent* /* event */) {
        QPainter painter(this);

        painter.drawImage(0, 0, image);

        painter.end();
    }
};

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

    Dendrite window;
    window.show();

    return app.exec();
}