protected NurbsBase(int degree, KnotVector knots, List <Point4> controlPoints) { if (controlPoints is null) { throw new ArgumentNullException(nameof(controlPoints)); } if (knots is null) { throw new ArgumentNullException(nameof(knots)); } if (degree < 1) { throw new ArgumentException("Degree must be greater than 1!"); } if (knots.Count != controlPoints.Count + degree + 1) { throw new ArgumentException("Number of controlPoints + degree + 1 must equal knots length!"); } if (!knots.IsValid(degree, controlPoints.Count)) { throw new ArgumentException("Invalid knot format! Should begin with degree + 1 repeats and end with degree + 1 repeats!"); } Weights = Point4.GetWeights(controlPoints); Degree = degree; Knots = knots; ControlPointLocations = Point4.PointDehomogenizer1d(controlPoints); ControlPoints = controlPoints; }
/// <summary> /// Defines the NURBS form of the polyline. /// </summary> private void ToNurbsForm() { if (_segments.Count == 1) { Weights = Point4.GetWeights(_segments[0].ControlPoints); Degree = _segments[0].Degree; Knots = _segments[0].Knots; ControlPointLocations = Point4.PointDehomogenizer1d(_segments[0].ControlPoints); ControlPoints = _segments[0].ControlPoints; return; } // Extract the biggest degree between the curves. int finalDegree = _segments.Max(c => c.Degree); // Homogenized degree curves. IEnumerable <NurbsBase> homogenizedCurves = _segments.Select(curve => curve.Degree != finalDegree ? Modify.Curve.ElevateDegree(curve, finalDegree) : curve); // Join curves. List <double> joinedKnots = new List <double>(); List <Point4> joinedControlPts = new List <Point4>(); joinedKnots.AddRange(homogenizedCurves.First().Knots.Take(homogenizedCurves.First().Knots.Count - 1)); joinedControlPts.AddRange(homogenizedCurves.First().ControlPoints); foreach (NurbsBase curve in homogenizedCurves.Skip(1)) { joinedKnots.AddRange(curve.Knots.Take(curve.Knots.Count - 1).Skip(finalDegree + 1).Select(k => k + joinedKnots.Last()).ToList()); joinedControlPts.AddRange(curve.ControlPoints.Skip(1)); } // Appending the last knot to the end. joinedKnots.Add(joinedKnots.Last()); Weights = Point4.GetWeights(joinedControlPts); Degree = finalDegree; Knots = joinedKnots.ToKnot().Normalize(); ControlPointLocations = Point4.PointDehomogenizer1d(joinedControlPts); ControlPoints = joinedControlPts; }