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(); }
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; }
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; } }