MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
imagesc.cpp
Go to the documentation of this file.
1//=============================================================================================================
36//=============================================================================================================
37// INCLUDES
38//=============================================================================================================
39
40#include "imagesc.h"
41#include "helpers/colormap.h"
42
43//=============================================================================================================
44// QT INCLUDES
45//=============================================================================================================
46
47#include <QPainter>
48
49//=============================================================================================================
50// USED NAMESPACES
51//=============================================================================================================
52
53using namespace DISPLIB;
54using namespace Eigen;
55
56//=============================================================================================================
57// DEFINE MEMBER METHODS
58//=============================================================================================================
59
60ImageSc::ImageSc(QWidget *parent)
61: Graph(parent)
62, m_pPixmapData(NULL)
63, m_pPixmapColorbar(NULL)
64{
65 init();
66}
67
68//=============================================================================================================
69
70ImageSc::ImageSc(MatrixXd &p_dMat, QWidget *parent)
71: Graph(parent)
72, m_pPixmapData(NULL)
73, m_pPixmapColorbar(NULL)
74{
75 init();
76 updateData(p_dMat);
77}
78
79//=============================================================================================================
80
81ImageSc::ImageSc(MatrixXf &p_fMat, QWidget *parent)
82: Graph(parent)
83, m_pPixmapData(NULL)
84, m_pPixmapColorbar(NULL)
85{
86 init();
87 updateData(p_fMat);
88}
89
90//=============================================================================================================
91
92ImageSc::ImageSc(MatrixXi &p_iMat, QWidget *parent)
93: Graph(parent)
94, m_pPixmapData(NULL)
95, m_pPixmapColorbar(NULL)
96{
97 init();
98 updateData(p_iMat);
99}
100
101//=============================================================================================================
102
104{
105 if(m_pPixmapData)
106 delete m_pPixmapData;
108 delete m_pPixmapColorbar;
109}
110
111//=============================================================================================================
112
114{
115 //Colormap
117 m_sColorMap = "Hot";
118
119 //Parent init
120 Graph::init();
121
124
125 //Colorbar
126 m_bColorbar = true;
127 m_qFontColorbar.setPixelSize(10);
128 m_qPenColorbar = QPen(Qt::black);
129 m_iColorbarWidth = 12;
130 m_iColorbarSteps = 7;//>= 2!!
132}
133
134//=============================================================================================================
135
136void ImageSc::updateData(MatrixXd &p_dMat)
137{
138 if(p_dMat.rows() > 0 && p_dMat.cols() > 0)
139 {
140 m_dMinValue = p_dMat.minCoeff();
141 m_dMaxValue = p_dMat.maxCoeff();
142
143 // -- data --
144 m_matCentNormData = p_dMat;
145 double minValue = m_matCentNormData.minCoeff();
146 m_matCentNormData.array() -= minValue;
147 double maxValue = m_matCentNormData.maxCoeff();
148 m_matCentNormData.array() /= maxValue;
149
150 updateMaps();
151 }
152}
153
154//=============================================================================================================
155
156void ImageSc::updateData(MatrixXf &p_fMat)
157{
158 MatrixXd t_dMat = p_fMat.cast<double>();
159 updateData(t_dMat);
160}
161
162//=============================================================================================================
163
164void ImageSc::updateData(MatrixXi &p_iMat)
165{
166 MatrixXd t_dMat = p_iMat.cast<double>();
167 updateData(t_dMat);
168}
169
170//=============================================================================================================
171
173{
174 if(m_pPixmapData)
175 {
176 delete m_pPixmapData;
177 m_pPixmapData = NULL;
178 }
180 {
181 delete m_pPixmapColorbar;
182 m_pPixmapColorbar = NULL;
183 }
184
185 if(m_matCentNormData.rows() > 0 && m_matCentNormData.cols() > 0)
186 {
187 // --Data--
188 qint32 x = m_matCentNormData.cols();
189 qint32 y = m_matCentNormData.rows();
190 qint32 i, j;
191 QImage t_qImageData(x, y, QImage::Format_RGB32);
192 for(i = 0; i < x; ++i)
193 for(j = 0; j < y; ++j)
194 t_qImageData.setPixel(i, j, pColorMapper(m_matCentNormData(j,i), m_sColorMap));
195
196 m_pPixmapData = new QPixmap(QPixmap::fromImage(t_qImageData));
197
198 // --Colorbar--
199 QImage t_qImageColorbar(1, m_iColorbarGradSteps, QImage::Format_RGB32);
200
201 double t_dQuantile = 1.0/((double)m_iColorbarGradSteps-1);
202 for(j = 0; j < m_iColorbarGradSteps; ++j)
203 {
204 QRgb t_qRgb = pColorMapper(t_dQuantile*((double)(m_iColorbarGradSteps-1-j))*1.0, m_sColorMap);
205 t_qImageColorbar.setPixel(0, j, t_qRgb);
206 }
207 m_pPixmapColorbar = new QPixmap(QPixmap::fromImage(t_qImageColorbar));
208
209 // --Scale Values--
210 m_qVecScaleValues.clear();
211
212 double scale = pow(10, floor(log(m_dMaxValue-m_dMinValue)/log(10.0)));
213
214 //Zero Based Scale?
215 if(m_dMaxValue > 0 && m_dMinValue < 0)
216 {
217 double quantum = floor((((m_dMaxValue-m_dMinValue)/scale)/(m_iColorbarSteps-1))*10.0)*(scale/10.0);
218 double start = 0;
219 while(m_dMinValue < (start - quantum))
220 start -= quantum;
221 //Create Steps
222 m_qVecScaleValues.push_back(start);
223 for(qint32 i = 1; i < m_iColorbarSteps-1; ++i)
224 m_qVecScaleValues.push_back(m_qVecScaleValues[i-1]+quantum);
225 }
226 else
227 {
228 double quantum = floor((((m_dMaxValue-m_dMinValue)/scale)/(m_iColorbarSteps-1))*10.0)*(scale/10.0);
229 double start = floor(((m_dMaxValue-m_dMinValue)/2.0 + m_dMinValue)/scale)*scale;
230 while(m_dMinValue < (start - quantum))
231 start -= quantum;
232 //Create Steps
233 m_qVecScaleValues.push_back(start);
234 for(qint32 i = 1; i < m_iColorbarSteps-1; ++i)
235 m_qVecScaleValues.push_back(m_qVecScaleValues[i-1]+quantum);
236 }
237 update();
238 }
239}
240
241//=============================================================================================================
242
243void ImageSc::setColorMap(const QString &p_sColorMap)
244{
245 m_sColorMap = p_sColorMap;
246
247 updateMaps();
248}
249
250//=============================================================================================================
251
252void ImageSc::paintEvent(QPaintEvent * event)
253{
254 Q_UNUSED(event);
255
256 QPainter painter(this);
257 if (m_pPixmapData)
258 {
259 QPoint t_qPointTopLeft(0,0);
260
261 // -- Data --
262 QSize t_qSizePixmapData = m_qSizeWidget;
263
264 t_qSizePixmapData.setHeight(t_qSizePixmapData.height()-m_iBorderTopBottom*2);
265 t_qSizePixmapData.setWidth(t_qSizePixmapData.width()-m_iBorderLeftRight*2);
266 // Scale data
267 QPixmap t_qPixmapScaledData = m_pPixmapData->scaled(t_qSizePixmapData, Qt::IgnoreAspectRatio);//Qt::KeepAspectRatio);
268 // Calculate data position
269 t_qPointTopLeft.setX((m_qSizeWidget.width()-t_qPixmapScaledData.width())/2);
270 t_qPointTopLeft.setY((m_qSizeWidget.height()-t_qPixmapScaledData.height())/2);
271 //Draw data
272 painter.drawPixmap(t_qPointTopLeft,t_qPixmapScaledData);
273 //Draw border
274 painter.drawRect(t_qPointTopLeft.x()-1, t_qPointTopLeft.y()-1, t_qPixmapScaledData.width()+1, t_qPixmapScaledData.height()+1);
275
276 // -- Colorbar --
278 {
279 QSize t_qSizePixmapColorbar = m_qSizeWidget;
280
281 t_qSizePixmapColorbar.setWidth(m_iColorbarWidth);
282 t_qSizePixmapColorbar.setHeight(t_qPixmapScaledData.height());
283
284 // Scale colorbar
285 QPixmap t_qPixmapScaledColorbar = m_pPixmapColorbar->scaled(t_qSizePixmapColorbar, Qt::IgnoreAspectRatio);
286 // Calculate colorbar position
287 t_qPointTopLeft.setY(t_qPointTopLeft.y());
288 t_qPointTopLeft.setX(t_qPointTopLeft.x() + t_qPixmapScaledData.width() + m_iBorderLeftRight/3);
289 //Draw colorbar
290 painter.drawPixmap(t_qPointTopLeft,t_qPixmapScaledColorbar);
291 //Draw border
292 painter.drawRect(t_qPointTopLeft.x()-1, t_qPointTopLeft.y()-1, m_iColorbarWidth+1, t_qPixmapScaledData.height()+1);
293
294 // -- Scale --
295 painter.setPen(m_qPenColorbar);
296 painter.setFont(m_qFontColorbar);
297
298 qint32 x = t_qPointTopLeft.x()+ m_iColorbarWidth + m_qFontColorbar.pixelSize()/2;
299 qint32 x_markLeft = x - m_iColorbarWidth - m_qFontColorbar.pixelSize()/2;
300 qint32 x_markRight = x_markLeft + m_iColorbarWidth;
301
302 // max
303 painter.save();
304 qint32 y_max = t_qPointTopLeft.y() - m_qFontColorbar.pixelSize()/2;
305 painter.translate(x, y_max-1);
306 painter.drawText(QRect(0, 0, 100, 12), Qt::AlignLeft, QString::number(m_dMaxValue));
307 painter.restore();
308 //draw max marks
309 qint32 y_max_mark = y_max + m_qFontColorbar.pixelSize()/2;
310 painter.drawLine(x_markLeft,y_max_mark,x_markLeft+2,y_max_mark);
311 painter.drawLine(x_markRight-3,y_max_mark,x_markRight-1,y_max_mark);
312
313 // min
314 painter.save();
315 qint32 y_min = t_qPointTopLeft.y() + t_qSizePixmapColorbar.height()-1 - m_qFontColorbar.pixelSize()/2;
316 painter.translate(x, y_min-1);
317 painter.drawText(QRect(0, 0, 100, 12), Qt::AlignLeft, QString::number(m_dMinValue));
318 painter.restore();
319 //draw min marks
320 qint32 y_min_mark = y_min + m_qFontColorbar.pixelSize()/2;
321 painter.drawLine(x_markLeft,y_min_mark,x_markLeft+2,y_min_mark);
322 painter.drawLine(x_markRight-3,y_min_mark,x_markRight-1,y_min_mark);
323
324 //Scale values
325 qint32 y_dist = y_min - y_max;
326 double minPercent = (m_qVecScaleValues[0]- m_dMinValue)/(m_dMaxValue-m_dMinValue);
327 double distPercent = (m_qVecScaleValues[1]-m_qVecScaleValues[0])/(m_dMaxValue-m_dMinValue);
328 qint32 y_current = y_min - (minPercent*y_dist);
329 qint32 y_current_mark;
330 //draw scale
331 for(qint32 i = 0; i < m_qVecScaleValues.size(); ++i)
332 {
333 painter.save();
334 painter.translate(x, y_current-1);
335 painter.drawText(QRect(0, 0, 100, 12), Qt::AlignLeft, QString::number(m_qVecScaleValues[i]));
336 painter.restore();
337 //draw marks
338 y_current_mark = y_current + m_qFontColorbar.pixelSize()/2;
339 painter.drawLine(x_markLeft,y_current_mark,x_markLeft+2,y_current_mark);
340 painter.drawLine(x_markRight-3,y_current_mark,x_markRight-1,y_current_mark);
341 //update y_current
342 y_current -= distPercent*y_dist;
343 }
344 }
345
346 //Draw title & axes
347 Graph::drawLabels(t_qPixmapScaledData.width(), t_qPixmapScaledData.height());
348 }
349}
ColorMap class declaration.
ImageSc class declaration.
Base class for graphs.
Definition graph.h:81
void init()
Definition graph.cpp:72
QSize m_qSizeWidget
Definition graph.h:146
qint32 m_iBorderLeftRight
Definition graph.h:153
qint32 m_iBorderTopBottom
Definition graph.h:152
void drawLabels(qint32 p_iContentWidth, qint32 p_iContentHeight)
Definition graph.cpp:120
static QRgb valueToColor(double v, const QString &sMap)
Definition colormap.h:688
qint32 m_iColorbarSteps
Definition imagesc.h:194
void paintEvent(QPaintEvent *event)
Definition imagesc.cpp:252
QString m_sColorMap
Definition imagesc.h:184
void setColorMap(const QString &p_sColorMap)
Definition imagesc.cpp:243
Eigen::MatrixXd m_matCentNormData
Definition imagesc.h:186
ImageSc(QWidget *parent=0)
Definition imagesc.cpp:60
QVector< double > m_qVecScaleValues
Definition imagesc.h:192
double m_dMinValue
Definition imagesc.h:188
QPen m_qPenColorbar
Definition imagesc.h:197
QFont m_qFontColorbar
Definition imagesc.h:196
QPixmap * m_pPixmapData
Definition imagesc.h:181
qint32 m_iColorbarGradSteps
Definition imagesc.h:195
double m_dMaxValue
Definition imagesc.h:189
void updateData(Eigen::MatrixXd &p_dMat)
qint32 m_iColorbarWidth
Definition imagesc.h:193
QRgb(* pColorMapper)(double, const QString &)
Definition imagesc.h:199
QPixmap * m_pPixmapColorbar
Definition imagesc.h:182