%------------------------------------------------------% %---Bernstein polynomials and basis -------------------% %------------------------------------------------------% DEF Bernstein (u::IsFun)(n::IsInt)(i::IsInt) = * ~ [K:(Choose:),** ~ [ID,K:i], ** ~ [- ~ [K:1,ID],K:(n-i)]] ~ u; DEF BernsteinBasis (u::IsFun)(n::IsInt) = AA:(Bernstein:u:n):(0..n); %------------------------------------------------------% %---Transfinite Bezier mapping (arbitrary degree)------% %------------------------------------------------------% DEF Bezier (u::IsFun) (ControlData::IsSeq) = (AA:InnerProd ~ DISTR): < (fun ~ TRANS):ControlData, BernsteinBasis:u:degree > WHERE degree = LEN:ControlData - 1, fun = (AA ~ AA):(IF:< IsFun, ID, K >) END; DEF points1 = <<0,0,0>,<0,3,4>,<0,6,3>,<0,10,0>>; DEF points2 = <<3,0,2>,<2,2.5,5>,<3,6,5>,<4,8,2>>; DEF points3 = <<6,0,2>,<8,3,5>,<7,6,4.5>,<6,10,2.5>>; DEF points4 = <<10,0,0>,<11,3,4>,<11,6,3>,<10,9,0>>; DEF UDOMAIN =(INTERVALS:1:16); DEF UVDOMAIN=UDOMAIN*UDOMAIN; DEF c1 = Bezier:S1:points1; DEF c2 = Bezier:S1:points2; DEF c3 = Bezier:S1:points3; DEF c4 = Bezier:S1:points4; DEF surf = BEZIER:S2:; DEF OUT=STRUCT:)):UDOMAIN), MAP:surf:UVDOMAIN>; %------------------------------------------------------% %----Transfinite cubic Hermite mapping-----------------% %------------------------------------------------------% DEF HermiteBasis (u::IsFun) = WHERE h0 = k:2 * u3 - k:3 * u2 + k:1, h1 = k:3 * u2 - k:2 * u3, h2 = u3 - k:2 * u2 + u, h3 = u3 - u2, u3 = u*u*u, u2 = u*u, fun = (AA ~ AA):(IF:) END; DEF CubicHermite (u::IsFun) (p1,p2,t1,t2::IsSeq) = (AA:InnerProd ~ DISTL): < HermiteBasis:u, (TRANS ~ fun): > WHERE fun = (AA ~ AA):(IF:) END; DEF Surf2 = CubicHermite:S2:< c1,c2,c3,c4 >; DEF OUT=STRUCT:)):UDOMAIN), MAP:surf2:UVDOMAIN>; DEF Surf2 = CubicHermite:S2:< c1,c2,<1,1,1>,<-1,-1,-1> >; DEF OUT=STRUCT:)):UDOMAIN), MAP:surf2:UVDOMAIN>; DEF CIRCLEF(rad,height::IsNum)(u::IsFun) = < K:rad * COS~*~[K:(2*PI),u], K:rad * SIN~*~[K:(2*PI),u], K:height >; DEF Surf3 = CubicHermite:S2:< CIRCLEf:<1,0>:S1,CIRCLEF:<2,1>:S1,<0,0,1>,<0,0,1> >; DEF OUT=STRUCT:; %-----------------------------------------------------------------% %-----Coons patches-----------------------------------------------% %-----------------------------------------------------------------% DEF CoonsPatch (Su0,Su1,S0v,S1v::IsSeqOf:IsFun) = (vectSum ~ AA:scalarVectProd): <,,,,<-~a0v,b0u>,<-~a1v,b1u>> WHERE b0u = (vectSum ~ AA:scalarVectProd):<,>, b1u = (vectSum ~ AA:scalarVectProd):<,>, S_00 = (AA:K ~ CONS:Su0):<0,0>, S_01 = (AA:K ~ CONS:S0v):<0,1>, S_10 = (AA:K ~ CONS:Su0):<1,0>, S_11 = (AA:K ~ CONS:S1v):<1,1>, a0u = K:1 - u, a1u = u, a0v = K:1 - v, a1v = v, u = S1, v = S2 END; DEF myCoonsPatch (Su0,Su1,S0v,S1v::IsSeqOf:IsFun) = (vectSum ~ AA:scalarVectProd): <,,,,<-~a0v,b0u>,<-~a1v,b1u>> WHERE b0u = (vectSum ~ AA:scalarVectProd):<,>, b1u = (vectSum ~ AA:scalarVectProd):<,>, S_00 = (AA:K ~ CONS:Su0):<0,0>, S_01 = (AA:K ~ CONS:S0v):<0,1>, S_10 = (AA:K ~ CONS:Su0):<1,0>, S_11 = (AA:K ~ CONS:S1v):<1,1>, a0u = K:1 - u, a1u = u, a0v = K:1 - v, a1v = v, u = S1, v = S2 END; DEF out = MAP:(myCoonsPatch:):(Domain2D:<12,12>) WHERE Domain2D (n,m::IsIntPos) = Intervals:1:n * Intervals:1:m, ru0 = BezierCurve:<<0,0,0>,<10,0,0>> (AA:COMP ~DISTR) [S1], ru1 = BezierCurve:<<0,10,0>,<2.5,10,3>,<5,10,-3>,<7.5,10,3>,<10,10,0>> (AA:COMP ~DISTR) [S1], r0v = BezierCurve:<<0,0,0>,<0,0,3>,<0,10,3>,<0,10,0>> (AA:COMP ~DISTR) [S2], r1v = BezierCurve:<<10,0,0>,<10,5,3>,<10,10,0>> (AA:COMP ~DISTR) [S2] END;