private void timer1_Tick(object sender, System.EventArgs e)
        {
            par_anim += par_anim_step;

            if (par_anim > par_anim_max)
            {
                par_anim      = par_anim_max;
                par_anim_step = -par_anim_step;
            }
            else if (par_anim < par_anim_min)
            {
                par_anim      = par_anim_min;
                par_anim_step = -par_anim_step;
            }

            if (f_anim != null)
            {
                double xd = 0, yd = 0;
                int    x = 0, y = 0;

                if (f_anim is YFunction)
                {
                    YFunction yf = (YFunction)f_anim;

                    xd = par_anim;
                    yd = yf.GetY(xd);

                    statusBar1.Text = string.Format(" x={0:g4}", xd);
                }
                else if (f_anim is ParametricFunction)
                {
                    ParametricFunction pf = (ParametricFunction)f_anim;

                    xd = pf.GetX(par_anim);
                    yd = pf.GetY(par_anim);

                    statusBar1.Text = string.Format(" t={0:g4}", par_anim);
                }

                Axis xa = c1Chart1.ChartArea.AxisX;
                Axis ya = c1Chart1.ChartArea.AxisY;

                if (xd >= xa.Min && xd <= xa.Max && yd >= ya.Min && yd <= ya.Max &&
                    c1Chart1.ChartGroups[0].DataCoordToCoord(xd, yd, ref x, ref y))
                {
                    RedrawChart();
                    curPosition.X = x; curPosition.Y = y;
                    RedrawChart();
                }
                else
                {
                    RedrawChart();
                    curPosition = Point.Empty;
                }
            }
        }