#include <QtWidgets>
class JuliaWidget : public QWidget
{
public:
JuliaWidget(QWidget *parent = nullptr)
: QWidget(parent), image(800, 600, QImage::Format_RGB32)
{
// 设置窗口大小
setFixedSize(image.size());
// 生成 Julia 图像
generateImage();
}
protected:
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
// 绘制 Julia 图像
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.8; // 中心点 X 坐标
const double CENTER_Y = 0.156; // 中心点 Y 坐标
const double RANGE = 2.0; // 横纵坐标范围
const double JULIA_REAL = -0.7269; // Julia 常数实部
const double JULIA_IMAG = 0.1889; // Julia 常数虚部
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 = real, i = imag;
while (iter < MAX_ITER && r * r + i * i <= 4.0) {
double r_new = r * r - i * i + JULIA_REAL;
double i_new = 2.0 * r * i + JULIA_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);
JuliaWidget widget;
widget.show();
return app.exec();
}
在这个示例中,我们使用了 Qt 的绘图类 QPainter 和 QImage 来生成 Julia 图像。
和 Mandelbrot 图像不同的是,我们需要定义 Julia 常数实部和虚部,并将其作为每个像素点的计算参数。
同时,在 generateImage() 方法中,我们也要根据 Julia 常数重新计算迭代次数。
其余的代码逻辑和 Mandelbrot 图像的示例相似。
你可以根据自己的需求修改这个示例代码以实现不同类型的控件效果。