Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
- {
- public:
- // Конструктор класса
- MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
- protected:
- // Инициализация OpenGL
- void initializeGL() override
- {
- initializeOpenGLFunctions();
- // Установка цвета фона
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- }
- // Изменение размеров окна
- void resizeGL(int w, int h) override
- {
- // Установка области просмотра
- glViewport(0, 0, w, h);
- // Задание матрицы проекции
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0, w, 0, h, -1, 1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- // Генерация массива точек
- points.clear();
- for (int i = 0; i < 8192; ++i)
- points.append(QPoint(i, QRandomGenerator::global()->bounded(0, h)));
- // Подгонка масштаба так, чтобы все точки помещались на экране
- int maxX = 0;
- int maxY = 0;
- for (const auto &point : points)
- {
- if (point.x() > maxX)
- maxX = point.x();
- if (point.y() > maxY)
- maxY = point.y();
- }
- scaleX = w / (float)maxX;
- scaleY = h / (float)maxY;
- }
- // Отрисовка OpenGL
- void paintGL() override
- {
- // Очистка буфера цвета и буфера глубины
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Установка матрицы моделирования
- glLoadIdentity();
- glTranslatef(offset.x(), offset.y(), 0);
- glScalef(scaleX, scaleY, 1);
- // Отрисовка точек
- glBegin(GL_POINTS);
- for (const auto &point : points)
- glVertex2f(point.x(), point.y());
- glEnd();
- // Отрисовка линии, соединяющей точки
- glBegin(GL_LINE_STRIP);
- for (const auto &point : points)
- glVertex2f(point.x(), point.y());
- glEnd();
- }
- // Обработка нажатия левой кнопки мыши
- void mousePressEvent(QMouseEvent *event) override
- {
- m_lastPos = event->pos();
- }
- void mouseMoveEvent(QMouseEvent *event) override
- {
- QPointF delta = event->pos() - m_lastPos;
- // Изменение смещения
- offset.setX(offset.x() + delta.x());
- offset.setY(offset.y() - delta.y());
- update();
- m_lastPos = event->pos();
- }
- void wheelEvent(QWheelEvent *event) override
- {
- // Получаем количество шагов прокрутки колёсика мыши
- float count = event->angleDelta().y() / 120.0;
- // Коэффициент масштабирования
- float k = 10;
- // Сохраняем старые значения масштаба
- double oldScaleX = scaleX;
- double oldScaleY = scaleY;
- // Изменяем масштаб
- scaleX = width() / ((width() - count * k) / scaleX);
- scaleY = height() / ((height() - count * k) / scaleY);
- // Изменение масштаба относительно позиции курсора
- QPointF mousePos = event->position();
- mousePos.setY(height() - mousePos.y()); // Исправляем координаты мыши
- QPointF oldMousePos = QPointF(mousePos.x() / oldScaleX, mousePos.y() / oldScaleY); // Сохраняем старую позицию курсора
- QPointF newMousePos = QPointF(mousePos.x() / scaleX, mousePos.y() / scaleY); // Вычисляем новую позицию курсора
- // Вычисляем смещение относительно изменения масштаба
- QPointF offsetDelta = oldMousePos - newMousePos;
- offsetDelta.setX(offsetDelta.x());
- offsetDelta.setY(offsetDelta.y());
- qDebug() << "------";
- qDebug() << "oldMousePos" << oldMousePos;
- qDebug() << "newMousePos" << newMousePos;
- qDebug() << "offsetDelta" << offsetDelta;
- // Смещаем изображение так, чтобы точка под курсором не уплывала из-под него
- offset += offsetDelta;
- update(); // Обновляем изображение
- }
- private:
- QPoint m_lastPos; // Последняя позиция мыши
- QPointF offset; // Смещение
- QVector<QPoint> points; // Массив точек
- float scaleX = 1; // Масштаб по оси X
- float scaleY = 1; // Масштаб по оси Y
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement