MNE-CPP  0.1.9
A Framework for Electrophysiology
plot.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //=============================================================================================================
37 // INCLUDES
38 //=============================================================================================================
39 
40 #include "plot.h"
41 
42 //=============================================================================================================
43 // QT INCLUDES
44 //=============================================================================================================
45 
46 #include <QPoint>
47 #include <QPainter>
48 
49 //=============================================================================================================
50 // USED NAMESPACES
51 //=============================================================================================================
52 
53 using namespace DISPLIB;
54 using namespace Eigen;
55 
56 //=============================================================================================================
57 // DEFINE MEMBER METHODS
58 //=============================================================================================================
59 
60 Plot::Plot(QWidget *parent)
61 : Graph(parent)
62 , m_bHoldOn(false)
63 {
64  init();
65 }
66 
67 //=============================================================================================================
68 
69 Plot::Plot(VectorXd &p_dVec, QWidget *parent)
70 : Graph(parent)
71 , m_bHoldOn(false)
72 {
73  init();
74  updateData(p_dVec);
75 }
76 
77 //=============================================================================================================
78 
80 {
81 }
82 
83 //=============================================================================================================
84 
85 void Plot::init()
86 {
87  //Parent init
88  Graph::init();
89 
90  m_qListVecPointFPaths.clear();
91 
92  m_dMinX = 0;
93  m_dMaxX = 0;
94  m_dMinY = 0;
95  m_dMaxY = 0;
96 }
97 
98 //=============================================================================================================
99 
100 void Plot::updateData(VectorXd &p_dVec)
101 {
102  if(p_dVec.size() > 0)
103  {
104  if(!m_bHoldOn)
105  init();
106 
107  QVector<QPointF> t_qVecPointFPaths;
108  //No X data given
109  m_dMinX = 0 < m_dMinX ? 0 : m_dMinX;
110  m_dMaxX = p_dVec.size()-1 > m_dMaxX ? p_dVec.size()-1 : m_dMaxX;
111 
112  m_dMinY = p_dVec.minCoeff() < m_dMinY ? p_dVec.minCoeff() : m_dMinY;
113  m_dMaxY = p_dVec.maxCoeff() > m_dMaxY ? p_dVec.maxCoeff() : m_dMaxY;
114 
115  double t_dX = 0;
116  for(qint32 i = 0; i < p_dVec.size(); ++i)
117  {
118  t_qVecPointFPaths.append(QPointF(t_dX, p_dVec[i]));
119  t_dX += 1;
120  }
121 
122  m_qListVecPointFPaths.append(t_qVecPointFPaths);
123 
124  update();
125  }
126 }
127 
128 //=============================================================================================================
129 
130 void Plot::paintEvent(QPaintEvent *event)
131 {
132  Q_UNUSED(event);
133 
134  QPainter painter(this);
135  if (m_qListVecPointFPaths.size() > 0)
136  {
137  QPoint t_qPointTopLeft(m_iBorderLeftRight,m_iBorderTopBottom);
138 
139  QSize t_qSizePlot = m_qSizeWidget;
140 
141  t_qSizePlot.setWidth(t_qSizePlot.width() - 2*m_iBorderLeftRight);
142  t_qSizePlot.setHeight(t_qSizePlot.height() - 2*m_iBorderTopBottom);
143 
144  //Draw background
145  QPainter painter(this);
146  painter.fillRect(t_qPointTopLeft.x(), t_qPointTopLeft.y(), t_qSizePlot.width(), t_qSizePlot.height(), Qt::white);
147 
148  //Draw border
149  painter.drawRect(t_qPointTopLeft.x()-1, t_qPointTopLeft.y()-1, t_qSizePlot.width()+1, t_qSizePlot.height()+1);
150 
151  // -- Data --
152  painter.save();
153  QPen pen;
154  pen.setWidth(1);
155  pen.setBrush(Qt::blue);
156  painter.setPen(pen);
157  painter.translate(m_iBorderLeftRight-m_dMinX,m_iBorderTopBottom+t_qSizePlot.height()/2);
158  for(qint32 i = 0; i < m_qListVecPointFPaths.size(); ++i)
159  {
160  double scale_x = t_qSizePlot.width()/(m_dMaxX - m_dMinX);
161  double scale_y = (t_qSizePlot.height()-(t_qSizePlot.height()*0.1))/(m_dMaxY - m_dMinY);
162 
163  //scale
164  QVector<QPointF> t_qVecPointFPath;
165  QVector<QPointF>::ConstIterator it;
166  for(it = m_qListVecPointFPaths[i].begin(); it != m_qListVecPointFPaths[i].end(); ++it)
167  t_qVecPointFPath.append(QPointF(it->x()*scale_x, it->y()*scale_y));
168 
169  //draw
170  for(it = t_qVecPointFPath.begin()+1; it != t_qVecPointFPath.end(); ++it)
171  painter.drawLine(*(it-1), *it);
172  }
173  painter.restore();
174 
175  //Draw title & axes
176  Graph::drawLabels(t_qSizePlot.width(), t_qSizePlot.height());
177  }
178 }
179 
DISPLIB::Plot::Plot
Plot(QWidget *parent=Q_NULLPTR)
Definition: plot.cpp:60
DISPLIB::Graph::init
void init()
Definition: graph.cpp:72
DISPLIB::Graph::m_iBorderLeftRight
qint32 m_iBorderLeftRight
Definition: graph.h:153
DISPLIB::Graph
Base class for graphs.
Definition: graph.h:80
DISPLIB::Plot::init
void init()
Definition: plot.cpp:85
DISPLIB::Plot::m_qListVecPointFPaths
QList< QVector< QPointF > > m_qListVecPointFPaths
Definition: plot.h:132
DISPLIB::Plot::updateData
void updateData(Eigen::VectorXd &p_dVec)
Definition: plot.cpp:100
DISPLIB::Plot::m_dMaxX
double m_dMaxX
Definition: plot.h:136
DISPLIB::Plot::~Plot
~Plot()
Definition: plot.cpp:79
DISPLIB::Graph::m_qSizeWidget
QSize m_qSizeWidget
Definition: graph.h:146
DISPLIB::Graph::m_iBorderTopBottom
qint32 m_iBorderTopBottom
Definition: graph.h:152
DISPLIB::Plot::m_dMinX
double m_dMinX
Definition: plot.h:135
DISPLIB::Plot::paintEvent
void paintEvent(QPaintEvent *event)
Definition: plot.cpp:130
DISPLIB::Plot::m_bHoldOn
bool m_bHoldOn
Definition: plot.h:134
DISPLIB::Graph::drawLabels
void drawLabels(qint32 p_iContentWidth, qint32 p_iContentHeight)
Definition: graph.cpp:120
DISPLIB::Plot::m_dMinY
double m_dMinY
Definition: plot.h:137
plot.h
Plot class declaration.
DISPLIB::Plot::m_dMaxY
double m_dMaxY
Definition: plot.h:138