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 = std::min(static_cast<int>(matClassFrequencyData.rows()),
287 static_cast<int>(matClassLimitData.rows()) - 1);
288 if(iClassAmount < 1) return;
289 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, m_vecResultExponentValues);
290
291 m_dMinAxisX = resultDisplayValues(0);
292 m_dMaxAxisX = resultDisplayValues(iClassAmount);
293
294 m_seriesData.clear();
296
297 for (int ir = 0; ir < iClassAmount; ++ir)
298 {
299 double classMark = (resultDisplayValues(ir) + resultDisplayValues(ir + 1)) / 2.0;
300 m_seriesData.append(QPointF(classMark, matClassFrequencyData(ir)));
301 if (matClassFrequencyData(ir) > m_iMaximumFrequency)
302 {
303 m_iMaximumFrequency = matClassFrequencyData(ir);
304 }
305 }
306
307 m_bHasData = true;
311 m_bHasThresholds = false;
312
313 QWidget::update();
314}
315
316//=============================================================================================================
317
318template <typename T>
319void Spline::splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
320 int iClassAmount,
321 Eigen::VectorXd& vecCoefficientResults,
322 Eigen::VectorXi& vecExponentValues)
323{
324 vecCoefficientResults.resize(iClassAmount + 1);
325 vecExponentValues.resize(iClassAmount + 1);
326 double originalValue(0.0),
327 limitDisplayValue(0.0),
328 doubleExponentValue(0.0);
329 int limitExponentValue(0);
330 for (int ir = 0; ir <= iClassAmount; ++ir)
331 {
332 originalValue = matClassLimitData(ir);
333 if (originalValue == 0.0)
334 {
335 doubleExponentValue = 0.0;
336 }
337 else
338 {
339 doubleExponentValue = log10(std::fabs(originalValue));
340 }
341
342 limitExponentValue = round(doubleExponentValue);
343 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
344 vecCoefficientResults(ir) = limitDisplayValue;
345 vecExponentValues(ir) = limitExponentValue;
346 }
347
348 int lowestExponentValue{0},
349 highestExponentValue{0};
350
351 for (int ir = 0; ir <= iClassAmount; ++ir)
352 {
353 if (vecExponentValues(ir) < lowestExponentValue)
354 {
355 lowestExponentValue = vecExponentValues(ir);
356 }
357 if (vecExponentValues(ir) > highestExponentValue)
358 {
359 highestExponentValue = vecExponentValues(ir);
360 }
361 }
362
363 if (highestExponentValue > 0)
364 {
365 for (int ir = 0; ir <= iClassAmount; ++ir)
366 {
367 while (vecExponentValues(ir) < highestExponentValue)
368 {
369 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
370 vecExponentValues(ir)++;
371 }
372 }
373 }
374
375 if (lowestExponentValue < 0)
376 {
377 for (int ir = 0; ir <= iClassAmount; ++ir)
378 {
379 while (vecExponentValues(ir) > lowestExponentValue)
380 {
381 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
382 vecExponentValues(ir)--;
383 }
384 }
385 }
386}
387} // NAMESPACE
388
389#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:319
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