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 = std::min(static_cast<int>(matClassFrequencyData.rows()),
191 static_cast<int>(matClassLimitData.rows()) - 1);
192 if(iClassAmount < 1) return;
193 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, resultExponentValues);
194
195 // Setup legend text
196 m_sLegend = "X-axis scale: 10e" + QString::number(resultExponentValues(0));
197
198 // Build category labels and frequency list
199 m_categories.clear();
200 m_frequencies.clear();
201 m_iMaxFrequency = 0;
202
203 for (int kr = 0; kr < iClassAmount; ++kr)
204 {
205 int classFreq = matClassFrequencyData(kr);
206 QString currentLimits = QString::number(resultDisplayValues(kr), 'g', iPrecisionValue)
207 + " to "
208 + QString::number(resultDisplayValues(kr + 1), 'g', iPrecisionValue);
209 m_categories << currentLimits;
210 m_frequencies << classFreq;
211 if (classFreq > m_iMaxFrequency) {
212 m_iMaxFrequency = classFreq;
213 }
214 }
215
216 QWidget::update();
217}
218
219//=============================================================================================================
220
221template <typename T>
222void Bar::splitCoefficientAndExponent(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matClassLimitData,
223 int iClassAmount,
224 Eigen::VectorXd& vecCoefficientResults, Eigen::VectorXi& vecExponentValues)
225{
226 vecCoefficientResults.resize(iClassAmount + 1);
227 vecExponentValues.resize(iClassAmount + 1);
228 double originalValue(0.0),
229 limitDisplayValue(0.0),
230 doubleExponentValue(0.0);
231 int limitExponentValue(0);
232 for (int ir = 0; ir <= iClassAmount; ++ir)
233 {
234 originalValue = matClassLimitData(ir);
235 if (originalValue == 0.0)
236 {
237 doubleExponentValue = 0.0;
238 }
239 else
240 {
241 doubleExponentValue = log10(std::fabs(originalValue));
242 }
243
244 limitExponentValue = round(doubleExponentValue);
245 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
246 vecCoefficientResults(ir) = limitDisplayValue;
247 vecExponentValues(ir) = limitExponentValue;
248 }
249
250 int lowestExponentValue{0},
251 highestExponentValue{0};
252
253 for (int ir = 0; ir <= iClassAmount; ++ir)
254 {
255 if (vecExponentValues(ir) < lowestExponentValue)
256 {
257 lowestExponentValue = vecExponentValues(ir);
258 }
259 if (vecExponentValues(ir) > highestExponentValue)
260 {
261 highestExponentValue = vecExponentValues(ir);
262 }
263 }
264
265 if (highestExponentValue > 0)
266 {
267 for (int ir = 0; ir <= iClassAmount; ++ir)
268 {
269 while (vecExponentValues(ir) < highestExponentValue)
270 {
271 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
272 vecExponentValues(ir)++;
273 }
274 }
275 }
276
277 if (lowestExponentValue < 0)
278 {
279 for (int ir = 0; ir <= iClassAmount; ++ir)
280 {
281 while (vecExponentValues(ir) > lowestExponentValue)
282 {
283 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
284 vecExponentValues(ir)--;
285 }
286 }
287 }
288}
289} // NAMESPACE
290
291#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:222
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