101 lines
2.3 KiB
C++
101 lines
2.3 KiB
C++
#ifndef HISTOGRAMCHART_H
|
|
#define HISTOGRAMCHART_H
|
|
|
|
#include <cmath>
|
|
|
|
#include <QQuickItem>
|
|
#include <QtQuick/QQuickPaintedItem>
|
|
#include <QColor>
|
|
|
|
|
|
struct Statistics {
|
|
qreal sum = 0;
|
|
qreal sumSquares = 0;
|
|
int count = 0;
|
|
|
|
void add(qreal v) {
|
|
sum += v;
|
|
sumSquares += v*v;
|
|
count++;
|
|
}
|
|
|
|
void clear() {
|
|
sum = 0;
|
|
sumSquares = 0;
|
|
count = 0;
|
|
}
|
|
|
|
int getCount() const {
|
|
return count;
|
|
}
|
|
|
|
qreal getMean() const {
|
|
return sum / static_cast<qreal>(count);
|
|
}
|
|
|
|
qreal getStdDev() const {
|
|
const qreal x = sumSquares / static_cast<qreal>(count);
|
|
const qreal e = getMean();
|
|
return std::sqrt(x - (e*e));
|
|
}
|
|
};
|
|
|
|
class HistogramChart : public QQuickPaintedItem
|
|
{
|
|
Q_OBJECT
|
|
Q_PROPERTY(QString name READ name WRITE setName)
|
|
Q_PROPERTY(QColor color READ color WRITE setColor)
|
|
Q_PROPERTY(qreal binWidth READ binWidth WRITE setBinWidth)
|
|
Q_PROPERTY(qreal mean READ mean)
|
|
Q_PROPERTY(qreal stdDev READ stdDev)
|
|
Q_PROPERTY(int totalCount READ totalCount)
|
|
Q_PROPERTY(qreal maxBinValue READ maxBinValue)
|
|
|
|
public:
|
|
HistogramChart(QQuickItem* parent = nullptr);
|
|
|
|
QString name() const { return m_name; }
|
|
void setName(const QString &name) { m_name = name; }
|
|
|
|
QColor color() const { return m_color; }
|
|
void setColor(const QColor& color) { m_color = color; }
|
|
|
|
qreal binWidth() const { return _binWidth; }
|
|
void setBinWidth(qreal newBinWidth) { _binWidth = newBinWidth; reset(); }
|
|
|
|
qreal mean() const { return stats.getMean(); }
|
|
qreal stdDev() const { return stats.getStdDev(); }
|
|
int totalCount() const { return stats.getCount(); }
|
|
qreal maxBinValue() const { return maxBinIndex * binWidth(); }
|
|
|
|
void paint(QPainter *painter);
|
|
|
|
Q_INVOKABLE void pushData(qreal value);
|
|
|
|
Q_INVOKABLE void clear(); // soft reset
|
|
Q_INVOKABLE void reset(); // hard reset
|
|
|
|
public:
|
|
int numberOfBins() const;
|
|
int binIndex(qreal value) const;
|
|
|
|
|
|
private:
|
|
QString m_name;
|
|
QColor m_color;
|
|
|
|
std::vector<int> _histogram;
|
|
qreal _binWidth = 100;
|
|
qreal minValue = std::numeric_limits<qreal>::quiet_NaN();
|
|
qreal maxValue = std::numeric_limits<qreal>::quiet_NaN();
|
|
|
|
size_t lastUpdatedBinIndex = 0;
|
|
int maxBinCount = 0;
|
|
int maxBinIndex = 0;
|
|
|
|
// Satistics
|
|
Statistics stats;
|
|
};
|
|
|
|
#endif // HISTOGRAMCHART_H
|