DEF myBlend (Basis::IsSeq) (ControlPoints::IsSeq) = (AA:innerProd ~ DISTL): < Basis, (AA:(AA:K) ~ TRANS):ControlPoints >; DEF subsets (h::IsIntPos)(seq::IsSeq) = (CONS ~ AA:(AS:SEL ~ FROMTO ~ [ID - K:h + K:1,ID])):(h..LEN:seq):seq; subsets:4:(1..10); subsets:5:(1..10); DEF mySpline (Curve::IsFun) = STRUCT ~ AA:Curve ~ subsets:4; %------------------------------------------------------------% %----Cubic cardinal------------------------------------------% %------------------------------------------------------------% DEF CubicCardinalBasis = < C0,C1,C2,C3 > WHERE C0 = ((k:0 - a) * u3) + ((k:2 * a) * u2) - (a * u), C1 = ((k:2 - a) * u3) + ((a - k:3) * u2) + (k:1), C2 = ((a - k:2) * u3) + ((k:3 - k:2 * a) * u2) + (a * u), C3 = (a * u3) - (a * u2), u = s1, u2 = u * u, u3 = u2 * u, a = k:1 END; DEF CubicCardinalGraph = STRUCT ~ [box,MAP:[u,C3], k:(T:1:1), box,MAP:[u,C2], k:(T:1:1), box,MAP:[u,C1], k:(T:1:1), box,MAP:[u,C0]] WHERE C0 = ((k:0 - a) * u3) + ((k:2 * a) * u2) - (a * u), C1 = ((k:2 - a) * u3) + ((a - k:3) * u2) + (k:1), C2 = ((a - k:2) * u3) + ((k:3 - k:2 * a) * u2) + (a * u), C3 = (a * u3) - (a * u2), u = s1, u2 = u * u, u3 = u2 * u, a = k:1, Box = K:(@1:(CUBOID:<1,1>)) END; DEF OUT=CubicCardinalGraph:(intervals:1:24); DEF myCubicCardinal (segmentDomain::IsPol) (q1,q2,q3,q4::IsSeq) = MAP:(Blend:CubicCardinalBasis:):segmentDomain; DEF myCubicCardinal (segmentDomain::IsPol) (q1,q2,q3,q4::IsSeq) = MAP:(Blend:CubicCardinalBasis:):segmentDomain WHERE segmentDomain = Intervals:1:splineSampling END; DEF CubicCardinalSpline(segmentDomain::IsPol)= ((mySpline:myCubicCardinal):segmentDomain); DEF out = ( STRUCT~ [ polyline, polymarker:2 ,mySpline:(myCubicCardinal:domain) ]): <<0,-1>,<-1,0>,<-2,1>,<0,3>,<2,1>,<1,0>,<0,-1>> WHERE domain = intervals:1:20 END; out; DEF CubicUBspline (segmentDomain::IsPol) (q1,q2,q3,q4::IsSeq) = MAP:(Blend:CubicUBsplineBasis:):segmentDomain; DEF out = ( STRUCT~ [ polyline, polymarker:2 ,Spline:(CubicUBspline:domain) ]): <<0,-1>,<-1,0>,<-2,1>,<0,3>,<2,1>,<1,0>,<0,-1>> WHERE domain = intervals:1:20 END; %------------------------------------------------------------% %-----Cubic uniform B-spline---------------------------------% %------------------------------------------------------------% DEF myCubicUBsplineBasis = < B0,B1,B2,B3 > WHERE B0 = a * ((k:3 * u2) - (k:1 * u3) - (k:3 * u) + (k:1)), B1 = a * ((k:3 * u3) - (k:6 * u2) + (k:4)), B2 = a * ((k:3 * u2) - (k:3 * u3) + (k:3 * u) + (k:1)), B3 = a * u3, u = s1, u2 = u * u, u3 = u2 * u, a = k:1/k:6 END; DEF CubicUBsplineGraph = STRUCT ~ [Box, MAP:[u,B3], k:(T:1:1), Box, MAP:[u,B2], k:(T:1:1), Box, MAP:[u,B1], k:(T:1:1), Box, MAP:[u,B0]] WHERE B0 = a * ((k:3 * u2) - (k:1 * u3) - (k:3 * u) + (k:1)), B1 = a * ((k:3 * u3) - (k:6 * u2) + (k:4)), B2 = a * ((k:3 * u2) - (k:3 * u3) + (k:3 * u) + (k:1)), B3 = a * u3, u = s1, u2 = u * u, u3 = u2 * u, a = k:1/k:6, Box = (K ~ @1 ~ CUBOID):<1,1> END; DEF OUT=CubicUBsplineGraph:(intervals:1:24); DEF myCubicUBspline (segmentDomain::IsPol) (q1,q2,q3,q4::IsSeq) = MAP:(Blend:CubicUBsplineBasis:):segmentDomain; DEF out = ( STRUCT~ [ polyline, polymarker:2 ,Spline:(CubicUBspline:domain) ]): <<0,-1>,<-1,0>,<-2,1>,<0,3>,<2,1>,<1,0>,<0,-1>> WHERE domain = intervals:1:20 END; out; DEF out = ( STRUCT~ [ polyline, polymarker:2 ,Spline:(CubicUBspline:domain) ]): <<0,-1>,<-2,1>,<0,3>,<2,1>,<0,-1>> WHERE domain = intervals:1:20 END; out; DEF out = ( STRUCT~ [ polyline, polymarker:2 ,Spline:(CubicUBspline:domain), Spline:(CubicCardinal:domain) ]): <<-3,6,0>,<-4,2,2>,<-3,-1,4>,<-1,1,-1>,<1.5,1.5,-2>,<3,4,2>,<5,5,0>, <7,2,3>,<6,-2,0>,<2,-3,0>> WHERE domain = intervals:1:20 END; out;