#include <QtWidgets>
class BarnsleyFern : public QWidget
{
public:
BarnsleyFern(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void paintEvent(QPaintEvent *) override
{
const int iterations = 100000;
QPointF pt(0, 0);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.translate(width() / 2, height() / 2);
for (int i = 0; i < iterations; ++i) {
double x = pt.x();
double y = pt.y();
double r = static_cast<double>(qrand()) / RAND_MAX;
if (r <= 0.01)
pt.setX(0);
else if (r <= 0.86) {
pt.setX(0.85 * x + 0.04 * y);
pt.setY(-0.04 * x + 0.85 * y + 1.6);
} else if (r <= 0.93) {
pt.setX(0.2 * x - 0.26 * y);
pt.setY(0.23 * x + 0.22 * y + 1.6);
} else {
pt.setX(-0.15 * x + 0.28 * y);
pt.setY(0.26 * x + 0.24 * y + 0.44);
}
painter.drawPoint(static_cast<int>(pt.x() * 50), -static_cast<int>(pt.y() * 50));
}
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
BarnsleyFern fern;
fern.resize(600, 800);
fern.show();
return app.exec();
}
这段代码使用 QPainter 在 paintEvent 中绘制巴恩斯利蕨分形图。它根据 Barnsley 的算法,通过多次迭代计算出图形的各个点,
并用 drawPoint 绘制到窗口中。这里采用的是随机位置和概率选择的方式计算下一个点的位置,可以在一定程度上加速绘制过程