virtual public void Configure()
        {
            FractalSettingsDialog dia = new FractalSettingsDialog();

            dia.Parameters = (IFractalParameters)this.Parameters.Clone();
            if (dia.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.Parameters = dia.Parameters;
            }
        }
        void OnImageZoomed(Point p1, Point p2)
        {
            IFractalParameters pars = frac.Parameters;

            double x1f, y1f;
            double x2f, y2f;

            ScreenToFractal(p1.X, p1.Y, out x1f, out y1f);
            ScreenToFractal(p2.X, p2.Y, out x2f, out y2f);

            double XN  = (x2f + x1f) / 2.0;
            double YN  = (y2f + y1f) / 2.0;
            double WFN = (x2f - x1f);
            double HFN = (y2f - y1f);

            pars.SetValue("X", XN);
            pars.SetValue("Y", YN);
            pars.SetValue("W", WFN);
            pars.SetValue("H", HFN);
            RenderFractal();
        }
        bool ScreenToFractal(double X, double Y, out double XF, out double YF)
        {
            if (pictureBox2.Image != null)
            {
                int off_x = pictureBox2.Width - pictureBox2.Image.Width;
                int off_y = pictureBox2.Height - pictureBox2.Image.Height;

                off_x /= 2;
                off_y /= 2;

                if (X > off_x && X < (off_x + pictureBox2.Image.Width) &&
                    Y > off_y && Y < (off_y + pictureBox2.Image.Height))
                {
                    X -= off_x;
                    Y -= off_y;
                    IFractalParameters pars = frac.Parameters;

                    double FracX      = (double)pars.GetValue("X");
                    double FracY      = (double)pars.GetValue("Y");
                    double FracWidth  = (double)pars.GetValue("W");
                    double FracHeight = (double)pars.GetValue("H");
                    double FracX1     = FracX - 0.5 * FracWidth;
                    double FracY1     = FracY - 0.5 * FracHeight;

                    // PicW : X = FracWidth : dxf
                    // pictureBox2.Image.Width : X = FracWidth : dxf
                    double dxf = FracWidth * X / pictureBox2.Image.Width;
                    double dyf = FracHeight * Y / pictureBox2.Image.Height;
                    XF = FracX1 + dxf;
                    YF = FracY1 + dyf;
                    return(true);
                }
            }
            XF = 0;
            YF = 0;
            return(false);
        }