void DoPaint()
        {
            try
            {
                var padding = 30;
                var w       = _dotCanvas.ActualWidth - 2 * padding;
                var h       = _dotCanvas.ActualHeight - 2 * padding;
                var maxY    = _nextLocation.Y;

                var vs = _verticalScale;

                if (vs < 0)
                {
                    vs = (h / 3) / 10;
                }

                if (vs * maxY > h / 3)
                {
                    vs = (h / 3) / maxY;
                }

                var dotWidth  = Math.Max(5, w / GridWidth / 2);
                var dotHeight = Math.Max(5, vs / 2);

                dotWidth  = Math.Min(dotWidth, dotHeight);
                dotHeight = dotWidth;

                var count    = _boardInfo.Count;
                var wonCount = _boardInfo.Count(bi => bi.IsRemoved);

                foreach (var bi in _boardInfo)
                {
                    if (bi.Shape == null)
                    {
                        bi.Shape = new Ellipse()
                        {
                            Width = dotWidth, Height = dotHeight
                        };
                        _dotCanvas.Children.Add(bi.Shape);
                    }

                    var x = padding + bi.InitialLocation.X * w / GridWidth - dotWidth / 2;
                    var y = padding + bi.InitialLocation.Y * vs - dotHeight / 2;

                    if (bi.IsRemoved)
                    {
                        var toY = h - y;
                        y = (float)(bi.T * toY + (1.0 - bi.T) * y);
                    }

                    if (bi.Shape.Fill == null || ((SolidColorBrush)bi.Shape.Fill).Color != bi.Color)
                    {
                        bi.Shape.Fill = new SolidColorBrush(bi.Color);
                    }

                    Canvas.SetLeft(bi.Shape, x);
                    Canvas.SetTop(bi.Shape, y);
                }

                var s1 = string.Format("{0} boards remaining" + _parenthetical, count - wonCount);
                var s2 = string.Format("{0} boards won", wonCount);

                if (_remainingBlock == null)
                {
                    _remainingBlock = DrawString(s1, _infoFont, White, new Box(w / 2, h / 2 - padding * 2 + 15), _dotCanvas);
                }
                if (_wonBlock == null)
                {
                    _wonBlock = DrawString(s2, _infoFont, White, new Box(w / 2, h / 2 + padding * 2 - 5), _dotCanvas);
                }

                if (_dividerLine == null)
                {
                    _dividerLine = new Line()
                    {
                        X1 = 0, Y1 = _dotCanvas.ActualHeight / 2, X2 = _dotCanvas.ActualWidth, Y2 = _dotCanvas.ActualHeight / 2, StrokeThickness = 2, Stroke = new SolidColorBrush(White.ToColor())
                    };
                    _dotCanvas.Children.Add(_dividerLine);
                }

                _remainingBlock.Text = s1;
                _wonBlock.Text       = s2;
                CenterTextBlock(_remainingBlock, new Box(w / 2, h / 2 - padding * 2 + 15));
                CenterTextBlock(_wonBlock, new Box(w / 2, h / 2 + padding * 2 - 5));
            }
            catch { }
        }