private void StartArrayUpdate() { Task.Factory.StartNew(() => { // Create the random directions var rnd = random.Value; Vector[] directions = Enumerable.Range(0, _pointCount).Select(i => { var angle = rnd.NextDouble() * Math.PI * 2; Vector dxdy = new Vector(Math.Sin(angle), Math.Cos(angle)); return(dxdy); }).ToArray(); while (!_hasBeenDisposed) { if (_doReset) { DoReset(); _doReset = false; } if (_animationRunning) { var positions = Positions as DxInstancedPointAndColor[]; for (int i = 0; i < _pointCount; ++i) { var dxdy = new Vector(directions[i].X * Width1Px, directions[i].Y * Height1Px); var newX = dxdy.X + positions[i].X; var newY = dxdy.Y + positions[i].Y; if (newX < 0 || newX > 1) { newX = Math.Min(1, Math.Max(0, newX)); directions[i] = new Vector(-directions[i].X, directions[i].Y); } if (newY < 0 || newY > 1) { newY = Math.Min(1, Math.Max(0, newY)); directions[i] = new Vector(directions[i].X, -directions[i].Y); } _currentArray[i] = new DxInstancedPointAndColor(newX, newY, positions[i].Color); } var temp = (Positions as DxInstancedPointAndColor[]) ?? new DxInstancedPointAndColor[_pointCount]; Positions = _currentArray; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Positions))); _currentArray = temp; } Thread.Sleep(10); } }); }
private void DoReset() { var rnd = random.Value; HSBPalette palette = new HSBPalette(); for (int i = 0; i < _pointCount; i++) { var point = new Point(rnd.NextDouble(), rnd.NextDouble()); var length = Math.Sqrt(point.X * point.X + point.Y * point.Y) / Math.Sqrt(2); var color = palette.GetColor(length); _currentArray[i] = new DxInstancedPointAndColor(point, color); } var temp = (Positions as DxInstancedPointAndColor[]) ?? new DxInstancedPointAndColor[_pointCount]; Positions = _currentArray; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Positions))); _currentArray = temp; }