#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 图像绘制到窗口上。