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//=============================================================================================================
75class DISPSHARED_EXPORT Bar : public QWidget
76{
77 Q_OBJECT
78
79public:
80 typedef QSharedPointer<Bar> SPtr;
81 typedef QSharedPointer<const Bar> ConstSPtr;
82
83 //=========================================================================================================
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)
193 return;
194 this->splitCoefficientAndExponent(matClassLimitData, iClassAmount, resultDisplayValues, resultExponentValues);
195
196 // Setup legend text
197 m_sLegend = "X-axis scale: 10e" + QString::number(resultExponentValues(0));
198
199 // Build category labels and frequency list
200 m_categories.clear();
201 m_frequencies.clear();
202 m_iMaxFrequency = 0;
203
204 for (int kr = 0; kr < iClassAmount; ++kr) {
205 int classFreq = matClassFrequencyData(kr);
206 QString currentLimits = QString::number(resultDisplayValues(kr), 'g', iPrecisionValue) + " to " + 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 originalValue = matClassLimitData(ir);
232 if (originalValue == 0.0) {
233 doubleExponentValue = 0.0;
234 } else {
235 doubleExponentValue = log10(std::fabs(originalValue));
236 }
237
238 limitExponentValue = round(doubleExponentValue);
239 limitDisplayValue = originalValue * (pow(10, -(limitExponentValue)));
240 vecCoefficientResults(ir) = limitDisplayValue;
241 vecExponentValues(ir) = limitExponentValue;
242 }
243
244 int lowestExponentValue{0},
245 highestExponentValue{0};
246
247 for (int ir = 0; ir <= iClassAmount; ++ir) {
248 if (vecExponentValues(ir) < lowestExponentValue) {
249 lowestExponentValue = vecExponentValues(ir);
250 }
251 if (vecExponentValues(ir) > highestExponentValue) {
252 highestExponentValue = vecExponentValues(ir);
253 }
254 }
255
256 if (highestExponentValue > 0) {
257 for (int ir = 0; ir <= iClassAmount; ++ir) {
258 while (vecExponentValues(ir) < highestExponentValue) {
259 vecCoefficientResults(ir) = vecCoefficientResults(ir) / 10;
260 vecExponentValues(ir)++;
261 }
262 }
263 }
264
265 if (lowestExponentValue < 0) {
266 for (int ir = 0; ir <= iClassAmount; ++ir) {
267 while (vecExponentValues(ir) > lowestExponentValue) {
268 vecCoefficientResults(ir) = vecCoefficientResults(ir) * 10;
269 vecExponentValues(ir)--;
270 }
271 }
272 }
273}
274} // NAMESPACE
275
276#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:220
QSharedPointer< const Bar > ConstSPtr
Definition bar.h:81
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:160
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:184
QSharedPointer< Bar > SPtr
Definition bar.h:80