Ejemplo n.º 1
0
        public static IEnumerable <PrimitiveBezier> SplineToBezierCurves(Spline spline)
        {
            if (spline == null)
            {
                throw new ArgumentNullException(nameof(spline));
            }

            var expectedIdenticalKnots = spline.Degree + 1;
            var builder = new SplineBuilder(spline.Degree, spline.ControlPoints, spline.KnotValues);

            for (int offset = 0; ; offset++)
            {
                // get next set of values
                var values = builder.KnotValues.Skip(offset * expectedIdenticalKnots).Take(expectedIdenticalKnots).ToList();

                if (values.Count == 0 && builder.KnotValues.Count() % expectedIdenticalKnots == 0)
                {
                    // done
                    break;
                }

                var expectedValue = values[0];
                int missingValueCount;
                if (values.Count < expectedIdenticalKnots)
                {
                    // not enough values
                    missingValueCount = expectedIdenticalKnots - values.Count;
                }
                else if (values.Count < expectedIdenticalKnots || values.Any(v => v != expectedValue))
                {
                    // not all the same
                    missingValueCount = expectedIdenticalKnots - values.Count(v => v == expectedValue);
                }
                else
                {
                    missingValueCount = 0;
                }

                for (int i = 0; i < missingValueCount; i++)
                {
                    builder.InsertKnot(expectedValue);
                }
            }

            var points = builder.ControlPoints.ToList();
            var curves = new List <PrimitiveBezier>();

            for (int startIndex = 0; startIndex < points.Count; startIndex += expectedIdenticalKnots)
            {
                var curve = PrimitiveBezier.FromPoints(points, startIndex, expectedIdenticalKnots);
                curves.Add(curve);
            }

            return(curves);
        }