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