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

一个qt/c++ demo,用于显示分形树和Koch(科赫)雪花 分形图

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

   class FractalWidget : public QWidget
   {
   public:
       FractalWidget(QWidget *parent = nullptr)
           : QWidget(parent), image(800, 600, QImage::Format_RGB32)
       {
           // 设置窗口大小
           setFixedSize(image.size());
   
           // 生成 Fractal 图像
           generateImage();
       }
   
   protected:
       void paintEvent(QPaintEvent *event) override
       {
           Q_UNUSED(event);
   
           // 绘制 Fractal 图像
           QPainter painter(this);
           painter.drawImage(0, 0, image);
       }
   
   private:
       void generateImage()
       {
           const QColor BACKGROUND_COLOR(255, 255, 255);   // 背景颜色
           const QColor FOREGROUND_COLOR(0, 0, 0);         // 前景颜色
   
           const double BRANCH_ANGLE = 30.0;               // 每个分支角度
           const double BRANCH_LENGTH = 200.0;             // 分支长度
           const int BRANCH_DEPTH = 8;                     // 分支深度
   
           // 绘制背景
           image.fill(BACKGROUND_COLOR);
   
           // 开始绘制分形树
           QTransform transform;
           transform.translate(image.width() / 2, image.height() - 50);
           drawBranch(transform, BRANCH_LENGTH, BRANCH_ANGLE, BRANCH_DEPTH, FOREGROUND_COLOR);
   
           // 开始绘制 Koch 雪花
           transform.reset();
           transform.translate(image.width() / 2, image.height() / 2);
           drawKoch(transform, BRANCH_LENGTH, FOREGROUND_COLOR);
       }
   
       void drawBranch(const QTransform &transform, double length, double angle, int depth, const QColor &color)
       {
           if (depth <= 0) {
               return;
           }
   
           // 绘制分支线
           QPainterPath path;
           path.moveTo(0, 0);
           path.lineTo(0, -length);
   
           QTransform t1 = transform * QTransform().rotate(angle).translate(0, -length);
           QTransform t2 = transform * QTransform().rotate(-angle).translate(0, -length);
   
           QPainter painter(&image);
           painter.setRenderHint(QPainter::Antialiasing);
           painter.setTransform(transform);
           painter.setPen(QPen(color, 2.0));
           painter.drawPath(path);
   
           // 绘制右侧分支
           drawBranch(t1, length * 0.7, angle, depth - 1, color);
   
           // 绘制左侧分支
           drawBranch(t2, length * 0.7, angle, depth - 1, color);
       }
   
       void drawKoch(const QTransform &transform, double length, const QColor &color)
       {
           if (length < 1.0) {
               return;
           }
   
           // 绘制 Koch 雪花
           QPainterPath path;
           path.lineTo(length, 0);
           path.lineTo(length / 2, length * sqrt(3.0) / 2);
           path.lineTo(-length / 2, length * sqrt(3.0) / 2);
           path.lineTo(0, 0);
   
           QTransform t1 = transform * QTransform().translate(-length / 2, 0);
           QTransform t2 = transform * QTransform().translate(length / 2, 0);
           QTransform t3 = transform * QTransform().rotate(-60.0).translate(0, length * sqrt(3.0) / 4);
   
           QPainter painter(&image);
           painter.setRenderHint(QPainter::Antialiasing);
           painter.setTransform(transform);
           painter.setPen(QPen(color, 1.0));
           painter.drawPath(path);
   
           // 绘制下方分支
           drawKoch(t1, length / 3, color);
   
           // 绘制上方分支
           drawKoch(t2, length / 3, color);
   
           // 绘制左下方分支
           drawKoch(t3, length / 3, color);
       }
   
   private:
       QImage image;
   };
   
   int main(int argc, char *argv[])
   {
       QApplication app(argc, argv);
   
       FractalWidget widget;
       widget.show();
   
       return app.exec();
   }

   
   在这个示例中,我们使用了 Qt 的绘图类 QPainter 和 QImage 来生成 Fractal 图像。
   具体来说,我们实现了一个能够绘制分形树和 Koch(科赫)雪花的 FractalWidget 类。
   在 generateImage() 方法中,我们首先设置了背景颜色和前景颜色,然后通过递归调用
    drawBranch() 和 drawKoch() 方法来绘制分形树和 Koch 雪花。
    最终,我们将生成的 Fractal 图像绘制到窗口上。