private IDataSeries3D FillSeries(int index, int width, int height)
        {
            double angle = Math.PI*2*index/30;

            int w = width, h = height;

            var dataSeries = new UniformGridDataSeries3D<double>(w, h)
            {
                StepX = 0.01,
                StepZ = 0.01,
            };

            for (int x = 0; x < 200; x++)
            {
                for (int y = 0; y < 200; y++)
                {
                    var v = (1 + Math.Sin(x*0.04 + angle))*50 + (1 + Math.Sin(y*0.1 + angle))*50*(1 + Math.Sin(angle*2));
                    var cx = w/2;
                    var cy = h/2;
                    var r = Math.Sqrt((x - cx)*(x - cx) + (y - cy)*(y - cy));
                    var exp = Math.Max(0, 1 - r*0.008);
                    var zValue = v*exp;

                    dataSeries[y, x] = zValue;
                }
            }

            return dataSeries;
        }
Exemple #2
0
        public CreateAUniformMesh3DChart()
        {
            InitializeComponent();

            int xSize          = 25;
            int zSize          = 25;
            var meshDataSeries = new UniformGridDataSeries3D <double>(xSize, zSize)
            {
                StepX      = 1,
                StepZ      = 1,
                SeriesName = "Uniform Surface Mesh",
            };

            for (int x = 0; x < xSize; x++)
            {
                for (int z = 0; z < zSize; z++)
                {
                    double xVal = ( double )x / ( double )xSize * 25.0;
                    double zVal = ( double )z / ( double )zSize * 25.0;
                    double y    = Math.Sin(xVal * 0.2) / ((zVal + 1) * 2);
                    meshDataSeries[z, x] = y;
                }
            }

            surfaceMeshRenderableSeries.DataSeries = meshDataSeries;
        }
        public AddObjectsToA3DChart()
        {
            InitializeComponent();
            var dataSeries = new UniformGridDataSeries3D <double>(9, 9)
            {
                StartX = 1, StepX = 1, StartZ = 100, StepZ = 1
            };

            for (int x = 0; x < 9; x++)
            {
                for (int z = 0; z < 9; z++)
                {
                    if (z % 2 == 0)
                    {
                        dataSeries[z, x] = (x % 2 == 0 ? 1 : 4);
                    }
                    else
                    {
                        dataSeries[z, x] = (x % 2 == 0 ? 4 : 1);
                    }
                }
            }

            surfaceMeshRenderableSeries.DataSeries = dataSeries;
        }
Exemple #4
0
        private void CreateDataSetAndSeries()
        {
            _series0 = new XyDataSeries <double, double>();
            _series1 = new UniformGridDataSeries3D <double>(100, 100)
            {
                StartX = 0, StepX = 0.1, StartZ = 0
            };
            _series2 = new UniformGridDataSeries3D <double>(100, 100)
            {
                StartX = 0, StepX = 0.1, StartZ = 0
            };

            _series0.FifoCapacity = FifoSize;

            for (int a = 0; a < FifoSize; a++)
            {
                OnNewData(this, null);
            }

            RenderableSeries0.DataSeries = _series0;
            surfaceMesh.Maximum          = 22;
            surfaceMesh.Minimum          = 0;
            surfaceMesh.DataSeries       = _series1;

            RenderableSeries1.DataSeries = _series0;
            surfaceMesh1.Maximum         = 22;
            surfaceMesh1.Minimum         = 0;
            surfaceMesh1.DataSeries      = _series2;
        }
