fixed translating, added zooming

master
Benjamin Kraft 3 years ago
parent 6c10723997
commit 4d8b82eeee
  1. 3
      Vertex.glsl
  2. 6
      headers/Mandelbrot.h
  3. 8
      src/Mandelbrot.cpp
  4. 15
      src/OutputWidget.cpp

@ -8,7 +8,6 @@ out vec2 complexPos;
void main(){ void main(){
vec2 offset = (pos + 1) / 2 * size; vec2 offset = (pos + 1) / 2 * size;
offset.y *= -1;
complexPos = origin + offset; complexPos = origin + offset;
gl_Position = vec4(pos.xy, 0.0, 1.); gl_Position = vec4(pos.xy, 0, 1);
} }

@ -5,16 +5,16 @@
#include <QOpenGLShaderProgram> #include <QOpenGLShaderProgram>
class Mandelbrot : public QObject, protected QOpenGLExtraFunctions { class Mandelbrot : public QObject, protected QOpenGLExtraFunctions {
Q_OBJECT Q_OBJECT
public: public:
void init(); void init();
void draw(GLuint, QOpenGLShaderProgram&); void draw(GLuint, QOpenGLShaderProgram&);
void setIterations(int); void setIterations(int);
void translateRelative(QVector2D); void translateRelative(QVector2D);
void zoomRelative(double, QVector2D); void zoomRelative(float, QVector2D);
private: private:
int iterations = 0; int iterations = 0;
QVector2D origin {-2, 1}; QVector2D origin {-2, -1};
QVector2D size {2, 2}; QVector2D size {2, 2};
void setShaderValues(QOpenGLShaderProgram&) const; void setShaderValues(QOpenGLShaderProgram&) const;
}; };

@ -19,8 +19,12 @@ void Mandelbrot::setShaderValues(QOpenGLShaderProgram &shader) const {
shader.setUniformValue("iterationCount", iterations); 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) { void Mandelbrot::setIterations(int value) {

@ -72,12 +72,15 @@ QVector2D relative(QPoint p, QSize s){
} }
void OutputWidget::wheelEvent(QWheelEvent *e) { void OutputWidget::wheelEvent(QWheelEvent *e) {
double modifier = 1; QPoint pos = e->position().toPoint();
float modifier = 1;
if (e->angleDelta().y() > 0) if (e->angleDelta().y() > 0)
modifier *= 1.1;
else
modifier /= 1.1; 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(); update();
} }
@ -85,7 +88,9 @@ void OutputWidget::mouseMoveEvent(QMouseEvent *e) {
QPoint newMousePos = e->pos(); QPoint newMousePos = e->pos();
QPoint diff = newMousePos - mousePos; QPoint diff = newMousePos - mousePos;
mousePos = newMousePos; mousePos = newMousePos;
getMandelbrot()->translateRelative(relative(diff, size())); QVector2D relativeDiff = relative(diff, size());
relativeDiff.setY(-relativeDiff.y());
getMandelbrot()->translateRelative(relativeDiff);
update(); update();
} }

Loading…
Cancel
Save