#include "gtl_scr_spec_humps.h" #include "gtl_scr_spec.h" namespace gtl { namespace scr { spec_humps::spec_humps(QObject *parent, const QJsonObject &args) : QObject{parent} , _left(args.value("left").toDouble(0)) , _right(args.value("right").toDouble(0)) , _color(args.value("color").toInt(0)) , _smoothing_factor(args.value("smoothing").toObject().value("factor").toInt(1)) , _smoothing_passes(args.value("smoothing").toObject().value("passes").toInt(1)) { } void spec_humps::update() { _line.clear(); static_cast(parent())->get_smoothed_line(std::back_inserter(_line)); for(int i = 0; i < _smoothing_passes; i++) { std::vector src = _line; _line.clear(); spec::get_avg(_smoothing_factor, src.cbegin(), src.cend(), std::back_inserter(_line)); } _dx = static_cast(parent())->resolution(); _left_idx = qMax(0, qRound(_left/_dx)); _right_idx = qMin((int)static_cast(parent())->size() - 1, qRound(_right/_dx)); _x0 = _left_idx*_dx; _humps.clear(); hump hump; hump.left_idx = -1; for(int i = _left_idx; i <= _right_idx; i++) { hump.area += _line[i]; if((_line[i]< _line[i + 1] && _line[i - 1] >= _line[i])) { if(hump.left_idx >= 0) { hump.right_idx = i - _left_idx; hump.bgnd = (hump.right_idx - hump.left_idx + 1)*(_line[hump.right_idx] + _line[hump.left_idx])*0.5; hump.net = hump.area - hump.bgnd; _humps.push_back(hump); } hump.left_idx = i - _left_idx; hump.area = 0; } } } void spec_humps::get_line(std::back_insert_iterator> line) { std::copy(_line.begin() + _left_idx, _line.begin() + _right_idx + 1, line); } qreal spec_humps::x0() const { return _x0; } qreal spec_humps::dx() const { return _dx; } int spec_humps::color() const { return _color; } int spec_humps::count() const { return _humps.size(); } const spec_humps::hump &spec_humps::operator[](int idx) const { return _humps[idx]; } } }