Exemple #5
0
        public HitTestGetPoint3D()
        {
            InitializeComponent();

            int xSize          = 25;
            int zSize          = 25;
            var meshDataSeries = new UniformGridDataSeries3D <double>(xSize, zSize)
            {
                StepX      = 1,
                StepZ      = 1,
                SeriesName = "Uniform Surface Mesh",
            };

            for (int x = 0; x < xSize; x++)
            {
                for (int z = 0; z < zSize; z++)
                {
                    double xVal = x / (double)xSize * 25.0;
                    double zVal = z / (double)zSize * 25.0;
                    double y    = Math.Sin(xVal * 0.2) / ((zVal + 1) * 2);
                    meshDataSeries[z, x] = y;
                }
            }

            renderSeries.DataSeries = meshDataSeries;
        }
        public void initgraph()
        {
            dataSeries = new UniformGridDataSeries3D <int>(dataNumber, dataNumber)
            {
                StartX     = 0,
                StartZ     = 0,
                StepX      = 1, //0 / (w - 1d),
                StepZ      = 1, //0 / (h - 1d),
                SeriesName = "Realtime Surface Mesh",
            };

            actualData = dataSeries.InternalArray;
        }
Exemple #7
0
        public void Init(int row, int col)
        {
            xSize = row;
            zSize = col;
            yMax  = float.MinValue;

            if (positionInfo == null)
            {
                positionInfo = new List <PositionInfo>();
            }
            else
            {
                positionInfo.Clear();
            }

            if (drawInfo == null)
            {
                drawInfo = new List <DrawGeometry>();
            }
            else
            {
                drawInfo.Clear();
            }

            if (MeshDataSeries == null)
            {
                MeshDataSeries = new UniformGridDataSeries3D <double, double, double>(xSize, zSize);
            }
            else
            {
                MeshDataSeries.Clear();
            }

            if (marker == null)
            {
                marker = new XyzDataSeries3D <double>();
                marker.DataSeriesChanged += OnScatterSelected;
            }
            else
            {
                marker.Clear();
            }

            movePoint   = false;
            annotIdx    = -1; // 0 base
            selectedIdx = -1;
        }
        public UniformGridDataSeries3D <double> GetSurfaceMeshDataSeries()
        {
            var meshDataSeries = new UniformGridDataSeries3D <double>(25, 25)
            {
                StepX = 1, StepZ = 1, SeriesName = "Uniform Surface Mesh"
            };

            for (int x = 0; x < 25; x++)
            {
                for (int z = 0; z < 25; z++)
                {
                    double y = Math.Sin(x * 0.2) / ((z + 1) * 2);
                    meshDataSeries[z, x] = y;
                }
            }

            return(meshDataSeries);
        }
        public LabStyleCharts()
        {
            InitializeComponent();

            var ds = new UniformGridDataSeries3D <double>(11, 4);

            ds.StartX = 0;
            ds.StepX  = 0.09;
            ds.StartZ = 0;
            ds.StepZ  = 0.75;

            // Initialize some nice looking data
            ds[0, 0] = -1.43; ds[0, 1] = -2.95; ds[0, 2] = -2.97; ds[0, 3] = -1.81; ds[0, 4] = -1.33; ds[0, 5] = -1.53; ds[0, 6] = -2.04; ds[0, 7] = 2.08; ds[0, 8] = 1.94; ds[0, 9] = 1.42; ds[0, 10] = 1.58; ds[1, 0] = 1.77;
            ds[1, 1] = 1.76; ds[1, 2] = -1.1; ds[1, 3] = -0.26; ds[1, 4] = 0.72; ds[1, 5] = 0.64; ds[1, 6] = 3.26; ds[1, 7] = 3.2; ds[1, 8] = 3.1; ds[1, 9] = 1.94; ds[1, 10] = 1.54;
            ds[2, 0] = 0; ds[2, 1] = 0; ds[2, 2] = 0; ds[2, 3] = 0; ds[2, 4] = 0; ds[2, 5] = 3.7; ds[2, 6] = 3.7; ds[2, 7] = 3.7; ds[2, 8] = 3.7; ds[2, 9] = -0.48; ds[2, 10] = -0.48;
            ds[3, 0] = 0; ds[3, 1] = 0; ds[3, 2] = 0; ds[3, 3] = 0; ds[3, 4] = 0; ds[3, 5] = 0; ds[3, 6] = 0; ds[3, 7] = 0; ds[3, 8] = 0; ds[3, 9] = 0; ds[3, 10] = 0;

            scs.RenderableSeries[0].DataSeries = ds;
        }
