úÎĽNW      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN O P Q R S T U V None=Knot vectors - multisets of points in a 1-dimensional space. An empty knot vector -Create a knot vector consisting of one knot. MCreate a knot vector consisting of one knot with the specified multiplicity. <Create a knot vector consisting of all the knots in a list. DCreate a knot vector consisting of all the knots and corresponding  multiplicities in a list. DCreate a knot vector consisting of all the knots and corresponding . multiplicities in a list ordered by the knots' W instance. The ' ordering precondition is not checked. DCreate a knot vector consisting of all the knots and corresponding . multiplicities in a list ordered by the knots' W instance with no 1 duplicates. The preconditions are not checked. CReturns a list of all distinct knots in ascending order along with  their multiplicities. IReturns the number of knots (not necessarily distinct) in a knot vector. 7Returns the number of distinct knots in a knot vector. splitLookup n kts: Split a knot vector kts into 3 parts (pre, mbKt, post)  such that:  All the keys in pre, mbKt& (viewed as a knot vector of either 0  or 1 knot), and post are disjoint and ordered N * Putting the 3 parts back together yields exactly the original knot vector  * The n'#th knot, if one exists, will be in mbKt along with its multiplicity X)Count the number of knots less than the n'th distinct knot. [Returns a list of all knots (not necessarily distinct) of a knot vector in ascending order ]Returns a vector of all knots (not necessarily distinct) of a knot vector in ascending order IReturns a list of all distinct knots of a knot vector in ascending order KReturns a vector of all distinct knots of a knot vector in ascending order  Returns a Y( of all distinct knots of a knot vector !LLooks up the multiplicity of a knot (which is 0 if the point is not a knot) "DReturns a new knot vector with the given knot set to the specified - multiplicity and all other knots unchanged. $0Check the internal consistency of a knot vector %knotSpan kts i j* returns the knot span extending from the i'th knot  to the j' th knot, if i <= j and both knots exist. &knotsInSpan kts i j3 returns the knots in the knot span extending from  the i'th knot to the j'th knot 'knotSpans kts width, returns all knot spans of a given width in  ascending order.  For example, knotSpans (mkKnots [1..5]) 2 yields [(1,3), (2,4), (3,5)]. (knotDomain kts p5 returns the domain of a B-spline or NURBS with knot  vector kts and degree p'. This is the subrange spanned by all  except the first and last p) knots. Outside this domain, the spline - does not have a complete basis set. De Boor's algorithm assumes that H the basis functions sum to 1, which is only true on this range, and so 3 this is also precisely the domain on which de Boor's algorithm is valid. )uniform deg nPts (lo,hi)0 constructs a uniformly-spaced knot vector over  the interval from lo to hi+ which, when used to construct a B-spline  with nPts8 control points will yield a clamped spline with degree deg. 1Z X !"#$%&'()*+[\],  !"#$%&'()*+,  !"#$%&'()*+0Z X !"#$%&'()*+[\] None,*A B-spline, defined by a knot vector (see $) and a sequence of control points. -SEvaluate a B-spline at the given point. This uses a slightly modified version of  de Boor'Ls algorithm which is only strictly correct inside the domain of the spline. V Unlike the standard algorithm, the basis functions always sum to 1, even outside the 2 domain of the spline. This is mainly useful for "clamped" splines - the values at Q or outside the endpoints will always be the value of the nearest control point. (For a standard implementation of de Boor's algorithm, see .. E For a (much slower) strictly mathematically correct evaluation, see evalReferenceBSpline. .:Evaluate a B-spline at the given point. This uses de Boor's algorithm, which is 8 only strictly correct inside the domain of the spline. DFor a (much slower) strictly mathematically correct evaluation, see evalReferenceBSpline. /Insert one knot into a , without changing the spline' s shape. 0The table from de Boor'Is algorithm, calculated for the entire spline. If that is not necessary @ (for example, if you are only evaluating the spline), then use ^ on the spline first.   splitBSplineN currently uses the whole table. It is probably not necessary there, but it e greatly simplifies the definition and makes the similarity to splitting Bezier curves very obvious. ,_`abc-./d0e^fghij ,_`abc-./0^,_`abc-./d0e^fghijNone1bSpline kts cps< creates a B-spline with the given knot vector and control N points. The degree is automatically inferred as the difference between the % number of spans in the knot vector (numKnots kts - 1) and the number of  control points ( length cps). 4HSplit a B-spline at the specified point (which must be inside the spline' s domain), X returning two disjoint splines, the sum of which is equal to the original. The domain X of the first will be below the split point and the domain of the second will be above. 1k23l4 ,-./01234 ,1-./42301k23l4None5XThis is a fairly slow function which computes the value of a B-spline at a given point, Z using the mathematical definition of B-splines. It is mainly for testing purposes, as a E reference against which the other evaluation functions are checked. 6YThis is a fairly slow function which computes one polynomial segment of a B-spline (the Z one containing the given point), using the mathematical definition of B-splines. It is Z mainly for testing purposes, as a reference against which the other evaluation functions  are checked. 7VThe values of all the B-spline basis functions for the given knot vector at the given  point, ordered by degree; " b_{i,j}(x)" is bases kts x !! i !! j. 8HAll the B-spline basis functions for the given knot vector at the given  point, ordered by degree; "b_{i,j}" is basisFunctions kts x !! i !! j. 9MAll the B-spline basis polynomials for the given knot vector, ordered first " by knot span and then by degree. :JAll the B-spline basis polynomials for the given knot vector at the given  point, ordered by degree; "b_{i,j}" is "basisPolynomialsAt kts x !! i !! j. mMThis is a straightforward implementation of the Cox-De Boor recursion scheme K generalized in a slightly strange way; the initial vector is a parameter K and the actual computation of the recursion step is a function parameter. O The purpose is to allow the same recursion to be applied when computing basis ) function values and basis polynomials. 56n789:mopq56789:789:56 56n789:mopqNone=JA spline is a piecewise polynomial vector-valued function. The necessary ' and sufficient instance definition is B. >CReturns the domain of a spline. In the case of B-splines, this is F the domain on which a spline with this degree and knot vector has a ? full basis set. In other cases, it should be no larger than  splineDomain . toBSpline+, but may be smaller. Within this domain,  ? should agree with ? . B (not F necessarily exactly, but up to reasonable expectations of numerical  accuracy). ;<=>?@ABrstu;<=>?@AB=>?@AB;<;<=>?@ABrstuNoneCA Bezier curve on 0 <= x <= 1. DDConstruct a Bezier curve from a list of control points. The degree = of the curve is one less than the number of control points. E+Split and rescale a Bezier curve. Given a C b and a point  t, splitBezierCurve b t creates 2 curves (b1, b2) such that (up to . reasonable numerical accuracy expectations): - evalSpline b1 x == evalSpline b (x * t) 1 evalSpline b2 (x-t) == evalSpline b (x * (1-t)) CvDwExyz?CDECDE?CvDwExyzNoneFGM-Splines are B-splines normalized so that the integral of each basis ' function over the spline domain is 1. GmSpline kts cps< creates a M-spline with the given knot vector and control N points. The degree is automatically inferred as the difference between the % number of spans in the knot vector (numKnots kts - 1) and the number of  control points ( length cps). F{|}~GH€‚ƒ?FGHFGH?F{|}~GH€‚ƒNoneIDThe I-Spline basis functions are the integrals of the M-splines, or F alternatively the integrals of the B-splines normalized to the range  [0,1]F. Every I-spline basis function increases monotonically from 0 to 1, I thus it is useful as a basis for monotone functions. An I-Spline curve L is monotone if and only if every non-zero control point has the same sign. JiSpline kts cps= creates an I-spline with the given knot vector and control N points. The degree is automatically inferred as the difference between the % number of spans in the knot vector (numKnots kts - 1) and the number of  control points ( length cps). I„…†‡JKˆ‰Š‹?IJKIJK?I„…†‡JKˆ‰Š‹NoneL>Cubic Hermite splines. These are cubic splines defined by a = sequence of control points and derivatives at those points. M6Cubic splines specified by a list of control points, D where each control point is given by a triple of parameter value, 1 position of the spline at that parameter value, 7 and derivative of the spline at that parameter value. LŒMŽ‘’“”?LMLM? LŒMŽ‘’“” None•IConstructs the homogeneous-coordinates B-spline that corresponds to this  NURBS curve –OConstructs the NURBS curve corresponding to a homogeneous-coordinates B-spline RGReturns the domain of a NURBS - that is, the range of parameter values L over which a spline with this degree and knot vector has a full basis set. N—OP•–QRSTUV˜ NOPQRSTUV NPOQRSTUV N—OP•–QRSTUV˜ None,1;<=>?@ABCDFGHIJKLM=>?@AB;<CD,1FGHIJKLM™   !"#$%&'()*+,-./01234567 8 9 : ; <=>?@ABCDEFGHIJKLMNOPQRSTUVWXY Z [ \ ] ^ _ ` a bcdefghi jkl m I n M H o p q r s t u vwxyzx{|}~€O‚ƒ„R…†‡xˆ‰Š‹UŒŽˆ‘X’“”•–—x˜ ™ š Z ›œsplines-0.5.0.1Math.Spline.KnotsMath.Spline.BSplineMath.Spline.BSpline.ReferenceMath.Spline.ClassMath.Spline.BezierCurveMath.Spline.MSplineMath.Spline.ISplineMath.Spline.Hermite Math.NURBSMath.Spline.BSpline.Internal Math.SplineKnotsemptyisEmptyknot multipleKnotmkKnotsfromList fromAscListfromDistinctAscListfromMap fromVectortoListtoVectortoMapnumKnotsnumDistinctKnotsmaxMultiplicity lookupKnotlookupDistinctKnot splitLookup dropKnots takeKnots splitKnotsAttakeDistinctKnotsdropDistinctKnotssplitDistinctKnotsAtknots knotsVector distinctKnotsmultiplicitiesdistinctKnotsVectormultiplicitiesVectordistinctKnotsSetknotMultiplicitysetKnotMultiplicity splitFindvalidknotSpan knotsInSpan knotSpans knotDomainuniformminKnotmaxKnotBSpline evalBSplineevalNaturalBSpline insertKnotdeBoorbSplinedifferentiateBSplineintegrateBSpline splitBSplineevalReferenceBSplinefitPolyToBSplineAtbasesbasisFunctionsbasisPolynomialsbasisPolynomialsAt ControlPoints controlPointsSpline splineDomain evalSpline splineDegree knotVector toBSpline BezierCurve bezierCurvesplitBezierCurveMSplinemSpline toMSplineISplineiSpline toISplineCSplinecSplineNURBStoNURBSnurbs evalNURBS nurbsDomain nurbsDegreenurbsKnotVectornurbsControlPoints splitNURBSghc-prim GHC.ClassesOrdfindDistinctKnotcontainers-0.5.0.0 Data.Set.BaseSet$fFoldableKnots $fMonoidKnots $fShowKnotsslicedegreemapControlPointsextendinterpvtakevdrop stakeKnots sdropKnots $fShowBSpline maybeSplinespans coxDeBoorind spanDiffs spansWith$fControlPointsBSplinea$fControlPointsBSplinea0$fSplineBSplinea$fSplineBSplinev deCasteljau$fControlPointsBezierCurvev$fSplineBezierCurvev$fShowBezierCurve mSplineDegreemSplineKnotVectormSplineControlPoints fromBSpline$fControlPointsMSplinev$fSplineMSplinev $fShowMSpline iSplineDegreeiSplineKnotVectoriSplineControlPoints$fControlPointsISplinev$fSplineISplinev $fShowISplineh00h10h01h11 evalHermite evalCSpline$fSplineCSplinea nurbsAsSpline splineAsNURBS $fShowNURBS