#include "PlotDataBuffer.h"
#include <cmath>
#include <algorithm>
#include <limits>
using namespace std;
class MinMax
{
public:
MinMax():
minX_(numeric_limits<double>::max()),
maxX_(numeric_limits<double>::min()),
minY_(numeric_limits<double>::max()),
maxY_(numeric_limits<double>::min()),
empty_(true)
{
}
void operator()(const QPointF& p)
{
empty_ = false;
minX_ = min(minX_, p.x());
maxX_ = max(maxX_, p.x());
minY_ = min(minY_, p.y());
maxY_ = max(maxY_, p.y());
}
double getMinX() const
{
if(empty_)
{
return 0.0;
}
return minX_;
}
double getMaxX() const
{
if(empty_)
{
return 0.0;
}
return maxX_;
}
double getMinY() const
{
if(empty_)
{
return 0.0;
}
return minY_;
}
double getMaxY() const
{
if(empty_)
{
return 0.0;
}
return maxY_;
}
private:
double minX_;
double maxX_;
double minY_;
double maxY_;
bool empty_;
};
PlotDataBuffer::PlotDataBuffer(int windowSize):
minX_(0.0),
maxX_(0.0),
minY_(0.0),
maxY_(0.0),
windowSize_(windowSize),
minMaxValid_(true)
{
}
void PlotDataBuffer::setWindowSize(int windowSize)
{
if(windowSize == windowSize_)
{
return;
}
windowSize_ = windowSize;
while(deque_.size() > windowSize_)
{
deque_.pop_front();
}
minMaxValid_ = false;
}
void PlotDataBuffer::clear()
{
deque_.clear();
}
QRectF PlotDataBuffer
::boundingRect() const {
makeMinMaxValid();
return QRectF(minX_, minY_, maxX_
- minX_, maxY_
- minY_
);
}
void PlotDataBuffer::addData(const QPointF& p)
{
deque_.push_back(p);
while(deque_.size() > windowSize_)
{
deque_.pop_front();
}
minMaxValid_ = false;
}
void PlotDataBuffer::makeMinMaxValid() const
{
if(!minMaxValid_)
{
MinMax m = for_each(deque_.begin(), deque_.end(), MinMax());
minX_ = m.getMinX();
maxX_ = m.getMaxX();
minY_ = m.getMinY();
maxY_ = m.getMaxY();
minMaxValid_ = true;
}
}
double PlotDataBuffer::getMinX() const
{
makeMinMaxValid();
return minX_;
}
double PlotDataBuffer::getMaxX() const
{
makeMinMaxValid();
return maxX_;
}
double PlotDataBuffer::getMinY() const
{
makeMinMaxValid();
return minY_;
}
double PlotDataBuffer::getMaxY() const
{
makeMinMaxValid();
return maxY_;
}
#include "PlotDataBuffer.h"
#include <cmath>
#include <algorithm>
#include <limits>
using namespace std;
class MinMax
{
public:
MinMax():
minX_(numeric_limits<double>::max()),
maxX_(numeric_limits<double>::min()),
minY_(numeric_limits<double>::max()),
maxY_(numeric_limits<double>::min()),
empty_(true)
{
}
void operator()(const QPointF& p)
{
empty_ = false;
minX_ = min(minX_, p.x());
maxX_ = max(maxX_, p.x());
minY_ = min(minY_, p.y());
maxY_ = max(maxY_, p.y());
}
double getMinX() const
{
if(empty_)
{
return 0.0;
}
return minX_;
}
double getMaxX() const
{
if(empty_)
{
return 0.0;
}
return maxX_;
}
double getMinY() const
{
if(empty_)
{
return 0.0;
}
return minY_;
}
double getMaxY() const
{
if(empty_)
{
return 0.0;
}
return maxY_;
}
private:
double minX_;
double maxX_;
double minY_;
double maxY_;
bool empty_;
};
PlotDataBuffer::PlotDataBuffer(int windowSize):
minX_(0.0),
maxX_(0.0),
minY_(0.0),
maxY_(0.0),
windowSize_(windowSize),
minMaxValid_(true)
{
}
void PlotDataBuffer::setWindowSize(int windowSize)
{
if(windowSize == windowSize_)
{
return;
}
windowSize_ = windowSize;
while(deque_.size() > windowSize_)
{
deque_.pop_front();
}
minMaxValid_ = false;
}
void PlotDataBuffer::clear()
{
deque_.clear();
}
QRectF PlotDataBuffer::boundingRect() const
{
makeMinMaxValid();
return QRectF(minX_, minY_, maxX_ - minX_, maxY_ - minY_);
}
void PlotDataBuffer::addData(const QPointF& p)
{
deque_.push_back(p);
while(deque_.size() > windowSize_)
{
deque_.pop_front();
}
minMaxValid_ = false;
}
void PlotDataBuffer::makeMinMaxValid() const
{
if(!minMaxValid_)
{
MinMax m = for_each(deque_.begin(), deque_.end(), MinMax());
minX_ = m.getMinX();
maxX_ = m.getMaxX();
minY_ = m.getMinY();
maxY_ = m.getMaxY();
minMaxValid_ = true;
}
}
double PlotDataBuffer::getMinX() const
{
makeMinMaxValid();
return minX_;
}
double PlotDataBuffer::getMaxX() const
{
makeMinMaxValid();
return maxX_;
}
double PlotDataBuffer::getMinY() const
{
makeMinMaxValid();
return minY_;
}
double PlotDataBuffer::getMaxY() const
{
makeMinMaxValid();
return maxY_;
}
To copy to clipboard, switch view to plain text mode
Bookmarks