v2.0.0
Loading...
Searching...
No Matches
spline.h
Go to the documentation of this file.
1//=============================================================================================================
33
34#ifndef SPLINE_H
35#define SPLINE_H
36
37//=============================================================================================================
38// INCLUDES
39//=============================================================================================================
40
41#include "../disp_global.h"
42
43//=============================================================================================================
44// QT INCLUDES
45//=============================================================================================================
46
47#include <QWidget>
48#include <QVector3D>
49
50//=============================================================================================================
51// EIGEN INCLUDES
52//=============================================================================================================
53
54#include <Eigen/Core>
55
56//=============================================================================================================
57// FORWARD DECLARATIONS
58//=============================================================================================================
59
60class QMouseEvent;
61
62//=============================================================================================================
63// DEFINE NAMESPACE DISPLIB
64//=============================================================================================================
65
66namespace DISPLIB
67{
68
69//=============================================================================================================
70// DISPLIB FORWARD DECLARATIONS
71//=============================================================================================================
72
73//=============================================================================================================
78class DISPSHARED_EXPORT Spline: public QWidget
79{
80 Q_OBJECT
81
82public:
83 typedef QSharedPointer<Spline> SPtr;
84 typedef QSharedPointer<const Spline> ConstSPtr;
85
86 //=========================================================================================================
92 Spline(QWidget* parent = nullptr, const QString& title = "Spline Histogram");
93
94 //=========================================================================================================
101 template<typename T>
102 void setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
103 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData);
104 template<typename T>
105 void setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
106 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData);
107
108 //=========================================================================================================
115 template<typename T>
116 void updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
117 const Eigen::VectorXi& matClassFrequencyData);
118
119 //=========================================================================================================
125 void mousePressEvent(QMouseEvent *event) override;
126
127 //=========================================================================================================
137 template<typename T>
138 void splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
139 int iClassAmount,
140 Eigen::VectorXd& vecCoefficientResults,
141 Eigen::VectorXi& vecExponentValues);
142
143 //=========================================================================================================
149 void setThreshold(const QVector3D& vecThresholdValues);
150
151 //=========================================================================================================
157 const QVector3D& getThreshold();
158
159 //=========================================================================================================
167 QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues,
168 QString upOrDown);
169
170 //=========================================================================================================
176 void setColorMap(const QString &colorMap);
177
179 double m_dMinAxisX;
180 double m_dMaxAxisX;
181
182protected:
183 //=========================================================================================================
189 void paintEvent(QPaintEvent *event) override;
190
191 //=========================================================================================================
195 double dataToPixelX(double dataX) const;
196
197 //=========================================================================================================
201 double dataToPixelY(double dataY) const;
202
203 //=========================================================================================================
207 double pixelToDataX(double pixelX) const;
208
209 //=========================================================================================================
213 int leftMargin() const { return 60; }
214
215 //=========================================================================================================
219 int rightMargin() const { return 20; }
220
221 //=========================================================================================================
225 int topMargin() const { return 30; }
226
227 //=========================================================================================================
231 int bottomMargin() const { return 40; }
232
233 QList<QPointF> m_seriesData;
240 QString m_colorMap;
242
243signals:
244 //=========================================================================================================
252 void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold);
253};
254
255//=============================================================================================================
256// INLINE DEFINITIONS
257//=============================================================================================================
258
259template <typename T>
260void Spline::setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
261 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData)
262{
263 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matClassLimitData.rows(),1);
264 matrixName.col(0) = matClassLimitData;
265 this->updatePlot(matrixName, matClassFrequencyData);
266}
267
268//=========================================================================================================
269
270template <typename T>
271void Spline::setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
272 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData)
273{
274 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1, matClassLimitData.cols());
275 matrixName.row(0) = matClassLimitData;
276 this->updatePlot(matrixName, matClassFrequencyData);
277}
278
279//=========================================================================================================
280
281template<typename T>
282void Spline::updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
283 const Eigen::VectorXi& matClassFrequencyData)
284{
285 Eigen::VectorXd resultDisplayValues;
286 int iClassAmount = matClassFrequencyData.rows();
287 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, m_vecResultExponentValues);
288
289 m_dMinAxisX = resultDisplayValues(0);
290 m_dMaxAxisX = resultDisplayValues(iClassAmount);
291
292 m_seriesData.clear();
294
295 for (int ir = 0; ir < iClassAmount; ++ir)
296 {
297 double classMark = (resultDisplayValues(ir) + resultDisplayValues(ir + 1)) / 2.0;
298 m_seriesData.append(QPointF(classMark, matClassFrequencyData(ir)));
299 if (matClassFrequencyData(ir) > m_iMaximumFrequency)
300 {
301 m_iMaximumFrequency = matClassFrequencyData(ir);
302 }
303 }
304
305 m_bHasData = true;
309 m_bHasThresholds = false;
310
311 QWidget::update();
312}
313
314//=============================================================================================================
315
316template <typename T>
317void Spline::splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
318 int iClassAmount,
319 Eigen::VectorXd& vecCoefficientResults,
320 Eigen::VectorXi& vecExponentValues)
321{
322 vecCoefficientResults.resize(iClassAmount + 1);
323 vecExponentValues.resize(iClassAmount + 1);
324 double originalValue(0.0),
325 limitDisplayValue(0.0),
326 doubleExponentValue(0.0);
327 int limitExponentValue(0);
328 for (int ir = 0; ir <= iClassAmount; ++ir)
329 {
330 originalValue = matClassLimitData(ir);
331 if (originalValue == 0.0)
332 {
333 doubleExponentValue = 0.0;
334 }
335 else
336 {
337 doubleExponentValue = log10(std::fabs(originalValue));
338 }
339
340 limitExponentValue = round(doubleExponentValue);
341 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
342 vecCoefficientResults(ir) = limitDisplayValue;
343 vecExponentValues(ir) = limitExponentValue;
344 }
345
346 int lowestExponentValue{0},
347 highestExponentValue{0};
348
349 for (int ir = 0; ir <= iClassAmount; ++ir)
350 {
351 if (vecExponentValues(ir) < lowestExponentValue)
352 {
353 lowestExponentValue = vecExponentValues(ir);
354 }
355 if (vecExponentValues(ir) > highestExponentValue)
356 {
357 highestExponentValue = vecExponentValues(ir);
358 }
359 }
360
361 if (highestExponentValue > 0)
362 {
363 for (int ir = 0; ir <= iClassAmount; ++ir)
364 {
365 while (vecExponentValues(ir) < highestExponentValue)
366 {
367 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
368 vecExponentValues(ir)++;
369 }
370 }
371 }
372
373 if (lowestExponentValue < 0)
374 {
375 for (int ir = 0; ir <= iClassAmount; ++ir)
376 {
377 while (vecExponentValues(ir) > lowestExponentValue)
378 {
379 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
380 vecExponentValues(ir)--;
381 }
382 }
383 }
384}
385} // NAMESPACE
386
387#endif // SPLINE_H
disp library export/import macros.
#define DISPSHARED_EXPORT
Definition disp_global.h:51
2-D display widgets and visualisation helpers (charts, topography, colour maps).
double m_dLeftThreshold
Definition spline.h:234
QString m_colorMap
Definition spline.h:240
QSharedPointer< const Spline > ConstSPtr
Definition spline.h:84
double dataToPixelX(double dataX) const
Definition spline.cpp:87
QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues, QString upOrDown)
Definition spline.cpp:343
void mousePressEvent(QMouseEvent *event) override
Definition spline.cpp:248
void setThreshold(const QVector3D &vecThresholdValues)
Definition spline.cpp:289
QList< QPointF > m_seriesData
Definition spline.h:233
bool m_bHasData
Definition spline.h:237
int m_iMaximumFrequency
Definition spline.h:239
double m_dMiddleThreshold
Definition spline.h:235
double pixelToDataX(double pixelX) const
Definition spline.cpp:106
void updatePlot(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, const Eigen::VectorXi &matClassFrequencyData)
Definition spline.h:282
int topMargin() const
Definition spline.h:225
QVector3D m_vecReturnVector
Definition spline.h:241
Eigen::VectorXi m_vecResultExponentValues
Definition spline.h:178
Spline(QWidget *parent=nullptr, const QString &title="Spline Histogram")
Definition spline.cpp:68
int bottomMargin() const
Definition spline.h:231
void setData(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &matClassFrequencyData)
Definition spline.h:260
double m_dRightThreshold
Definition spline.h:236
void splitCoefficientAndExponent(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, int iClassAmount, Eigen::VectorXd &vecCoefficientResults, Eigen::VectorXi &vecExponentValues)
Definition spline.h:317
QSharedPointer< Spline > SPtr
Definition spline.h:83
void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold)
void setColorMap(const QString &colorMap)
Definition spline.cpp:323
double dataToPixelY(double dataY) const
Definition spline.cpp:97
double m_dMaxAxisX
Definition spline.h:180
const QVector3D & getThreshold()
Definition spline.cpp:331
double m_dMinAxisX
Definition spline.h:179
void paintEvent(QPaintEvent *event) override
Definition spline.cpp:116
int rightMargin() const
Definition spline.h:219
bool m_bHasThresholds
Definition spline.h:238
int leftMargin() const
Definition spline.h:213