From 75a5a4ec4ebbd0a0417daee73b5481675fe7180b Mon Sep 17 00:00:00 2001 From: koldo Date: Fri, 21 Aug 2015 21:20:26 +0000 Subject: [PATCH] ScatterDraw: Improved Null data handling git-svn-id: svn://ultimatepp.org/upp/trunk@8829 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/ScatterDraw/DataSource.cpp | 33 +++++++++++++++---- uppsrc/ScatterDraw/ScatterDraw.cpp | 52 ++++++++++++++++++++++++++++++ uppsrc/ScatterDraw/ScatterDraw.h | 5 +++ 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/uppsrc/ScatterDraw/DataSource.cpp b/uppsrc/ScatterDraw/DataSource.cpp index 0cbcce77c..d76ab3b8c 100644 --- a/uppsrc/ScatterDraw/DataSource.cpp +++ b/uppsrc/ScatterDraw/DataSource.cpp @@ -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) { diff --git a/uppsrc/ScatterDraw/ScatterDraw.cpp b/uppsrc/ScatterDraw/ScatterDraw.cpp index 5a86b35da..4384858d3 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.cpp +++ b/uppsrc/ScatterDraw/ScatterDraw.cpp @@ -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; diff --git a/uppsrc/ScatterDraw/ScatterDraw.h b/uppsrc/ScatterDraw/ScatterDraw.h index 42f3a7f43..8924c8553 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.h +++ b/uppsrc/ScatterDraw/ScatterDraw.h @@ -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);