Exemple #10
0
        private static UniformGridDataSeries3D <double> GetSurfaceMeshDataSeries()
        {
            var meshDataSeries = new UniformGridDataSeries3D <double>(80, 25)
            {
                StepX = 1, StepZ = 1
            };

            for (int x = 0; x < 80; x++)
            {
                for (int z = 0; z < 25; z++)
                {
                    var    s = DataManager.Instance.GetGaussianRandomNumber(100, 100);
                    double y = Math.Sin(x * 0.2 * s) / ((z + 1) * 2);
                    y = y >= 0 ? y : 0;
                    meshDataSeries[z, x] = y * Math.Abs(s);
                }
            }

            return(meshDataSeries);
        }
Exemple #11
0
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            const int Count             = 15;
            var       uniformDataSeries = new UniformGridDataSeries3D <double>(Count, Count)
            {
                StepX      = 1,
                StepZ      = 1,
                SeriesName = "Impulse Series 3D",
            };

            for (var x = 0; x < Count; x++)
            {
                for (var z = 0; z < Count; z++)
                {
                    var y = Math.Sin(x * 0.25) / ((z + 1) * 2);
                    uniformDataSeries[z, x] = y;
                }
            }
            ImpulseSeries3D.DataSeries = uniformDataSeries;
        }
        public ChartViewModel()
        {
            int xSize = 512;
            int zSize = 512;

            var meshDataSeries = new UniformGridDataSeries3D <double>(xSize, zSize)
            {
                SeriesName = "3D Test",
            };

            for (int x = 0; x < xSize; x++)
            {
                for (int z = 0; z < zSize; z++)
                {
                    meshDataSeries[z, x] = random.NextDouble();
                }
            }

            this.ExampleDataSeries = meshDataSeries;
        }
        private IDataSeries3D FillSeries(double alpha, double alpha1, double betta, double betta1, double mu, double mu1,
                                         double N, double V1, double V2, int startX, int startY, int lengthX, int lengthY)
        {
            int w = lengthY, h = lengthX;

            var dataSeries = new UniformGridDataSeries3D <double>(h, w)
            {
                StepX = 1,
                StepZ = 1,
            };

            for (int x = startX; x < h; x++)
            {
                for (int y = startY; y < w; y++)
                {
                    dataSeries[x, y] = Math.Pow(alpha * (x * x + betta * y - mu * V1), N) +
                                       Math.Pow(alpha1 * (betta1 * x + y * y - mu1 * V2), N);
                }
            }
            return(dataSeries);
        }
Exemple #14
0
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            var uniformDataSeries = new UniformGridDataSeries3D <double>(Count, Count)
            {
                StepX      = 1,
                StepZ      = 1,
                SeriesName = "Column 3D Data",
            };

            for (var x = 0; x < Count; x++)
            {
                for (var z = 0; z < Count; z++)
                {
                    var y = Math.Sin(x * 0.25) / ((z + 1) * 2);
                    uniformDataSeries[z, x] = y;
                }
            }

            //Trace.WriteLine(uniformDataSeries.To2DArray().ToStringArray2D());
            SciChart.RenderableSeries[0].DataSeries = uniformDataSeries;
        }
