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 UpdateDragging(Point pt, bool finegrained) { // Check if we moved something Point dpt = d_dataLine[d_draggingData]; Point axis = d_graph.Graph.PixelToAxis(pt); if (d_graph.Graph.SnapRulerToAxis) { int factor = d_graph.Graph.SnapRulerToAxisFactor; if (finegrained) { factor *= 2; } axis = d_graph.Graph.SnapToAxis(axis, factor); } if (dpt.MarginallyEquals(axis)) { return; } if (d_draggingLine == null) { d_draggingLine = d_dataLine.Copy() as Plot.Renderers.Line; d_draggingLine.Color = d_graph.Graph.ColorMap[1]; d_draggingLine.LineStyle = Plot.Renderers.LineStyle.Dotted; d_draggingLine.YLabel = null; d_draggingLine.YLabelMarkup = null; d_graph.Graph.Add(d_draggingLine); } List <Point> data = new List <Point>(d_dataLine.Data); data[d_draggingData] = axis; Plot.Renderers.Bezier bezier = d_draggingLine as Plot.Renderers.Bezier; if (bezier != null) { // Do interpolation again on data Biorob.Math.Interpolation.PChip pchip = new Biorob.Math.Interpolation.PChip(); bezier.PiecewisePolynomial = pchip.Interpolate(data); } else { d_draggingLine.Data = data; } }