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//=============================================================================================================
74class DISPSHARED_EXPORT Spline : public QWidget
75{
76 Q_OBJECT
77
78public:
79 typedef QSharedPointer<Spline> SPtr;
80 typedef QSharedPointer<const Spline> ConstSPtr;
81
82 //=========================================================================================================
88 Spline(QWidget* parent = nullptr, const QString& title = "Spline Histogram");
89
90 //=========================================================================================================
97 template<typename T>
98 void setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
99 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData);
100 template<typename T>
101 void setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
102 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData);
103
104 //=========================================================================================================
111 template<typename T>
112 void updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
113 const Eigen::VectorXi& matClassFrequencyData);
114
115 //=========================================================================================================
121 void mousePressEvent(QMouseEvent* event) override;
122
123 //=========================================================================================================
133 template<typename T>
134 void splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
135 int iClassAmount,
136 Eigen::VectorXd& vecCoefficientResults,
137 Eigen::VectorXi& vecExponentValues);
138
139 //=========================================================================================================
145 void setThreshold(const QVector3D& vecThresholdValues);
146
147 //=========================================================================================================
153 const QVector3D& getThreshold();
154
155 //=========================================================================================================
163 QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues,
164 QString upOrDown);
165
166 //=========================================================================================================
172 void setColorMap(const QString& colorMap);
173
175 double m_dMinAxisX;
176 double m_dMaxAxisX;
177
178protected:
179 //=========================================================================================================
185 void paintEvent(QPaintEvent* event) override;
186
187 //=========================================================================================================
195 double dataToPixelX(double dataX) const;
196
197 //=========================================================================================================
205 double dataToPixelY(double dataY) const;
206
207 //=========================================================================================================
215 double pixelToDataX(double pixelX) const;
216
217 //=========================================================================================================
223 int leftMargin() const
224 {
225 return 60;
226 }
227
228 //=========================================================================================================
234 int rightMargin() const
235 {
236 return 20;
237 }
238
239 //=========================================================================================================
245 int topMargin() const
246 {
247 return 30;
248 }
249
250 //=========================================================================================================
256 int bottomMargin() const
257 {
258 return 40;
259 }
260
261 QList<QPointF> m_seriesData;
268 QString m_colorMap;
270
271signals:
272 //=========================================================================================================
280 void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold);
281};
282
283//=============================================================================================================
284// INLINE DEFINITIONS
285//=============================================================================================================
286
287template<typename T>
288void Spline::setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
289 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData)
290{
291 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matClassLimitData.rows(), 1);
292 matrixName.col(0) = matClassLimitData;
293 this->updatePlot(matrixName, matClassFrequencyData);
294}
295
296//=========================================================================================================
297
298template<typename T>
299void Spline::setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
300 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData)
301{
302 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1, matClassLimitData.cols());
303 matrixName.row(0) = matClassLimitData;
304 this->updatePlot(matrixName, matClassFrequencyData);
305}
306
307//=========================================================================================================
308
309template<typename T>
310void Spline::updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
311 const Eigen::VectorXi& matClassFrequencyData)
312{
313 Eigen::VectorXd resultDisplayValues;
314 int iClassAmount = std::min(static_cast<int>(matClassFrequencyData.rows()),
315 static_cast<int>(matClassLimitData.rows()) - 1);
316 if (iClassAmount < 1)
317 return;
318 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, m_vecResultExponentValues);
319
320 m_dMinAxisX = resultDisplayValues(0);
321 m_dMaxAxisX = resultDisplayValues(iClassAmount);
322
323 m_seriesData.clear();
325
326 for (int ir = 0; ir < iClassAmount; ++ir) {
327 double classMark = (resultDisplayValues(ir) + resultDisplayValues(ir + 1)) / 2.0;
328 m_seriesData.append(QPointF(classMark, matClassFrequencyData(ir)));
329 if (matClassFrequencyData(ir) > m_iMaximumFrequency) {
330 m_iMaximumFrequency = matClassFrequencyData(ir);
331 }
332 }
333
334 m_bHasData = true;
338 m_bHasThresholds = false;
339
340 QWidget::update();
341}
342
343//=============================================================================================================
344
345template<typename T>
346void Spline::splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
347 int iClassAmount,
348 Eigen::VectorXd& vecCoefficientResults,
349 Eigen::VectorXi& vecExponentValues)
350{
351 vecCoefficientResults.resize(iClassAmount + 1);
352 vecExponentValues.resize(iClassAmount + 1);
353 double originalValue(0.0),
354 limitDisplayValue(0.0),
355 doubleExponentValue(0.0);
356 int limitExponentValue(0);
357 for (int ir = 0; ir <= iClassAmount; ++ir) {
358 originalValue = matClassLimitData(ir);
359 if (originalValue == 0.0) {
360 doubleExponentValue = 0.0;
361 } else {
362 doubleExponentValue = log10(std::fabs(originalValue));
363 }
364
365 limitExponentValue = round(doubleExponentValue);
366 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
367 vecCoefficientResults(ir) = limitDisplayValue;
368 vecExponentValues(ir) = limitExponentValue;
369 }
370
371 int lowestExponentValue{0},
372 highestExponentValue{0};
373
374 for (int ir = 0; ir <= iClassAmount; ++ir) {
375 if (vecExponentValues(ir) < lowestExponentValue) {
376 lowestExponentValue = vecExponentValues(ir);
377 }
378 if (vecExponentValues(ir) > highestExponentValue) {
379 highestExponentValue = vecExponentValues(ir);
380 }
381 }
382
383 if (highestExponentValue > 0) {
384 for (int ir = 0; ir <= iClassAmount; ++ir) {
385 while (vecExponentValues(ir) < highestExponentValue) {
386 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
387 vecExponentValues(ir)++;
388 }
389 }
390 }
391
392 if (lowestExponentValue < 0) {
393 for (int ir = 0; ir <= iClassAmount; ++ir) {
394 while (vecExponentValues(ir) > lowestExponentValue) {
395 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
396 vecExponentValues(ir)--;
397 }
398 }
399 }
400}
401} // NAMESPACE
402
403#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:262
QString m_colorMap
Definition spline.h:268
QSharedPointer< const Spline > ConstSPtr
Definition spline.h:80
double dataToPixelX(double dataX) const
Definition spline.cpp:69
QVector3D correctionDisplayTrueValue(QVector3D vecOriginalValues, QString upOrDown)
Definition spline.cpp:329
void mousePressEvent(QMouseEvent *event) override
Definition spline.cpp:232
void setThreshold(const QVector3D &vecThresholdValues)
Definition spline.cpp:273
QList< QPointF > m_seriesData
Definition spline.h:261
bool m_bHasData
Definition spline.h:265
int m_iMaximumFrequency
Definition spline.h:267
double m_dMiddleThreshold
Definition spline.h:263
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:310
int topMargin() const
Definition spline.h:245
QVector3D m_vecReturnVector
Definition spline.h:269
Eigen::VectorXi m_vecResultExponentValues
Definition spline.h:174
Spline(QWidget *parent=nullptr, const QString &title="Spline Histogram")
Definition spline.cpp:50
int bottomMargin() const
Definition spline.h:256
void setData(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &matClassFrequencyData)
Definition spline.h:288
double m_dRightThreshold
Definition spline.h:264
void splitCoefficientAndExponent(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, int iClassAmount, Eigen::VectorXd &vecCoefficientResults, Eigen::VectorXi &vecExponentValues)
Definition spline.h:346
QSharedPointer< Spline > SPtr
Definition spline.h:79
void borderChanged(double leftThreshold, double middleThreshold, double rightThreshold)
void setColorMap(const QString &colorMap)
Definition spline.cpp:309
double dataToPixelY(double dataY) const
Definition spline.cpp:79
double m_dMaxAxisX
Definition spline.h:176
const QVector3D & getThreshold()
Definition spline.cpp:317
double m_dMinAxisX
Definition spline.h:175
void paintEvent(QPaintEvent *event) override
Definition spline.cpp:98
int rightMargin() const
Definition spline.h:234
bool m_bHasThresholds
Definition spline.h:266
int leftMargin() const
Definition spline.h:223