Exemple #15
0
        public SurfaceMeshFloorAndCeiling()
        {
            InitializeComponent();

            var ds = new UniformGridDataSeries3D <double>(11, 4);

            ds.StartX = 10;
            ds.StepX  = 0.09;
            ds.StartZ = 1;
            ds.StepZ  = 0.75;

            // Initialize some nice looking data
            ds[0, 0] = -1.43; ds[0, 1] = -2.95; ds[0, 2] = -2.97; ds[0, 3] = -1.81; ds[0, 4] = -1.33; ds[0, 5] = -1.53; ds[0, 6] = -2.04; ds[0, 7] = 2.08; ds[0, 8] = 1.94; ds[0, 9] = 1.42; ds[0, 10] = 1.58; ds[1, 0] = 1.77;
            ds[1, 1] = 1.76; ds[1, 2] = -1.1; ds[1, 3] = -0.26; ds[1, 4] = 0.72; ds[1, 5] = 0.64; ds[1, 6] = 3.26; ds[1, 7] = 3.2; ds[1, 8] = 3.1; ds[1, 9] = 1.94; ds[1, 10] = 1.54;
            ds[2, 0] = 0; ds[2, 1] = 0; ds[2, 2] = 0; ds[2, 3] = 0; ds[2, 4] = 0; ds[2, 5] = 3.7; ds[2, 6] = 3.7; ds[2, 7] = 3.7; ds[2, 8] = 3.7; ds[2, 9] = -0.48; ds[2, 10] = -0.48;
            ds[3, 0] = 0; ds[3, 1] = 0; ds[3, 2] = 0; ds[3, 3] = 0; ds[3, 4] = 0; ds[3, 5] = 0; ds[3, 6] = 0; ds[3, 7] = 0; ds[3, 8] = 0; ds[3, 9] = 0; ds[3, 10] = 0;

            // We assign the same data to all three SurfaceMeshRenderableSeries3D
            // One for floor, one for ceiling, one for the actual mesh in the center
            scs.RenderableSeries[0].DataSeries = ds;
            scs.RenderableSeries[1].DataSeries = ds;
            scs.RenderableSeries[2].DataSeries = ds;
        }
        public Simple3DHeatmapChart()
        {
            InitializeComponent();

            var meshDataSeries = new UniformGridDataSeries3D <double>(XSize, ZSize)
            {
                StepX = 1, StepZ = 1
            };

            for (var x = 0; x < XSize; x++)
            {
                for (var z = 0; z < ZSize; z++)
                {
                    var v = (1 + Math.Sin(x * 0.04 + Angle)) * 50 + (1 + Math.Sin(z * 0.1 + Angle)) * 50 * (1 + Math.Sin(Angle * 2));

                    var r   = Math.Sqrt((x - Cx) * (x - Cx) + (z - Cy) * (z - Cy));
                    var exp = Math.Max(0, 1 - r * 0.008);
                    meshDataSeries[z, x] = (v * exp + _random.NextDouble() * 50);
                }
            }
            //Trace.WriteLine(meshDataSeries.To2DArray().ToStringArray2D());
            surfaceMesh.DataSeries = meshDataSeries;
        }
Exemple #17
0
        /* Функция построения поверхности f(x,y/Si) */
        public static UniformGridDataSeries3D <double> ConstructionSurfaceDistribution(double xCen, double yCen, double distance,
                                                                                       double sigmaX, double sigmaY, double muX, double muY, double ro)
        {
            var uniformGridDataSeries3D = new UniformGridDataSeries3D <double>(100, 100)
            {
                StartX = xCen - distance * 3,
                StepX  = (6 * distance) / 100,
                StartZ = yCen - distance * 3,
                StepZ  = (6 * distance) / 100,
            };

            for (var x = 0; x < 100; x++)
            {
                for (var z = 0; z < 100; z++)
                {
                    var xVal = x / (double)100 * (6 * distance) - Math.Abs(xCen - distance * 3);
                    var zVal = z / (double)100 * (6 * distance) - Math.Abs(yCen - distance * 3);
                    var y    = func_Gauss_XY(xVal, zVal, sigmaX, sigmaY, muX, muY, ro);
                    uniformGridDataSeries3D[z, x] = y;
                }
            }
            return(uniformGridDataSeries3D);
        }
