Advertisement
Guest User

plot

a guest
Jun 19th, 2023
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | None | 0 0
  1. class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
  2. {
  3. public:
  4.   // Конструктор класса
  5.   MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
  6.  
  7. protected:
  8.   // Инициализация OpenGL
  9.   void initializeGL() override
  10.   {
  11.     initializeOpenGLFunctions();
  12.     // Установка цвета фона
  13.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  14.   }
  15.  
  16.   // Изменение размеров окна
  17.   void resizeGL(int w, int h) override
  18.   {
  19.     // Установка области просмотра
  20.     glViewport(0, 0, w, h);
  21.  
  22.     // Задание матрицы проекции
  23.     glMatrixMode(GL_PROJECTION);
  24.     glLoadIdentity();
  25.     glOrtho(0, w, 0, h, -1, 1);
  26.     glMatrixMode(GL_MODELVIEW);
  27.     glLoadIdentity();
  28.  
  29.     // Генерация массива точек
  30.     points.clear();
  31.     for (int i = 0; i < 8192; ++i)
  32.       points.append(QPoint(i, QRandomGenerator::global()->bounded(0, h)));
  33.  
  34.     // Подгонка масштаба так, чтобы все точки помещались на экране
  35.     int maxX = 0;
  36.     int maxY = 0;
  37.     for (const auto &point : points)
  38.     {
  39.       if (point.x() > maxX)
  40.         maxX = point.x();
  41.       if (point.y() > maxY)
  42.         maxY = point.y();
  43.     }
  44.     scaleX = w / (float)maxX;
  45.     scaleY = h / (float)maxY;
  46.   }
  47.  
  48.   // Отрисовка OpenGL
  49.   void paintGL() override
  50.   {
  51.     // Очистка буфера цвета и буфера глубины
  52.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  53.  
  54.     // Установка матрицы моделирования
  55.     glLoadIdentity();
  56.     glTranslatef(offset.x(), offset.y(), 0);
  57.     glScalef(scaleX, scaleY, 1);
  58.  
  59.     // Отрисовка точек
  60.     glBegin(GL_POINTS);
  61.        for (const auto &point : points)
  62.          glVertex2f(point.x(), point.y());
  63.        glEnd();
  64.  
  65.     // Отрисовка линии, соединяющей точки
  66.     glBegin(GL_LINE_STRIP);
  67.        for (const auto &point : points)
  68.          glVertex2f(point.x(), point.y());
  69.        glEnd();
  70.   }
  71.  
  72.   // Обработка нажатия левой кнопки мыши
  73.   void mousePressEvent(QMouseEvent *event) override
  74.   {
  75.     m_lastPos = event->pos();
  76.   }
  77.  
  78.   void mouseMoveEvent(QMouseEvent *event) override
  79.   {
  80.     QPointF delta = event->pos() - m_lastPos;
  81.  
  82.     // Изменение смещения
  83.     offset.setX(offset.x() + delta.x());
  84.     offset.setY(offset.y() - delta.y());
  85.     update();
  86.  
  87.     m_lastPos = event->pos();
  88.   }
  89.  
  90.   void wheelEvent(QWheelEvent *event) override
  91.   {
  92.     // Получаем количество шагов прокрутки колёсика мыши
  93.     float count = event->angleDelta().y() / 120.0;
  94.  
  95.     // Коэффициент масштабирования
  96.     float k = 10;
  97.  
  98.     // Сохраняем старые значения масштаба
  99.     double oldScaleX = scaleX;
  100.     double oldScaleY = scaleY;
  101.  
  102.     // Изменяем масштаб
  103.     scaleX = width() / ((width() - count * k) / scaleX);
  104.     scaleY = height() / ((height() - count * k) / scaleY);
  105.  
  106.     // Изменение масштаба относительно позиции курсора
  107.     QPointF mousePos = event->position();
  108.     mousePos.setY(height() - mousePos.y()); // Исправляем координаты мыши
  109.     QPointF oldMousePos = QPointF(mousePos.x() / oldScaleX, mousePos.y() / oldScaleY); // Сохраняем старую позицию курсора
  110.     QPointF newMousePos = QPointF(mousePos.x() / scaleX, mousePos.y() / scaleY); // Вычисляем новую позицию курсора
  111.  
  112.     // Вычисляем смещение относительно изменения масштаба
  113.     QPointF offsetDelta = oldMousePos - newMousePos;
  114.  
  115.     offsetDelta.setX(offsetDelta.x());
  116.     offsetDelta.setY(offsetDelta.y());
  117.  
  118.     qDebug() << "------";
  119.     qDebug() << "oldMousePos" << oldMousePos;
  120.     qDebug() << "newMousePos" << newMousePos;
  121.     qDebug() << "offsetDelta" << offsetDelta;
  122.  
  123.     // Смещаем изображение так, чтобы точка под курсором не уплывала из-под него
  124.  
  125.     offset += offsetDelta;
  126.  
  127.     update(); // Обновляем изображение
  128.   }
  129.  
  130.  
  131. private:
  132.   QPoint m_lastPos; // Последняя позиция мыши
  133.   QPointF offset; // Смещение
  134.   QVector<QPoint> points; // Массив точек
  135.   float scaleX = 1; // Масштаб по оси X
  136.   float scaleY = 1; // Масштаб по оси Y
  137. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement