v2.0.0
Loading...
Searching...
No Matches
bar.h
Go to the documentation of this file.
1//=============================================================================================================
25
26#ifndef BAR_H
27#define BAR_H
28
29//=============================================================================================================
30// INCLUDES
31//=============================================================================================================
32
33#include "../disp_global.h"
34
35//=============================================================================================================
36// QT INCLUDES
37//=============================================================================================================
38
39#include <QWidget>
40#include <QStringList>
41
42//=============================================================================================================
43// EIGEN INCLUDES
44//=============================================================================================================
45
46#include <Eigen/Core>
47
48//=============================================================================================================
49// FORWARD DECLARATIONS
50//=============================================================================================================
51
52//=============================================================================================================
53// DEFINE NAMESPACE DISPLIB
54//=============================================================================================================
55
56namespace DISPLIB
57{
58
59//=============================================================================================================
60// DISPLIB FORWARD DECLARATIONS
61//=============================================================================================================
62
63//=============================================================================================================
73class DISPSHARED_EXPORT Bar : public QWidget
74{
75 Q_OBJECT
76
77public:
78 typedef QSharedPointer<Bar> SPtr;
79 typedef QSharedPointer<const Bar> ConstSPtr;
80
81 //=========================================================================================================
85 Bar(const QString& title = "", QWidget* parent = nullptr);
86
87 //=========================================================================================================
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 int iPrecisionValue);
99 template<typename T>
100 void setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
101 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData,
102 int iPrecisionValue);
103
104 //=========================================================================================================
112 template<typename T>
113 void updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
114 const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>& matClassFrequencyData,
115 int iPrecisionValue);
116
117 //=========================================================================================================
127 template<typename T>
128 void splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
129 int iClassAmount,
130 Eigen::VectorXd& vecCoefficientResults,
131 Eigen::VectorXi& vecExponentValues);
132
133protected:
134 //=========================================================================================================
140 void paintEvent(QPaintEvent *event) override;
141
142private:
143 QString m_sTitle;
144 QString m_sLegend;
145 QStringList m_categories;
146 QList<int> m_frequencies;
147 int m_iMaxFrequency;
148};
149
150//=============================================================================================================
151// INLINE DEFINITIONS
152//=============================================================================================================
153
154template<typename T>
155void Bar::setData(const Eigen::Matrix<T, Eigen::Dynamic, 1>& matClassLimitData,
156 const Eigen::Matrix<int, Eigen::Dynamic, 1>& matClassFrequencyData,
157 int iPrecisionValue)
158{
159 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matClassLimitData.rows(),1);
160 matrixName.col(0) = matClassLimitData;
161 this->updatePlot(matrixName, matClassFrequencyData, iPrecisionValue);
162}
163
164//=============================================================================================================
165
166template<typename T>
167void Bar::setData(const Eigen::Matrix<T, 1, Eigen::Dynamic>& matClassLimitData,
168 const Eigen::Matrix<int, 1, Eigen::Dynamic>& matClassFrequencyData,
169 int iPrecisionValue)
170{
171 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1, matClassLimitData.cols());
172 matrixName.row(0) = matClassLimitData;
173 this->updatePlot(matrixName, matClassFrequencyData, iPrecisionValue);
174}
175
176//=============================================================================================================
177
178template<typename T>
179void Bar::updatePlot(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
180 const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>& matClassFrequencyData,
181 int iPrecisionValue)
182{
183 Eigen::VectorXd resultDisplayValues;
184 Eigen::VectorXi resultExponentValues;
185 int iClassAmount = std::min(static_cast<int>(matClassFrequencyData.rows()),
186 static_cast<int>(matClassLimitData.rows()) - 1);
187 if(iClassAmount < 1) return;
188 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, resultExponentValues);
189
190 // Setup legend text
191 m_sLegend = "X-axis scale: 10e" + QString::number(resultExponentValues(0));
192
193 // Build category labels and frequency list
194 m_categories.clear();
195 m_frequencies.clear();
196 m_iMaxFrequency = 0;
197
198 for (int kr = 0; kr < iClassAmount; ++kr)
199 {
200 int classFreq = matClassFrequencyData(kr);
201 QString currentLimits = QString::number(resultDisplayValues(kr), 'g', iPrecisionValue)
202 + " to "
203 + QString::number(resultDisplayValues(kr + 1), 'g', iPrecisionValue);
204 m_categories << currentLimits;
205 m_frequencies << classFreq;
206 if (classFreq > m_iMaxFrequency) {
207 m_iMaxFrequency = classFreq;
208 }
209 }
210
211 QWidget::update();
212}
213
214//=============================================================================================================
215
216template <typename T>
217void Bar::splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
218 int iClassAmount,
219 Eigen::VectorXd& vecCoefficientResults, Eigen::VectorXi& vecExponentValues)
220{
221 vecCoefficientResults.resize(iClassAmount + 1);
222 vecExponentValues.resize(iClassAmount + 1);
223 double originalValue(0.0),
224 limitDisplayValue(0.0),
225 doubleExponentValue(0.0);
226 int limitExponentValue(0);
227 for (int ir = 0; ir <= iClassAmount; ++ir)
228 {
229 originalValue = matClassLimitData(ir);
230 if (originalValue == 0.0)
231 {
232 doubleExponentValue = 0.0;
233 }
234 else
235 {
236 doubleExponentValue = log10(std::fabs(originalValue));
237 }
238
239 limitExponentValue = round(doubleExponentValue);
240 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
241 vecCoefficientResults(ir) = limitDisplayValue;
242 vecExponentValues(ir) = limitExponentValue;
243 }
244
245 int lowestExponentValue{0},
246 highestExponentValue{0};
247
248 for (int ir = 0; ir <= iClassAmount; ++ir)
249 {
250 if (vecExponentValues(ir) < lowestExponentValue)
251 {
252 lowestExponentValue = vecExponentValues(ir);
253 }
254 if (vecExponentValues(ir) > highestExponentValue)
255 {
256 highestExponentValue = vecExponentValues(ir);
257 }
258 }
259
260 if (highestExponentValue > 0)
261 {
262 for (int ir = 0; ir <= iClassAmount; ++ir)
263 {
264 while (vecExponentValues(ir) < highestExponentValue)
265 {
266 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
267 vecExponentValues(ir)++;
268 }
269 }
270 }
271
272 if (lowestExponentValue < 0)
273 {
274 for (int ir = 0; ir <= iClassAmount; ++ir)
275 {
276 while (vecExponentValues(ir) > lowestExponentValue)
277 {
278 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
279 vecExponentValues(ir)--;
280 }
281 }
282 }
283}
284} // NAMESPACE
285
286#endif // BAR_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).
void splitCoefficientAndExponent(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, int iClassAmount, Eigen::VectorXd &vecCoefficientResults, Eigen::VectorXi &vecExponentValues)
Definition bar.h:217
QSharedPointer< const Bar > ConstSPtr
Definition bar.h:79
void paintEvent(QPaintEvent *event) override
Definition bar.cpp:61
void setData(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, 1 > &matClassFrequencyData, int iPrecisionValue)
Definition bar.h:155
Bar(const QString &title="", QWidget *parent=nullptr)
Definition bar.cpp:48
void updatePlot(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matClassLimitData, const Eigen::Matrix< int, Eigen::Dynamic, Eigen::Dynamic > &matClassFrequencyData, int iPrecisionValue)
Definition bar.h:179
QSharedPointer< Bar > SPtr
Definition bar.h:78