Exemple #18
0
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            var uniformDataSeries = new UniformGridDataSeries3D <double>(Count, Count)
            {
                StepX      = 1,
                StepZ      = 1,
                SeriesName = "Impulse Series 3D",
            };

            for (var x = 0; x < Count; x++)
            {
                for (var z = 0; z < Count; z++)
                {
                    var y = Math.Sin(x * 0.25) / ((z + 1) * 2);
                    uniformDataSeries[z, x] = y;
                }
            }

            //Trace.WriteLine(uniformDataSeries.To2DArray().ToStringArray2D());
            ImpulseSeries3D.DataSeries = uniformDataSeries;

            PointMarkerCombo.SelectedIndex = 0;
        }
Exemple #19
0
        public TenorCurves3DChart()
        {
            InitializeComponent();

            _random = new Random();
            int xSize              = 25;
            int zSize              = 25;
            var meshDataSeries     = new UniformGridDataSeries3D <double, double, DateTime>(xSize, zSize);
            var lineDataSeries     = new XyDataSeries <double>();
            var mountainDataSeries = new XyDataSeries <double, double>();

            meshDataSeries.StartZ = new DateTime(2010, 1, 1);
            meshDataSeries.StepZ  = new TimeSpan(1, 0, 0, 0).ToDateTime();

            double step;

            for (int x = 0; x < xSize; x++)
            {
                switch (x)
                {
                case 5:
                case 10:
                    step = 0.309;
                    break;

                case 4:
                case 9:
                    step = 0.303;
                    break;

                case 6:
                case 11:
                    step = 0.303;
                    break;

                case 23:
                    step = 0.291;
                    break;

                case 22:
                    step = 0.294;
                    break;

                case 24:
                    step = 0.295;
                    break;

                default:
                    step = 0.3;
                    break;
                }

                for (int z = 0; z < zSize; z++)
                {
                    var y = (z != 0) ? Math.Pow((double)z + _random.NextDouble(), step) : Math.Pow((double)z + 1, 0.3);

                    meshDataSeries[z, x] = y;
                }
            }

            double average;

            for (int x = 0; x < xSize; x++)
            {
                average = 0;
                for (int z = 0; z < zSize; z++)
                {
                    average += meshDataSeries[x, z];
                }
                var y = average / 25;
                lineDataSeries.Append(x, y);
                mountainDataSeries.Append(x, meshDataSeries[12, x]);
            }

            mountainRenderSeries.DataSeries        = mountainDataSeries;
            LineRenderableSeries.DataSeries        = lineDataSeries;
            surfaceMeshRenderableSeries.Maximum    = (double)meshDataSeries.YRange.Max;
            surfaceMeshRenderableSeries.Minimum    = (double)meshDataSeries.YRange.Min;
            surfaceMeshRenderableSeries.DataSeries = meshDataSeries;
        }
        private void Paint()
        {
            switch (_selectChart)
            {
            case (int)Chart.PointChart3D:

                var grath_3D = new XyzDataSeries3D <int>();

                for (int x = 0; x < CA.Length; x++)
                {
                    for (int y = 0; y < CA.Length; y++)
                    {
                        for (int z = 0; z < CA.Length; z++)
                        {
                            if (CA[x, y, z])
                            {
                                grath_3D.Append(x, y, z);
                            }
                        }
                    }
                }

                var scatterSeries3D = new ScatterRenderableSeries3D
                {
                    DataSeries  = grath_3D,
                    PointMarker = _selectPointMarker
                };

                scatterSeries3D.PointMarker.Fill = Color.FromArgb(_selectAlpha, _selectColor.R, _selectColor.G, _selectColor.B);

                SciChart3D.RenderableSeries.Clear();

                SciChart3D.RenderableSeries.Add(scatterSeries3D);

                SetName("Клеточный автомат; Итерация =" + CA.Iterator);

                break;

            case Chart.MeshChart:
                var meshGrath_3D = new UniformGridDataSeries3D <double>(CA.Length, CA.Length);



                double[,] pollution = CA.GetPollution(_selectIndex, _selectAxis);

                for (int i = 0; i < CA.Length; i++)
                {
                    for (int j = 0; j < CA.Length; j++)
                    {
                        meshGrath_3D[i, j] = pollution[i, j];
                    }
                }



                var meshRenderableSeries = new SurfaceMeshRenderableSeries3D()
                {
                    MeshColorPalette = _gradientColor,
                    DrawMeshAs       = DrawMeshAs.SolidWithContours,
                    DataSeries       = meshGrath_3D
                };



                SciChart3D.RenderableSeries.Clear();
                SciChart3D.RenderableSeries.Add(meshRenderableSeries);



                SetName("Осреднение по плоскости " + CA_Model.GetNameAxis(_selectAxis) + "; Слой = " + _selectIndex + "; Итерация =" + CA.Iterator);

                break;

            case Chart.PointChart2D:

                var dataGraph_2D = new XyDataSeries <int, int>();

                for (int i = 0; i < CA.Length; i++)
                {
                    for (int j = 0; j < CA.Length; j++)
                    {
                        if (CA.GetPointPollution(_selectAxis, _selectIndex, i, j))
                        {
                            dataGraph_2D.Append(i, j);
                        }
                    }
                }

                var xyScatter = new XyScatterRenderableSeries()
                {
                    DataSeries  = dataGraph_2D,
                    PointMarker = _selectPointMarker2D
                };

                xyScatter.PointMarker.Fill = Color.FromArgb(_selectAlpha, _selectColor.R, _selectColor.G, _selectColor.B);

                SciChart2D.RenderableSeries.Clear();
                SciChart2D.RenderableSeries.Add(xyScatter);

                SetName("Клеточный автомат; Плоскость " + CA_Model.GetNameAxis(_selectAxis) + "; Слой = " + _selectIndex + "; Итерация =" + CA.Iterator);

                break;
            }



            GetUpdating = false;
        }
        public SurfaceMeshWithTextureMask()
        {
            InitializeComponent();

            int xSize = 49;
            int zSize = 49;

            _meshDataSeries0 = new UniformGridDataSeries3D <double>(xSize, zSize);
            _meshDataSeries1 = new UniformGridDataSeries3D <double>(xSize, zSize);

            for (int x = 48; x >= 24; x--)
            {
                var y = Math.Pow((double)x - 23 - 0.7, 0.3);
                _meshDataSeries0[24, x] = y;

                var y2 = Math.Pow((double)(x - 49) * (-1) + 0.5, 0.3);
                _meshDataSeries1[24, x] = y2 + 1.505;
            }

            for (int x = 24; x >= 0; x--)
            {
                for (int z = 49; z > 25; z--)
                {
                    var y  = Math.Pow((double)z - 23 - 0.7, 0.3);
                    var y2 = Math.Pow((double)(z - 50) * (-1) + 0.5, 0.3);

                    _meshDataSeries0[x + 24, (z - 49) * (-1)] = y;
                    _meshDataSeries0[z - 1, (x - 24) * (-1)]  = y;

                    _meshDataSeries1[x + 24, (z - 49) * (-1)] = y2 + 1.505;
                    _meshDataSeries1[z - 1, (x - 24) * (-1)]  = y2 + 1.505;

                    _meshDataSeries0[(x - 24) * (-1), (z - 49) * (-1)] = y;
                    _meshDataSeries0[(z - 49) * (-1), (x - 24) * (-1)] = y;

                    _meshDataSeries1[(x - 24) * (-1), (z - 49) * (-1)] = y2 + 1.505;
                    _meshDataSeries1[(z - 49) * (-1), (x - 24) * (-1)] = y2 + 1.505;

                    _meshDataSeries0[x + 24, z - 1] = y;
                    _meshDataSeries0[z - 1, x + 24] = y;

                    _meshDataSeries1[x + 24, z - 1] = y2 + 1.505;
                    _meshDataSeries1[z - 1, x + 24] = y2 + 1.505;

                    _meshDataSeries0[(x - 24) * (-1), z - 1]  = y;
                    _meshDataSeries0[(z - 49) * (-1), x + 24] = y;

                    _meshDataSeries1[(x - 24) * (-1), z - 1]  = y2 + 1.505;
                    _meshDataSeries1[(z - 49) * (-1), x + 24] = y2 + 1.505;
                }
            }


            if (_timer == null)
            {
                _timer          = new DispatcherTimer(DispatcherPriority.Render);
                _timer.Interval = TimeSpan.FromMilliseconds(1);
                _timer.Tick    += OnTimerTick;
            }

            _timer.Start();
            surfaceMeshRenderableSeries.Maximum    = (double)_meshDataSeries1.YRange.Max;
            surfaceMeshRenderableSeries.Minimum    = (double)_meshDataSeries0.YRange.Min;
            surfaceMeshRenderableSeries.DataSeries = _meshDataSeries0;

            surfaceMeshRenderableSeries2.Maximum    = (double)_meshDataSeries1.YRange.Max;
            surfaceMeshRenderableSeries2.Minimum    = (double)_meshDataSeries0.YRange.Min;
            surfaceMeshRenderableSeries2.DataSeries = _meshDataSeries1;
        }
        private void OnStart()
        {
            if (!IsLoaded)
            {
                return;
            }

            string whatData = (string)DataCombo.SelectedItem;
            int    w = 0, h = 0;

            if (whatData == "3D Sinc 10 x 10")
            {
                w = h = 10;
            }
            if (whatData == "3D Sinc 50 x 50")
            {
                w = h = 50;
            }
            if (whatData == "3D Sinc 100 x 100")
            {
                w = h = 100;
            }
            if (whatData == "3D Sinc 500 x 500")
            {
                w = h = 500;
            }
            if (whatData == "3D Sinc 1k x 1k")
            {
                w = h = 1000;
            }

            lock (_syncRoot)
            {
                OnStop();
            }

            var dataSeries = new UniformGridDataSeries3D <double>(w, h)
            {
                StartX     = 0,
                StartZ     = 0,
                StepX      = 10 / (w - 1d),
                StepZ      = 10 / (h - 1d),
                SeriesName = "Realtime Surface Mesh",
            };

            var frontBuffer = dataSeries.InternalArray;
            var backBuffer  = new GridData <double>(w, h).InternalArray;

            int frames = 0;

            _timer          = new Timer();
            _timer.Interval = 20;
            _timer.Elapsed += (s, arg) =>
            {
                lock (_syncRoot)
                {
                    double wc = w * 0.5, hc = h * 0.5;
                    double freq = Math.Sin(frames++ *0.1) * 0.1 + 0.1;

                    // Each set of dataSeries[i,j] schedules a redraw when the next Render event fires. Therefore, we suspend updates so that we can update the chart once
                    // Data generation (Sin, Sqrt below) is expensive. We parallelize it by using Parallel.For for the outer loop
                    //  Equivalent of "for (int j = 0; j < h; j++)"
                    // This will result in more CPU usage, but we wish to demo the performance of the actual rendering, not the slowness of generating test data! :)
                    Parallel.For(0, h, i =>
                    {
                        var buf = frontBuffer;
                        for (int j = 0; j < w; j++)
                        {
                            // 3D Sinc function from http://www.mathworks.com/matlabcentral/cody/problems/1305-creation-of-2d-sinc-surface
                            // sin(pi*R*freq)/(pi*R*freq)
                            // R is distance from centre

                            double radius = Math.Sqrt((wc - i) * (wc - i) + (hc - j) * (hc - j));
                            var d         = Math.PI * radius * freq;
                            var value     = Math.Sin(d) / d;
                            buf[i][j]     = double.IsNaN(value) ? 1.0 : value;
                        }
                    });

                    using (dataSeries.SuspendUpdates())
                    {
                        dataSeries.CopyFrom(frontBuffer);
                        var temp = backBuffer;
                        backBuffer  = frontBuffer;
                        frontBuffer = temp;
                    }
                }
            };
            SurfaceMesh.DataSeries = dataSeries;
            _timer.Start();
            StartButton.IsEnabled = false;
            PauseButton.IsEnabled = true;
        }