diff --git a/uppsrc/ScatterDraw/DataSource.cpp b/uppsrc/ScatterDraw/DataSource.cpp index 3da8dd19f..1246d9521 100644 --- a/uppsrc/ScatterDraw/DataSource.cpp +++ b/uppsrc/ScatterDraw/DataSource.cpp @@ -311,6 +311,7 @@ bool DataSource::SinEstim_FreqPhase(double &frequency, double &phase, double avg phase = -frequency*firstZero; if (!firstIsToPositive) phase += M_PI; + phase = phase - 2*M_PI*int(phase/(2*M_PI)); return true; } @@ -357,13 +358,25 @@ Vector DataSource::FFT(Getdatafun getdata, double tSample, bool frequenc } catch(...) { return res; } + double threshold = 0; + if (type == T_PHASE) { + for (int i = 0; i < int(freqbuf.size()); ++i) { + if (threshold < std::abs(freqbuf[i])) + threshold = std::abs(freqbuf[i]); + } + } + threshold /= 10000.; if (frequency) { for (int i = 0; i < int(freqbuf.size()); ++i) { double xdata = i/(tSample*numData); switch (type) { - case T_PHASE: res << Pointf(xdata, std::arg(freqbuf[i])); break; - case T_FFT: res << Pointf(xdata, 2*std::abs(freqbuf[i])/windowSum); break; + case T_PHASE: if (std::abs(freqbuf[i]) > threshold) + res << Pointf(xdata, std::arg(freqbuf[i])); + else + res << Pointf(xdata, 0); + break; + case T_FFT: res << Pointf(xdata, 2*std::abs(freqbuf[i])/windowSum); break; case T_PSD: res << Pointf(xdata, 2*sqr(std::abs(freqbuf[i]))/(windowSum/tSample)); } } @@ -372,8 +385,12 @@ Vector DataSource::FFT(Getdatafun getdata, double tSample, bool frequenc double xdata = (tSample*numData)/i; switch (type) { - case T_PHASE: res << Pointf(xdata, std::arg(freqbuf[i])); break; - case T_FFT: res << Pointf(xdata, 2*std::abs(freqbuf[i])/windowSum); break; + case T_PHASE: if (std::abs(freqbuf[i]) > threshold) + res << Pointf(xdata, std::arg(freqbuf[i])); + else + res << Pointf(xdata, 0); + break; + case T_FFT: res << Pointf(xdata, 2*std::abs(freqbuf[i])/windowSum); break; case T_PSD: res << Pointf(xdata, 2*sqr(std::abs(freqbuf[i]))/(windowSum/tSample)); } } diff --git a/uppsrc/ScatterDraw/DataSource.h b/uppsrc/ScatterDraw/DataSource.h index 4784de496..70c22932c 100644 --- a/uppsrc/ScatterDraw/DataSource.h +++ b/uppsrc/ScatterDraw/DataSource.h @@ -123,7 +123,7 @@ public: class CArray : public DataSource { private: - double *xData, *yData, *zData; + double *yData, *xData, *zData; int64 numData; double x0, deltaX; diff --git a/uppsrc/ScatterDraw/Equation.cpp b/uppsrc/ScatterDraw/Equation.cpp index 9cacad4a8..6e3836fd0 100644 --- a/uppsrc/ScatterDraw/Equation.cpp +++ b/uppsrc/ScatterDraw/Equation.cpp @@ -347,17 +347,21 @@ ExplicitEquation::FitError SplineEquation::Fit(DataSource &data, double &r2) } if(seriesRaw.IsEmpty()) - return InadequateDataSource; + return SmallDataSource; PointfLess less; Sort(seriesRaw, less); // Sort Vector series; + series << seriesRaw[0]; for (int i = 1; i < seriesRaw.GetCount(); ++i) { // Remove points with duplicate x if (seriesRaw[i].x != seriesRaw[i - 1].x) series << seriesRaw[i]; } - + + if (series.GetCount() < 2) + return SmallDataSource; + r2 = 0; int n = int(series.GetCount()) - 1; @@ -368,7 +372,7 @@ ExplicitEquation::FitError SplineEquation::Fit(DataSource &data, double &r2) Buffer alpha(n); for(int i = 1; i < n; ++i) - alpha[i] = (3.*(series[i+1].y - series[i].y)/h[i] - 3*(series[i].y - series[i-1].y)/h[i-1]); + alpha[i] = 3*(series[i+1].y - series[i].y)/h[i] - 3*(series[i].y - series[i-1].y)/h[i-1]; Buffer c(n+1), l(n+1), mu(n+1), z(n+1); l[0] = 1; @@ -381,7 +385,7 @@ ExplicitEquation::FitError SplineEquation::Fit(DataSource &data, double &r2) z[i] = (alpha[i] - h[i-1]*z[i-1])/l[i]; } - l[n] = 1.; + l[n] = 1; z[n] = 0; c[n] = 0; @@ -410,7 +414,7 @@ double SplineEquation::f(double x) for (j = 0; j < ncoeff; j++) { if(coeff[j].x > x) { if(j == 0) - j++; + j = 1; break; } } diff --git a/uppsrc/ScatterDraw/MarkPlot.h b/uppsrc/ScatterDraw/MarkPlot.h index adbcb92b3..de79e6ad4 100644 --- a/uppsrc/ScatterDraw/MarkPlot.h +++ b/uppsrc/ScatterDraw/MarkPlot.h @@ -18,6 +18,7 @@ public: template static void Register(const String& name) { + classMap().FindAdd(name, __Create); typeMap().FindAdd(typeid(T).name(), name); T dummy; typeNumber().Add(dummy.GetTypeCount()); diff --git a/uppsrc/ScatterDraw/ScatterDraw.cpp b/uppsrc/ScatterDraw/ScatterDraw.cpp index b412297ef..72e6d67c6 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.cpp +++ b/uppsrc/ScatterDraw/ScatterDraw.cpp @@ -1312,10 +1312,10 @@ void ScatterDraw::DoZoom(double scale, bool mouseX, bool mouseY) { } } } - double plotW = scale*(GetSize().cx - (hPlotLeft + hPlotRight)); - double plotH = scale*(GetSize().cy - (vPlotTop + vPlotBottom)) - titleHeight; - double dw = plotW*xMajorUnit/double(xRange); - double dh = plotH*yMajorUnit/double(yRange); + //double plotW = scale*(GetSize().cx - (hPlotLeft + hPlotRight)); + //double plotH = scale*(GetSize().cy - (vPlotTop + vPlotBottom)) - titleHeight; + //double dw = plotW*xMajorUnit/double(xRange); + //double dh = plotH*yMajorUnit/double(yRange); bool can = true;//min(dw, dh) > 20 || scale < 1; if (mouseX && can) { diff --git a/uppsrc/ScatterDraw/ScatterDraw.t b/uppsrc/ScatterDraw/ScatterDraw.t index fd8d3f654..b42cb9d17 100644 --- a/uppsrc/ScatterDraw/ScatterDraw.t +++ b/uppsrc/ScatterDraw/ScatterDraw.t @@ -63,6 +63,12 @@ esES("Exponencial") euES("") frFR("") +T_("RealExponent") +caES("") +esES("") +euES("") +frFR("") + T_("Rational_1") caES("Racional_1") esES("Racional_1")