Пример #1
0
        private void UpdatePieces(List <Point> data)
        {
            d_ignoreUpdatePreview = true;

            bool hasperiod = ValidPeriod;

            List <Undo.IAction> actions = new List <Undo.IAction>();

            Biorob.Math.Range range  = DeterminePeriod();
            double            period = 0;

            if (hasperiod)
            {
                period = Period;
            }

            foreach (Cdn.FunctionPolynomialPiece piece in d_function.Pieces)
            {
                actions.Add(new Undo.RemoveFunctionPolynomialPiece(d_function, piece));
            }

            if (hasperiod && range != null)
            {
                // Remove data outside the range
                data.RemoveAll(d => d.X <range.Min || d.X> range.Max);
            }

            // Then make it periodic
            Biorob.Math.Interpolation.PChip pchip = new Biorob.Math.Interpolation.PChip();
            data.Sort();

            if (hasperiod)
            {
                Biorob.Math.Interpolation.Periodic.Extend(data, 0, period);
            }

            Biorob.Math.Functions.PiecewisePolynomial poly = pchip.InterpolateSorted(data);

            foreach (Biorob.Math.Functions.PiecewisePolynomial.Piece piece in poly.Pieces)
            {
                Cdn.FunctionPolynomialPiece p;

                p = new FunctionPolynomialPiece(piece.Begin, piece.End, piece.Coefficients);
                actions.Add(new Undo.AddFunctionPolynomialPiece(d_function, p));
            }

            try
            {
                d_actions.Do(new Undo.Group(actions));
            }
            catch (Exception e)
            {
                Error(this, e);
            }

            d_ignoreUpdatePreview = false;
            UpdatePreview();
        }
Пример #2
0
        private void DoAddPiece()
        {
            FunctionPolynomialPiece piece;

            if (d_function.Pieces.Length == 0)
            {
                piece = new FunctionPolynomialPiece(0, 1, 0, 0, 0, 1);
            }
            else
            {
                FunctionPolynomialPiece last = d_function.Pieces[d_function.Pieces.Length - 1];
                piece = new FunctionPolynomialPiece(last.End, last.End + (last.End - last.Begin), last.Coefficients);
            }

            d_select = true;
            d_actions.Do(new Undo.AddFunctionPolynomialPiece(d_function, piece));
            d_select = false;
        }
Пример #3
0
        private void BeginEdited(string newBegin, string path)
        {
            if (String.IsNullOrEmpty(newBegin.Trim()))
            {
                return;
            }

            Node node = d_treeview.NodeStore.FindPath(path);

            if (node == null)
            {
                return;
            }

            double val = 0;

            try
            {
                val = double.Parse(newBegin.Trim());
            }
            catch (Exception e)
            {
                Error(this, e);
                return;
            }

            if (node.Piece == null)
            {
                /* Add a new piece */
                try
                {
                    FunctionPolynomialPiece piece;

                    if (d_function.Pieces.Length == 0)
                    {
                        piece = new FunctionPolynomialPiece(val, val + 1, 0, 0, 0, 1);
                    }
                    else
                    {
                        FunctionPolynomialPiece last = d_function.Pieces[d_function.Pieces.Length - 1];
                        piece = new FunctionPolynomialPiece(val, val + (last.End - last.Begin), 0, 0, 0, 1);
                    }

                    d_actions.Do(new Undo.AddFunctionPolynomialPiece(d_function, piece));
                }
                catch (GLib.GException err)
                {
                    // Display could not remove, or something
                    Error(this, err);
                }

                return;
            }

            if (val == node.Piece.Begin)
            {
                return;
            }

            try
            {
                d_actions.Do(new Undo.ModifyFunctionPolynomialPieceBegin(d_function, node.Piece, val));
            }
            catch (GLib.GException err)
            {
                // Display could not remove, or something
                Error(this, err);
                return;
            }
        }