示例#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 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;
            }
        }