ScatterDraw: Improved Null data handling

git-svn-id: svn://ultimatepp.org/upp/trunk@8829 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
koldo 2015-08-21 21:20:26 +00:00
parent 870183059b
commit 75a5a4ec4e
3 changed files with 84 additions and 6 deletions

View file

@ -11,6 +11,8 @@ double DataSource::Min(Getdatafun getdata) {
if (!IsNull(d) && minVal > d)
minVal = d;
}
if (minVal == -DOUBLE_NULL)
return Null;
return minVal;
}
@ -21,25 +23,44 @@ double DataSource::Max(Getdatafun getdata) {
if (!IsNull(d) && maxVal < d)
maxVal = d;
}
if (maxVal == DOUBLE_NULL)
return Null;
return maxVal;
}
double DataSource::Avg(Getdatafun getdata) {
double ret = 0;
for (int64 i = 0; i < GetCount(); ++i)
ret += Membercall(getdata)(i);
return ret/GetCount();
int count = 0;
for (int64 i = 0; i < GetCount(); ++i) {
double d = Membercall(getdata)(i);
if (!IsNull(d)) {
ret += d;
count++;
}
}
if (count == 0)
return Null;
return ret/count;
}
double DataSource::Variance(Getdatafun getdata, double avg) {
if (IsNull(avg))
avg = Avg(getdata);
if (IsNull(avg))
return Null;
double ret = 0;
int count = 0;
for (int64 i = 0; i < GetCount(); ++i) {
double val = Membercall(getdata)(i) - avg;
ret += val*val;
double d = Membercall(getdata)(i);
if (!IsNull(d)) {
d -= avg;
ret += d*d;
count++;
}
}
return ret/(GetCount() - 1);
if (count <= 0)
return Null;
return ret/(count - 1);
}
double DataSource::StdDev(Getdatafun getdata, double avg) {

View file

@ -378,7 +378,59 @@ void ScatterDraw::FitToData(bool vertical, double factor) {
linkedCtrls[i]->DoFitToData(vertical);
}
}
double ScatterDraw::GetXMin() {
double minx = -DOUBLE_NULL;
//double maxx = DOUBLE_NULL;
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
minx = min(minx, series[j].PointsData()->MinX());
//maxx = max(maxx, series[j].PointsData()->MaxX());
}
return minx;
}
double ScatterDraw::GetXMax() {
//double minx = -DOUBLE_NULL;
double maxx = DOUBLE_NULL;
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
//minx = min(minx, series[j].PointsData()->MinX());
maxx = max(maxx, series[j].PointsData()->MaxX());
}
return maxx;
}
double ScatterDraw::GetYMin() {
double miny = -DOUBLE_NULL;
//double maxy = DOUBLE_NULL;
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
miny = min(miny, series[j].PointsData()->MinY());
//maxy = max(maxy, series[j].PointsData()->MaxY());
}
return miny;
}
double ScatterDraw::GetYMax() {
//double miny = -DOUBLE_NULL;
double maxy = DOUBLE_NULL;
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
//miny = min(miny, series[j].PointsData()->MinY());
maxy = max(maxy, series[j].PointsData()->MaxY());
}
return maxy;
}
void ScatterDraw::DoFitToData(bool vertical, double factor) {
double minx, maxx, miny, miny2, maxy, maxy2;
minx = miny = miny2 = -DOUBLE_NULL;

View file

@ -166,6 +166,11 @@ public:
ScatterDraw& SetMode(int _mode = MD_ANTIALIASED) {mode = _mode; Refresh(); return *this;};
int GetMode() {return mode;};
double GetXMax();
double GetXMin();
double GetYMax();
double GetYMin();
void FitToData(bool Y = false, double factor = 0);
void Zoom(double scale, bool hor = true, bool ver = true);
void Scroll(double factorX, double factorY);