98 lines
2.6 KiB
C++
98 lines
2.6 KiB
C++
#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<spec*>(parent())->get_smoothed_line(std::back_inserter(_line));
|
|
|
|
for(int i = 0; i < _smoothing_passes; i++)
|
|
{
|
|
std::vector<qreal> src = _line;
|
|
_line.clear();
|
|
spec::get_avg(_smoothing_factor, src.cbegin(), src.cend(), std::back_inserter(_line));
|
|
}
|
|
|
|
_dx = static_cast<spec*>(parent())->resolution();
|
|
_left_idx = qMax(0, qRound(_left/_dx));
|
|
_right_idx = qMin((int)static_cast<spec*>(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<std::vector<qreal>> 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];
|
|
}
|
|
}
|
|
}
|