aboutsummaryrefslogtreecommitdiffhomepage
path: root/demos/mandelbrot/mandelbrot.h
blob: de09a1ffb9aac4d1c0fee5d43fbdfa62c6eda64c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ifndef MANDELBROT_H
#define MANDELBROT_H

#include <Eigen/Array>
#include <QtGui/QApplication>
#include <QtGui/QWidget>

#ifdef REAL
typedef REAL real;
#else
typedef float real;
#endif

enum { packetSize = Eigen::ei_packet_traits<real>::size }; // number of reals in a packet
typedef Eigen::Matrix<real, packetSize, 1> packet; // wrap a packet as a vector
typedef Eigen::Matrix<real, 2, 1> vector2; // really just a complex number, but we're here to demo Eigen !

const int iter = 32; // the maximum number of iterations done per pixel. Must be a multiple of 4.

class MandelbrotWidget : public QWidget
{
    Q_OBJECT

    vector2 center;
    real xradius;
    int size;
    unsigned char *buffer;
    QPoint lastpos;

  protected:
    void resizeEvent(QResizeEvent *);
    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

  public:
    MandelbrotWidget() : QWidget(), center(real(0),real(0)), xradius(2),
                         size(0), buffer(0)
    {
      setAutoFillBackground(false);
      setWindowTitle(QString("Mandelbrot/Eigen, sizeof(real)=")+QString::number(sizeof(real))
                     +", sizeof(packet)="+QString::number(sizeof(packet)));
    }
    ~MandelbrotWidget() { if(buffer) delete[]buffer; }
};

#endif // MANDELBROT_H