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

一个qt/c++ demo,用于显示 Sierpinski Carpet with Holes(带洞的谢尔宾斯基地毯) 分形图

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

#include <QtWidgets>

class SierpinskiCarpet : public QWidget    
{
public:
    SierpinskiCarpet(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *);

private:
    void drawCarpet(QPainter& painter, int xPos, int yPos, int sideLength, int depth);
};

SierpinskiCarpet::SierpinskiCarpet(QWidget *parent)
    : QWidget(parent)
{   
    setFixedSize(600, 600); //设置窗口大小
}

void SierpinskiCarpet::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::white);
    painter.setBrush(QBrush(Qt::black));

    int xPos = 50;
    int yPos = 50;
    int sideLength = 500;
    int depth = 4;

    drawCarpet(painter, xPos, yPos, sideLength, depth);
}

void SierpinskiCarpet::drawCarpet(QPainter& painter, int xPos, int yPos, int sideLength, int depth)
{
    if (depth == 0)
    {
        painter.drawRect(xPos, yPos, sideLength, sideLength);
        return;
    }

    // 计算子地毯边长和位置
    int subLength = sideLength / 3;
    int subXPos = xPos + subLength;
    int subYPos = yPos + subLength;

    // 绘制 8 个子地毯,除去中心的那个子地毯
    drawCarpet(painter, xPos, yPos, subLength, depth - 1);
    drawCarpet(painter, subXPos, yPos, subLength, depth - 1);
    drawCarpet(painter, subXPos + subLength, yPos, subLength, depth - 1);
    drawCarpet(painter, xPos, subYPos, subLength, depth - 1);
    drawCarpet(painter, subXPos + subLength, subYPos, subLength, depth - 1);
    drawCarpet(painter, xPos, subYPos + subLength, subLength, depth - 1);
    drawCarpet(painter, subXPos, subYPos + subLength, subLength, depth - 1);
    drawCarpet(painter, subXPos + subLength, subYPos + subLength, subLength, depth - 1);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    
    SierpinskiCarpet w;
    w.show();

    return a.exec();
}