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

一个qt/c++ demo,用于显示Barnsley fern(巴恩斯利蕨) 分形图

2023-04-24 浏览:
标签ad报错:该广告ID(7)不存在。
#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 绘制到窗口中。这里采用的是随机位置和概率选择的方式计算下一个点的位置,可以在一定程度上加速绘制过程