public Image DrawInitialGraph(Size size)
        {
            GC.Collect();

            AreaSize = size;
            Frames   = new Stack <RGFrame>();

            Image res = new Bitmap(size.Width, size.Height);
            var   gr  = Graphics.FromImage(res);

            gr.FillRectangle(_whiteBrush, 0, 0, size.Width, size.Height);

            var radius = Math.Min(size.Width, size.Height) / 2.0f;

            radius = radius * 0.9f;

            var centerX = (float)(size.Width / (RGCircleRadius * 2));
            var centerY = (float)(size.Height / (RGCircleRadius * 2));

            AreaCenter = new PointF(centerX, centerY);
            CircleRect = new RectangleF(centerX - radius, centerY - radius, radius * 2, radius * 2);

            gr.FillEllipse(_yellowBrush, CircleRect);

            AddRGFeatures(res as Bitmap);

            gr.DrawLine(_blackPen, 0, centerY, size.Width, centerY);
            gr.DrawLine(_blackPen, centerX, 0, centerX, size.Height);

            gr.Save();

            var onePixelWeight = (float)(RGCircleRadius / radius);
            var xLen           = size.Width * onePixelWeight;
            var yLen           = size.Height * onePixelWeight;
            var x1             = -xLen / 2;
            var y1             = -yLen / 2;

            Frame = new RGFrame {
                Image = res, PlainRect = new RectangleF(x1, y1, xLen, yLen)
            };
            Frames.Push(Frame);
            return(res);
        }
        public void ZoomIn(Rectangle selectedArea)
        {
            var areaRange = (AreaSize.Width * 1.0 / AreaSize.Height);
            var rectRange = (selectedArea.Width * 1.0 / selectedArea.Height);

            if (rectRange > 1)
            {
                if (areaRange > rectRange)
                {
                    selectedArea.Width = (int)(selectedArea.Width * areaRange);
                }
                else
                {
                    selectedArea.Width = (int)(selectedArea.Width / areaRange);
                }
            }
            else
            {
                if (areaRange < rectRange)
                {
                    selectedArea.Height = (int)(selectedArea.Height / areaRange);
                }
                else
                {
                    selectedArea.Height = (int)(selectedArea.Height * areaRange);
                }
            }

            var onePixelXWidth = Frame.PlainRect.Width / AreaSize.Width;
            var onePixelYWidth = Frame.PlainRect.Height / AreaSize.Height;

            var xl = Frame.PlainRect.X + selectedArea.X * onePixelXWidth;
            var xW = selectedArea.Width * onePixelXWidth;

            var yd = selectedArea.Y * onePixelYWidth + selectedArea.Height * onePixelYWidth;
            var yl = Frame.PlainRect.Y + Frame.PlainRect.Height - yd;
            var yW = selectedArea.Height * onePixelYWidth;

            var frame = new RGFrame {
                PlainRect = new RectangleF(xl, yl, xW, yW)
            };
            var image = new Bitmap(AreaSize.Width, AreaSize.Height);

            var accuracyX = frame.PlainRect.Width / AreaSize.Width;
            var accuracyY = frame.PlainRect.Height / AreaSize.Height;

            var i = 0;

            for (var c1 = frame.PlainRect.X; c1 <= frame.PlainRect.X + frame.PlainRect.Width; c1 += accuracyX)
            {
                var j = AreaSize.Height - 1;
                for (var c2 = frame.PlainRect.Y; c2 <= frame.PlainRect.Y + frame.PlainRect.Height; c2 += accuracyY)
                {
                    if (i < 0 || j < 0 || i >= AreaSize.Width || j >= AreaSize.Height)
                    {
                        continue;
                    }

                    if ((c1 * c1 + c2 * c2) > 1)
                    {
                        image.SetPixel(i, j, Color.White);
                    }
                    else
                    {
                        image.SetPixel(i, j, Color.Yellow);

                        var c0     = (float)Math.Sqrt(RGCircleRadius - c1 * c1 - c2 * c2);
                        var cPoint = new CPoint {
                            C0 = c0, C1 = c1, C2 = c2
                        };
                        var rgPoint = cPoint.RGPoint;
                        if (rgPoint.G < 0)
                        {
                            image.SetPixel(i, j, Color.Green);
                        }

                        if (Math.Abs(c1 - 0) < Epsilon || Math.Abs(c2 - 0) < Epsilon)
                        {
                            image.SetPixel(i, j, Color.Black);
                        }
                    }
                    j--;
                }
                i++;
            }

            frame.Image = image;
            Frame       = frame;
            Frames.Push(frame);
        }