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