#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() 方法来设置每个像素的颜色。