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

一个qt/c++ demo,用于显示Mandelbrot(曼德布洛特)集合分形图

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

   class MandelbrotWidget : public QWidget
   {
   public:
       MandelbrotWidget(QWidget *parent = nullptr)
           : QWidget(parent), image(800, 600, QImage::Format_RGB32)
       {
           // 设置窗口大小
           setFixedSize(image.size());
   
           // 生成 Mandelbrot 图像
           generateImage();
       }
   
   protected:
       void paintEvent(QPaintEvent *event) override
       {
           Q_UNUSED(event);
   
           // 绘制 Mandelbrot 图像
           QPainter painter(this);
           painter.drawImage(0, 0, image);
       }
   
   private:
       void generateImage()
       {
           const int MAX_ITER = 1000;          // 最大迭代次数
           const QColor COLOR1(0, 0, 0);       // 颜色 1
           const QColor COLOR2(255, 255, 255); // 颜色 2
   
           const double CENTER_X = -0.7;       // 中心点 X 坐标
           const double CENTER_Y = 0.0;        // 中心点 Y 坐标
           const double RANGE = 3.0;           // 横纵坐标范围
   
           for (int y = 0; y < image.height(); ++y) {
               double imag = (y - image.height() / 2.0) * RANGE / image.height() - CENTER_Y;
   
               for (int x = 0; x < image.width(); ++x) {
                   double real = (x - image.width() / 2.0) * RANGE / image.height() + CENTER_X;
   
                   // 计算迭代次数
                   int iter = 0;
                   double r = 0.0, i = 0.0;
                   while (iter < MAX_ITER && r * r + i * i <= 4.0) {
                       double r_new = r * r - i * i + real;
                       double i_new = 2.0 * r * i + imag;
                       r = r_new;
                       i = i_new;
                       ++iter;
                   }
   
                   // 根据迭代次数计算像素颜色
                   QColor color = iter == MAX_ITER ? COLOR1 : COLOR2;
                   if (iter != MAX_ITER) {
                       int c = 255 * iter / MAX_ITER;
                       color = QColor(c, c, c);
                   }
   
                   // 绘制像素点
                   image.setPixelColor(x, y, color);
               }
           }
       }
   
   private:
       QImage image;
   };
   
   int main(int argc, char *argv[])
   {
       QApplication app(argc, argv);
   
       MandelbrotWidget widget;
       widget.show();
   
       return app.exec();
   }

   
   在这个示例中,我们使用了 Qt 的绘图类 QPainter 和 QImage 来生成 Mandelbrot 图像。
   在 generateImage() 方法中,我们首先定义了一些常量,包括最大迭代次数、两种不同的颜色、
   中心点坐标以及横纵坐标范围等。接着,我们循环遍历整个图像空间,对每个像素点进行计算,并根据计算结果设定像素的颜色。
   最后,我们使用 QImage::setPixelColor() 方法来设置每个像素的颜色。