public void Load(StatusBar sb)
        {
            if (!_loaded)
            {
                string txt = sb.Text;
                sb.Text = "Please wait. Loading functions...";

                // setup function code
                // can be long operation because code will be compiled in memory
                for (int i = 0; i < _flist.Length; i++)
                {
                    if (_flist[i] is YFunction)
                    {
                        YFunction yf = (YFunction)_flist[i];
                        yf.CodeText = _ycodes[i];
                    }
                    else if (_flist[i] is ParametricFunction)
                    {
                        ParametricFunction pf = (ParametricFunction)_flist[i];
                        pf.CodeTextX = _xcodes[i];
                        pf.CodeTextY = _ycodes[i];
                    }
                }

                sb.Text = txt;

                _loaded = true;
            }
        }
        private void AnimateStart()
        {
            if (listView1.SelectedItems[0].Tag is FunctionBase)
            {
                f_anim = (FunctionBase)listView1.SelectedItems[0].Tag;

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

                    par_anim_max = yf.MaxX;
                    par_anim_min = yf.MinX;
                }
                else if (f_anim is ParametricFunction)
                {
                    ParametricFunction pf = (ParametricFunction)f_anim;

                    par_anim_max = pf.MaxT;
                    par_anim_min = pf.MinT;
                }

                par_anim      = par_anim_min;
                par_anim_step = (par_anim_max - par_anim_min) / 200;

                timer1.Start();
                RedrawChart();

                btnAnimate.Text = "Stop animation";
            }
        }
        // create node and ParametricFunction group
        TreeNode AddGroup(TreeNode node, string name, string[] fnames, string[] fcodesx, string[] fcodesy,
                          double tmin, double tmax)
        {
            TreeNode gn = new TreeNode(name);

            FunctionBase[] fs = new FunctionBase[fnames.Length];            //!!VBSubst Dim fs(fnames.Length-1) As FunctionBase

            for (int i = 0; i < fs.Length; i++)
            {
                ParametricFunction f = new ParametricFunction();
                f.Label               = fnames[i];
                f.LineStyle.Color     = clrs[i];
                f.LineStyle.Thickness = 2;
                f.MinT = tmin;
                f.MaxT = tmax;
                fs[i]  = f;
            }

            FunctionsGroup fg = new FunctionsGroup(fs, fcodesx, fcodesy);

            gn.Tag = fg;
            node.Nodes.Add(gn);

            return(gn);
        }
        public static bool TryConvertToAutoDiff(ISymbolicExpressionTree tree, bool makeVariableWeightsVariable, bool addLinearScalingTerms,
                                                out List <DataForVariable> parameters, out double[] initialConstants,
                                                out ParametricFunction func,
                                                out ParametricFunctionGradient func_grad)
        {
            // use a transformator object which holds the state (variable list, parameter list, ...) for recursive transformation of the tree
            var transformator = new TreeToAutoDiffTermConverter(makeVariableWeightsVariable, addLinearScalingTerms);

            AutoDiff.Term term;
            try {
                term = transformator.ConvertToAutoDiff(tree.Root.GetSubtree(0));
                var parameterEntries = transformator.parameters.ToArray(); // guarantee same order for keys and values
                var compiledTerm     = term.Compile(transformator.variables.ToArray(),
                                                    parameterEntries.Select(kvp => kvp.Value).ToArray());
                parameters       = new List <DataForVariable>(parameterEntries.Select(kvp => kvp.Key));
                initialConstants = transformator.initialConstants.ToArray();
                func             = (vars, @params) => compiledTerm.Evaluate(vars, @params);
                func_grad        = (vars, @params) => compiledTerm.Differentiate(vars, @params);
                return(true);
            } catch (ConversionException) {
                func             = null;
                func_grad        = null;
                parameters       = null;
                initialConstants = null;
            }
            return(false);
        }
        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;
                }
            }
        }
    public static Mesh Generate(int xSize, int ySize, ParametricFunction Func)
    {
        Mesh mesh = new Mesh();

        mesh.name = "Procedural Grid";

        Vector3[] vertices = new Vector3[(xSize + 1) * (ySize + 1)];
        Vector2[] uv       = new Vector2[vertices.Length];
        Vector4[] tangents = new Vector4[vertices.Length];
        Vector4   tangent  = new Vector4(1f, 0f, 0f, -1f);

        for (int i = 0, y = 0; y <= ySize; y++)
        {
            for (int x = 0; x <= xSize; x++, i++)
            {
                vertices[i] = Func((float)x / (float)xSize, (float)y / (float)ySize);
                uv[i]       = new Vector2((float)x / xSize, (float)y / ySize);
                tangents[i] = tangent;
            }
        }
        mesh.vertices = vertices;
        mesh.uv       = uv;
        mesh.tangents = tangents;

        int[] triangles = new int[xSize * ySize * 6];
        for (int ti = 0, vi = 0, y = 0; y < ySize; y++, vi++)
        {
            for (int x = 0; x < xSize; x++, ti += 6, vi++)
            {
                triangles[ti]     = vi;
                triangles[ti + 3] = triangles[ti + 2] = vi + 1;
                triangles[ti + 4] = triangles[ti + 1] = vi + xSize + 1;
                triangles[ti + 5] = vi + xSize + 2;
            }
        }
        mesh.triangles = triangles;
        mesh.RecalculateNormals();
        return(mesh);
    }
 public VelocityChangerParametric(ParametricFunction xFunction, ParametricFunction yFunction)
 {
     _ParametricX = xFunction;
         _ParametricY = yFunction;
 }
 public VelocityChangerParametric(ParametricFunction xFunction, ParametricFunction yFunction)
 {
     _ParametricX = xFunction;
     _ParametricY = yFunction;
 }