diff --git a/Vertex.glsl b/Vertex.glsl index df34866..1fdb63c 100644 --- a/Vertex.glsl +++ b/Vertex.glsl @@ -8,7 +8,6 @@ out vec2 complexPos; void main(){ vec2 offset = (pos + 1) / 2 * size; - offset.y *= -1; complexPos = origin + offset; - gl_Position = vec4(pos.xy, 0.0, 1.); + gl_Position = vec4(pos.xy, 0, 1); } \ No newline at end of file diff --git a/headers/Mandelbrot.h b/headers/Mandelbrot.h index d22eb48..b321fb2 100644 --- a/headers/Mandelbrot.h +++ b/headers/Mandelbrot.h @@ -5,16 +5,16 @@ #include class Mandelbrot : public QObject, protected QOpenGLExtraFunctions { -Q_OBJECT + Q_OBJECT public: void init(); void draw(GLuint, QOpenGLShaderProgram&); void setIterations(int); void translateRelative(QVector2D); - void zoomRelative(double, QVector2D); + void zoomRelative(float, QVector2D); private: int iterations = 0; - QVector2D origin {-2, 1}; + QVector2D origin {-2, -1}; QVector2D size {2, 2}; void setShaderValues(QOpenGLShaderProgram&) const; }; diff --git a/src/Mandelbrot.cpp b/src/Mandelbrot.cpp index c915a27..d3f8def 100644 --- a/src/Mandelbrot.cpp +++ b/src/Mandelbrot.cpp @@ -19,8 +19,12 @@ void Mandelbrot::setShaderValues(QOpenGLShaderProgram &shader) const { shader.setUniformValue("iterationCount", iterations); } -void Mandelbrot::zoomRelative(double delta, QVector2D posRelative) { - +void Mandelbrot::zoomRelative(float delta, QVector2D posRelative) { + QVector2D newSize = size * delta; + QVector2D fixPos = origin + posRelative * size; + QVector2D newOrigin = fixPos - posRelative * newSize; + size = newSize; + origin = newOrigin; } void Mandelbrot::setIterations(int value) { diff --git a/src/OutputWidget.cpp b/src/OutputWidget.cpp index d5ee013..96e2af3 100644 --- a/src/OutputWidget.cpp +++ b/src/OutputWidget.cpp @@ -72,12 +72,15 @@ QVector2D relative(QPoint p, QSize s){ } void OutputWidget::wheelEvent(QWheelEvent *e) { - double modifier = 1; + QPoint pos = e->position().toPoint(); + float modifier = 1; if (e->angleDelta().y() > 0) - modifier *= 1.1; - else modifier /= 1.1; - getMandelbrot()->zoomRelative(modifier, relative(mousePos, size())); + else + modifier *= 1.1; + QVector2D relativePos = relative(pos, size()); + relativePos.setY(1 - relativePos.y()); + getMandelbrot()->zoomRelative(modifier, relativePos); update(); } @@ -85,7 +88,9 @@ void OutputWidget::mouseMoveEvent(QMouseEvent *e) { QPoint newMousePos = e->pos(); QPoint diff = newMousePos - mousePos; mousePos = newMousePos; - getMandelbrot()->translateRelative(relative(diff, size())); + QVector2D relativeDiff = relative(diff, size()); + relativeDiff.setY(-relativeDiff.y()); + getMandelbrot()->translateRelative(relativeDiff); update(); }