test_sdk/script/gtl_scr_spec_humps.cpp

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];
}
}
}