diff --git a/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.h b/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.h index 160439509..2684b194f 100644 --- a/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.h +++ b/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.h @@ -168,12 +168,13 @@ public: private: Vector s1x, s1y; - Vector s2; + Vector s2x, s2y; LinearEquation linear; PolynomialEquation poly2, poly4; FourierEquation fourier; ExponentialEquation exponential; Rational1Equation rational1; + SinEquation sin; }; class Tab12 : public WithTab12 { @@ -187,6 +188,18 @@ private: Vector s1, s2, s3; }; +class TabUserEquation : public WithTabUserEquation { +public: + typedef TabUserEquation CLASSNAME; + + virtual void Init(); + void OnUpdate(); + virtual ScatterCtrl &Scatter() {return scatter;}; + +private: + UserEquation userEquation; +}; + class TabPie : public WithTabPie { public: typedef TabPie CLASSNAME; diff --git a/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.lay b/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.lay index 06d0e13c0..bc8c1992b 100644 --- a/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.lay +++ b/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.lay @@ -10,8 +10,8 @@ LAYOUT(ScatterCtrl_Demo, 624, 352) ITEM(Label, dv___8, SetLabel(t_("Choose example")).LeftPosZ(4, 168).TopPosZ(4, 21)) END_LAYOUT -LAYOUT(Tab1, 380, 292) - ITEM(ScatterCtrl, scatter, SetTitle(t_("Basic Test")).SetTitleFont(SansSerifZ(14).Bold()).SetPlotAreaRightMargin(20).SetPlotAreaTopMargin(20).SetLabelsFont(StdFontZ(11)).SetLegendAnchor(2).HSizePosZ(16, 12).VSizePosZ(16, 16)) +LAYOUT(Tab1, 428, 296) + ITEM(ScatterCtrl, scatter, SetTitle(t_("Basic Test")).SetTitleFont(SansSerifZ(14).Bold()).SetPlotAreaRightMargin(20).SetPlotAreaTopMargin(20).SetLabelsFont(StdFontZ(11)).SetLegendAnchor(2).HSizePosZ(4, 4).VSizePosZ(4, 4)) END_LAYOUT LAYOUT(Tab2, 380, 292) @@ -64,6 +64,21 @@ LAYOUT(Tab10, 380, 292) ITEM(ScatterCtrl, scatter, SetTitle(t_("User graph")).SetTitleFont(SansSerifZ(14).Bold()).SetPlotAreaTopMargin(20).SetLabelsFont(StdFontZ(11)).SetLegendAnchor(2).HSizePosZ(16, 12).VSizePosZ(16, 16)) END_LAYOUT +LAYOUT(TabUserEquation, 764, 276) + ITEM(ScatterCtrl, scatter, SetTitle(t_("User equation")).SetTitleFont(SansSerifZ(14).Bold()).SetPlotAreaRightMargin(20).SetPlotAreaTopMargin(20).SetLabelsFont(StdFontZ(11)).SetLegendAnchor(2).HSizePosZ(4, 4).VSizePosZ(4, 28)) + ITEM(Label, dv___1, SetLabel(t_("to")).LeftPosZ(560, 16).BottomPosZ(3, 21)) + ITEM(Label, dv___2, SetLabel(t_("from y =")).LeftPosZ(468, 44).BottomPosZ(3, 21)) + ITEM(EditDouble, toY, LeftPosZ(580, 44).BottomPosZ(5, 19)) + ITEM(EditDouble, fromY, LeftPosZ(512, 44).BottomPosZ(5, 19)) + ITEM(EditString, equation, LeftPosZ(124, 156).BottomPosZ(5, 19)) + ITEM(Label, dv___6, SetLabel(t_("User equation y = f(x) =")).LeftPosZ(8, 116).BottomPosZ(3, 21)) + ITEM(Button, update, SetLabel(t_("Update")).RightPosZ(4, 80).BottomPosZ(4, 20)) + ITEM(Label, dv___8, SetLabel(t_("to")).LeftPosZ(388, 16).BottomPosZ(3, 21)) + ITEM(Label, dv___9, SetLabel(t_("from x =")).LeftPosZ(296, 44).BottomPosZ(3, 21)) + ITEM(EditDouble, toX, LeftPosZ(408, 44).BottomPosZ(5, 19)) + ITEM(EditDouble, fromX, LeftPosZ(340, 44).BottomPosZ(5, 19)) +END_LAYOUT + LAYOUT(Tab11, 504, 468) ITEM(ScatterCtrl, scatter, SetAxisWidth(12).SetTitle(t_("Trend Line demo")).SetTitleFont(SansSerifZ(14).Bold()).SetPlotAreaLeftMargin(35).SetPlotAreaTopMargin(20).SetPlotAreaColor(Color(229, 229, 229)).SetLegendAnchor(4).HSizePosZ(8, 8).VSizePosZ(8, 108)) ITEM(ArrayCtrl, grid, HSizePosZ(112, 8).BottomPosZ(4, 100)) @@ -83,7 +98,7 @@ LAYOUT(Tab13, 420, 236) END_LAYOUT LAYOUT(TabPie, 536, 440) - ITEM(PieCtrl, chart, SetLegendBackColor(Color(229, 229, 229)).SetLegendHeight(80).SetTitle(t_("Average Weather")).SetFrame(ThinInsetFrame()).HSizePosZ(8, 12).VSizePosZ(40, 12)) + ITEM(PieCtrl, chart, SetLegendHeight(80).SetLegendBackColor(Color(229, 229, 229)).SetTitle(t_("Average Weather")).SetFrame(ThinInsetFrame()).HSizePosZ(8, 12).VSizePosZ(40, 12)) ITEM(Label, dv___1, SetLabel(t_(" EXPERIMENTAL")).SetFrame(ThinInsetFrame()).LeftPosZ(8, 84).TopPosZ(8, 24)) END_LAYOUT diff --git a/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.upp b/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.upp index cc9a4a848..c4a4ad333 100644 --- a/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.upp +++ b/examples/ScatterCtrl_Demo/ScatterCtrl_Demo.upp @@ -23,6 +23,7 @@ file tab10.cpp, tab11.cpp, tab12.cpp, + tab14.cpp, tabPie.cpp, symbol.iml; diff --git a/examples/ScatterCtrl_Demo/tab11.cpp b/examples/ScatterCtrl_Demo/tab11.cpp index 94f8e6d46..2307262ac 100644 --- a/examples/ScatterCtrl_Demo/tab11.cpp +++ b/examples/ScatterCtrl_Demo/tab11.cpp @@ -11,14 +11,6 @@ void Tab11::Init() scatter.SetMouseHandling(true, true).ShowContextMenu(); - scatter.AddSeries(s1y, s1x).Legend("Series 1").MarkStyle().MarkWidth(10).NoPlot(); - scatter.AddSeries(linear).Legend(linear.GetFullName()).NoMark().Stroke(2); - scatter.AddSeries(poly2).Legend(poly2.GetFullName()).NoMark().Stroke(2); - scatter.AddSeries(poly4).Legend(poly4.GetFullName()).NoMark().Stroke(2); - scatter.AddSeries(fourier).Legend(fourier.GetFullName()).NoMark().Stroke(2); - scatter.AddSeries(exponential).Legend(exponential.GetFullName()).NoMark().Stroke(2); - scatter.AddSeries(rational1).Legend(rational1.GetFullName()).NoMark().Stroke(2); - grid.AddColumn("Type", 10); grid.AddColumn("Equation", 40); grid.AddColumn("R2", 5); @@ -27,9 +19,9 @@ void Tab11::Init() } void Tab11::OnSeries() { - double l_r2, p2_r2, p4_r2, f_r2, exp_r2, rat1_r2; + double l_r2, p2_r2, p4_r2, f_r2, exp_r2, rat1_r2, s_r2; - //scatter.RemoveSeries(0); + scatter.RemoveAllSeries(); grid.Clear(); if (seriesList == "Series 1") { scatter.SetRange(5, 1500).SetMajorUnits(1, 250).SetXYMin(-3, 0); @@ -48,14 +40,18 @@ void Tab11::OnSeries() { fourier.SetDegree(3); fourier.Fit(vs1, f_r2); exponential.Fit(vs1, exp_r2); - rational1.Fit(vs1, rat1_r2); + rational1.Fit(vs1, rat1_r2); + sin.GuessCoeff(vs1); + sin.Fit(vs1, s_r2); - // scatter.InsertSeries(0, s1y, s1x).Legend("Series 1").MarkStyle().MarkWidth(10).NoPlot(); + scatter.AddSeries(s1x, s1y).Legend("Series 1").MarkStyle().MarkWidth(10).NoPlot(); } else if (seriesList == "Series 2") { - s2.Clear(); - s2 << 121 << 52 << 20 << 12 << 13 << 12 << 8 << 11; + s2x.Clear(); + s2y.Clear(); + s2y << -0.9 << -1.1 << 2.8 << -3.4 << 2.7 << -0.9 << -1.1 << 2.8 << -3.4 << 2.7 << -0.9 << -1.1 << 2.8 << -3.4 << 2.7 << -0.7 << -1.2; + s2x << 0 << 0.6 << 1.2 << 1.8 << 2.5 << 3.1 << 3.7 << 4.3 << 5.0 << 5.6 << 6.2 << 6.9 << 7.5 << 8.1 << 8.7 << 9.4 << 10.0; - VectorY v2(s2, 0, 1); + VectorDouble v2(s2y, s2x); linear.Fit(v2, l_r2); poly2.SetDegree(2); @@ -65,10 +61,27 @@ void Tab11::OnSeries() { fourier.SetDegree(3); fourier.Fit(v2, f_r2); exponential.Fit(v2, exp_r2); - rational1.Fit(v2, rat1_r2); + rational1.Fit(v2, rat1_r2); + sin.GuessCoeff(v2); + sin.Fit(v2, s_r2); - scatter.InsertSeries(0, s1y, s1x).Legend("Series 2").MarkStyle().MarkWidth(10).NoPlot(); + scatter.AddSeries(s2x, s2y).Legend("Series 2").MarkStyle().MarkWidth(10).NoPlot(); } + if (l_r2 > 0.5) + scatter.AddSeries(linear).Legend(linear.GetFullName()).NoMark().Stroke(2); + if (p2_r2 > 0.5) + scatter.AddSeries(poly2).Legend(poly2.GetFullName()).NoMark().Stroke(2); + if (p4_r2 > 0.5) + scatter.AddSeries(poly4).Legend(poly4.GetFullName()).NoMark().Stroke(2); + if (f_r2 > 0.5) + scatter.AddSeries(fourier).Legend(fourier.GetFullName()).NoMark().Stroke(2); + if (exp_r2 > 0.5) + scatter.AddSeries(exponential).Legend(exponential.GetFullName()).NoMark().Stroke(2); + if (rat1_r2 > 0.5) + scatter.AddSeries(rational1).Legend(rational1.GetFullName()).NoMark().Stroke(2); + if (s_r2 > 0.5) + scatter.AddSeries(sin).Legend(sin.GetFullName()).NoMark().Stroke(2); + scatter.FitToData(true); scatter.Refresh(); grid.Add(linear.GetFullName(), linear.GetEquation(), FormatDoubleFix(l_r2, 5)); @@ -77,6 +90,8 @@ void Tab11::OnSeries() { grid.Add(fourier.GetFullName(), fourier.GetEquation(), FormatDoubleFix(f_r2, 5)); grid.Add(exponential.GetFullName(), exponential.GetEquation(), FormatDoubleFix(exp_r2, 5)); grid.Add(rational1.GetFullName(), rational1.GetEquation(), FormatDoubleFix(rat1_r2, 5)); + grid.Add(sin.GetFullName(), sin.GetEquation(), FormatDoubleFix(s_r2, 5)); + grid.SetSortColumn(2, true); } ScatterDemo *Construct11() diff --git a/examples/ScatterCtrl_Demo/tab14.cpp b/examples/ScatterCtrl_Demo/tab14.cpp new file mode 100644 index 000000000..1dc247a5e --- /dev/null +++ b/examples/ScatterCtrl_Demo/tab14.cpp @@ -0,0 +1,44 @@ +#include "ScatterCtrl_Demo.h" + + +void TabUserEquation::Init() +{ + CtrlLayout(*this); + SizePos(); + + equation <<= "25 + 10*sin(0.5*x + 5)"; + fromX <<= 0; + toX <<= 100; + fromY <<= 0; + toY <<= 50; + + update.WhenAction = THISBACK(OnUpdate); + scatter.SetMouseHandling(true, true); + OnUpdate(); +} + +void TabUserEquation::OnUpdate() +{ + if (fromX >= toX || fromY >= toY) { + Exclamation("Wrong limits"); + return; + } + + userEquation.Init("User equation", equation); + + scatter.RemoveAllSeries(); + scatter.AddSeries(userEquation).Legend(userEquation.GetFullName()).NoMark().Stroke(2); + scatter.SetXYMin(fromX, fromY); + scatter.SetRange(toX - fromX, toY - fromY); + scatter.FitToData(true); +} + +ScatterDemo *ConstructUserEquation() +{ + static TabUserEquation tab; + return &tab; +} + +INITBLOCK { + RegisterExample("User equation", ConstructUserEquation, __FILE__); +}