From 6c10723997aa3d1ef9e1a472a1902a99022d7973 Mon Sep 17 00:00:00 2001 From: Benjo Date: Fri, 4 Feb 2022 12:16:30 +0100 Subject: [PATCH] added translating --- headers/Mandelbrot.h | 8 ++++---- src/Mandelbrot.cpp | 13 +++++++++---- src/OutputWidget.cpp | 21 ++++++++++++++++++--- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/headers/Mandelbrot.h b/headers/Mandelbrot.h index 1fb2ae4..d22eb48 100644 --- a/headers/Mandelbrot.h +++ b/headers/Mandelbrot.h @@ -9,13 +9,13 @@ Q_OBJECT public: void init(); void draw(GLuint, QOpenGLShaderProgram&); - void zoom(double); -public slots: void setIterations(int); + void translateRelative(QVector2D); + void zoomRelative(double, QVector2D); private: int iterations = 0; - double scale = 1; - QVector2D translation; + QVector2D origin {-2, 1}; + QVector2D size {2, 2}; void setShaderValues(QOpenGLShaderProgram&) const; }; diff --git a/src/Mandelbrot.cpp b/src/Mandelbrot.cpp index 0f7effa..c915a27 100644 --- a/src/Mandelbrot.cpp +++ b/src/Mandelbrot.cpp @@ -14,19 +14,24 @@ void Mandelbrot::draw(GLuint vao, QOpenGLShaderProgram& shader) { } void Mandelbrot::setShaderValues(QOpenGLShaderProgram &shader) const { - shader.setUniformValue("origin", QVector2D(-2, 1)); - shader.setUniformValue("size", QVector2D(2, 2)); + shader.setUniformValue("origin", origin); + shader.setUniformValue("size", size); shader.setUniformValue("iterationCount", iterations); } -void Mandelbrot::zoom(double delta) { - scale *= delta; +void Mandelbrot::zoomRelative(double delta, QVector2D posRelative) { + } void Mandelbrot::setIterations(int value) { iterations = value; } +void Mandelbrot::translateRelative(QVector2D relative) { + QVector2D absolute = relative * size; + origin -= absolute; +} + diff --git a/src/OutputWidget.cpp b/src/OutputWidget.cpp index 76d3b3f..d5ee013 100644 --- a/src/OutputWidget.cpp +++ b/src/OutputWidget.cpp @@ -64,18 +64,33 @@ void OutputWidget::initShader() { if (!shader.bind()) close(); } -void OutputWidget::wheelEvent(QWheelEvent *e) { +QVector2D relative(QPoint p, QSize s){ + return { + float(p.x()) / float(s.width()), + float(p.y()) / float(s.height()) + }; +} +void OutputWidget::wheelEvent(QWheelEvent *e) { + double modifier = 1; + if (e->angleDelta().y() > 0) + modifier *= 1.1; + else + modifier /= 1.1; + getMandelbrot()->zoomRelative(modifier, relative(mousePos, size())); + update(); } void OutputWidget::mouseMoveEvent(QMouseEvent *e) { QPoint newMousePos = e->pos(); QPoint diff = newMousePos - mousePos; - auto m = getMandelbrot(); + mousePos = newMousePos; + getMandelbrot()->translateRelative(relative(diff, size())); + update(); } void OutputWidget::mousePressEvent(QMouseEvent *e) { - + mousePos = e->pos(); } void OutputWidget::mouseReleaseEvent(QMouseEvent *e) {