/// <summary> /// Non Rational B-Spline curve point /// </summary> /// <param name="u">interval parameter 0 ≦ u ≦ 1</param> /// <returns></returns> public GPoint NonRationalBSpline(double u) { int span = NURBS.FindSpan(Degree, u, KnotVector); double[] basisFuns = NURBS.BasisFuns(span, Degree, KnotVector, u); double x = 0.0; double y = 0.0; for (int i = 0; i <= Degree; i++) { x += basisFuns[i] * ControlPoints[span - Degree + i].X; y += basisFuns[i] * ControlPoints[span - Degree + i].Y; } return(new GPoint(x, y)); }
/// <summary> /// Rational B-Splines (NURBS) curve /// </summary> /// <param name="u">interval parameter 0 ≦ u ≦ 1</param> /// <returns>curve point at u</returns> public GPoint RationalBSpline(double u) { int span = NURBS.FindSpan(Degree, u, KnotVector); double[] basisFuns = NURBS.BasisFuns(span, Degree, KnotVector, u);// CalcBasisFuns(span, u); double x = 0; double y = 0; double rationalWeight = 0.0; for (int i = 0; i <= Degree; i++) { GPoint cp = ControlPoints[span - Degree + i]; x += basisFuns[i] * cp.X * cp.W; y += basisFuns[i] * cp.Y * cp.W; rationalWeight += basisFuns[i] * cp.W; } return(new GPoint(x / rationalWeight, y / rationalWeight)); }