v2.0.0
Loading...
Searching...
No Matches
spline.h
Go to the documentation of this file.
1//=============================================================================================================
24
25#ifndef SPLINE_H
26#define SPLINE_H
27
28//=============================================================================================================
29// INCLUDES
30//=============================================================================================================
31
32#include "../disp_global.h"
33
34//=============================================================================================================
35// QT INCLUDES
36//=============================================================================================================
37
38#include <QWidget>
39#include <QVector3D>
40
41//=============================================================================================================
42// EIGEN INCLUDES
43//=============================================================================================================
44
45#include <Eigen/Core>
46
47//=============================================================================================================
48// FORWARD DECLARATIONS
49//=============================================================================================================
50
51class QMouseEvent;
52
53//=============================================================================================================
54// DEFINE NAMESPACE DISPLIB
55//=============================================================================================================
56
57namespace DISPLIB
58{
59
60//=============================================================================================================
61// DISPLIB FORWARD DECLARATIONS
62//=============================================================================================================
63
64//=============================================================================================================
72class DISPSHARED_EXPORT Spline: public QWidget
73{
74 Q_OBJECT
75
76public:
77 typedef QSharedPointer<Spline> SPtr;
78 typedef QSharedPointer<const Spline> ConstSPtr;
79
80 //=========================================================================================================
86 Spline(QWidget* parent = nullptr, const QString& title = "Spline Histogram");
87
88 //=========================================================================================================
95 template<typename T>
96 void setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
97 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData);
98 template<typename T>
99 void setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
100 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData);
101
102 //=========================================================================================================
109 template<typename T>
110 void updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
111 const Eigen::VectorXi& matClassFrequencyData);
112
113 //=========================================================================================================
119 void mousePressEvent(QMouseEvent *event) override;
120
121 //=========================================================================================================
131 template<typename T>
132 void splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
133 int iClassAmount,
134 Eigen::VectorXd& vecCoefficientResults,
135 Eigen::VectorXi& vecExponentValues);
136
137 //=========================================================================================================
143 void setThreshold(const QVector3D& vecThresholdValues);
144
145 //=========================================================================================================
151 const QVector3D& getThreshold();
152
153 //=========================================================================================================
161 QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues,
162 QString upOrDown);
163
164 //=========================================================================================================
170 void setColorMap(const QString &colorMap);
171
173 double m_dMinAxisX;
174 double m_dMaxAxisX;
175
176protected:
177 //=========================================================================================================
183 void paintEvent(QPaintEvent *event) override;
184
185 //=========================================================================================================
189 double dataToPixelX(double dataX) const;
190
191 //=========================================================================================================
195 double dataToPixelY(double dataY) const;
196
197 //=========================================================================================================
201 double pixelToDataX(double pixelX) const;
202
203 //=========================================================================================================
207 int leftMargin() const { return 60; }
208
209 //=========================================================================================================
213 int rightMargin() const { return 20; }
214
215 //=========================================================================================================
219 int topMargin() const { return 30; }
220
221 //=========================================================================================================
225 int bottomMargin() const { return 40; }
226
227 QList<QPointF> m_seriesData;
234 QString m_colorMap;
236
237signals:
238 //=========================================================================================================
246 void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold);
247};
248
249//=============================================================================================================
250// INLINE DEFINITIONS
251//=============================================================================================================
252
253template <typename T>
254void Spline::setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
255 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData)
256{
257 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matClassLimitData.rows(),1);
258 matrixName.col(0) = matClassLimitData;
259 this->updatePlot(matrixName, matClassFrequencyData);
260}
261
262//=========================================================================================================
263
264template <typename T>
265void Spline::setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
266 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData)
267{
268 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1, matClassLimitData.cols());
269 matrixName.row(0) = matClassLimitData;
270 this->updatePlot(matrixName, matClassFrequencyData);
271}
272
273//=========================================================================================================
274
275template<typename T>
276void Spline::updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
277 const Eigen::VectorXi& matClassFrequencyData)
278{
279 Eigen::VectorXd resultDisplayValues;
280 int iClassAmount = std::min(static_cast<int>(matClassFrequencyData.rows()),
281 static_cast<int>(matClassLimitData.rows()) - 1);
282 if(iClassAmount < 1) return;
283 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, m_vecResultExponentValues);
284
285 m_dMinAxisX = resultDisplayValues(0);
286 m_dMaxAxisX = resultDisplayValues(iClassAmount);
287
288 m_seriesData.clear();
290
291 for (int ir = 0; ir < iClassAmount; ++ir)
292 {
293 double classMark = (resultDisplayValues(ir) + resultDisplayValues(ir + 1)) / 2.0;
294 m_seriesData.append(QPointF(classMark, matClassFrequencyData(ir)));
295 if (matClassFrequencyData(ir) > m_iMaximumFrequency)
296 {
297 m_iMaximumFrequency = matClassFrequencyData(ir);
298 }
299 }
300
301 m_bHasData = true;
305 m_bHasThresholds = false;
306
307 QWidget::update();
308}
309
310//=============================================================================================================
311
312template <typename T>
313void Spline::splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
314 int iClassAmount,
315 Eigen::VectorXd& vecCoefficientResults,
316 Eigen::VectorXi& vecExponentValues)
317{
318 vecCoefficientResults.resize(iClassAmount + 1);
319 vecExponentValues.resize(iClassAmount + 1);
320 double originalValue(0.0),
321 limitDisplayValue(0.0),
322 doubleExponentValue(0.0);
323 int limitExponentValue(0);
324 for (int ir = 0; ir <= iClassAmount; ++ir)
325 {
326 originalValue = matClassLimitData(ir);
327 if (originalValue == 0.0)
328 {
329 doubleExponentValue = 0.0;
330 }
331 else
332 {
333 doubleExponentValue = log10(std::fabs(originalValue));
334 }
335
336 limitExponentValue = round(doubleExponentValue);
337 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
338 vecCoefficientResults(ir) = limitDisplayValue;
339 vecExponentValues(ir) = limitExponentValue;
340 }
341
342 int lowestExponentValue{0},
343 highestExponentValue{0};
344
345 for (int ir = 0; ir <= iClassAmount; ++ir)
346 {
347 if (vecExponentValues(ir) < lowestExponentValue)
348 {
349 lowestExponentValue = vecExponentValues(ir);
350 }
351 if (vecExponentValues(ir) > highestExponentValue)
352 {
353 highestExponentValue = vecExponentValues(ir);
354 }
355 }
356
357 if (highestExponentValue > 0)
358 {
359 for (int ir = 0; ir <= iClassAmount; ++ir)
360 {
361 while (vecExponentValues(ir) < highestExponentValue)
362 {
363 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
364 vecExponentValues(ir)++;
365 }
366 }
367 }
368
369 if (lowestExponentValue < 0)
370 {
371 for (int ir = 0; ir <= iClassAmount; ++ir)
372 {
373 while (vecExponentValues(ir) > lowestExponentValue)
374 {
375 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
376 vecExponentValues(ir)--;
377 }
378 }
379 }
380}
381} // NAMESPACE
382
383#endif // SPLINE_H
Export macros and build-info hooks for the DISPLIB shared library.
#define DISPSHARED_EXPORT
Definition disp_global.h:38
2-D display widgets and visualisation helpers (charts, topography, colour maps).
double m_dLeftThreshold
Definition spline.h:228
QString m_colorMap
Definition spline.h:234
QSharedPointer< const Spline > ConstSPtr
Definition spline.h:78
double dataToPixelX(double dataX) const
Definition spline.cpp:69
QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues, QString upOrDown)
Definition spline.cpp:325
void mousePressEvent(QMouseEvent *event) override
Definition spline.cpp:230
void setThreshold(const QVector3D &vecThresholdValues)
Definition spline.cpp:271
QList< QPointF > m_seriesData
Definition spline.h:227
bool m_bHasData
Definition spline.h:231
int m_iMaximumFrequency
Definition spline.h:233
double m_dMiddleThreshold
Definition spline.h:229
double pixelToDataX(double pixelX) const
Definition spline.cpp:88
void updatePlot(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, const Eigen::VectorXi &matClassFrequencyData)
Definition spline.h:276
int topMargin() const
Definition spline.h:219
QVector3D m_vecReturnVector
Definition spline.h:235
Eigen::VectorXi m_vecResultExponentValues
Definition spline.h:172
Spline(QWidget *parent=nullptr, const QString &title="Spline Histogram")
Definition spline.cpp:50
int bottomMargin() const
Definition spline.h:225
void setData(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &matClassFrequencyData)
Definition spline.h:254
double m_dRightThreshold
Definition spline.h:230
void splitCoefficientAndExponent(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, int iClassAmount, Eigen::VectorXd &vecCoefficientResults, Eigen::VectorXi &vecExponentValues)
Definition spline.h:313
QSharedPointer< Spline > SPtr
Definition spline.h:77
void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold)
void setColorMap(const QString &colorMap)
Definition spline.cpp:305
double dataToPixelY(double dataY) const
Definition spline.cpp:79
double m_dMaxAxisX
Definition spline.h:174
const QVector3D & getThreshold()
Definition spline.cpp:313
double m_dMinAxisX
Definition spline.h:173
void paintEvent(QPaintEvent *event) override
Definition spline.cpp:98
int rightMargin() const
Definition spline.h:213
bool m_bHasThresholds
Definition spline.h:232
int leftMargin() const
Definition spline.h:207