% Lezione 9 % DEF Intervals (a::IsRealPos)(n::IsIntPos) = (QUOTE ~ #:n):(a/n); % MAP:f:domain; % DEF domain=Intervals:1:16; DEF domain2PI=Intervals:(2*PI):16; DEF OUT=MAP:ID:domain; def out2=struct:; DEF OUT=MAP:PRINT:domain; DEF OUT=MAP:PRINT:(domain*domain); def out2=@1:out; DEF OUTA=MAP:[S1,SIN~S1]:domain2PI; DEF OUTB=MAP:[S1,SIN~*~[K:(2*PI),S1]]:domain; DEF OUT=STRUCT:; DEF OUT=(STRUCT~[MAP:[S1 + S2, S1, S2],ID]):(domain*domain); DEF UNITCIRCLE=MAP:[COS~S1,SIN~S1]:domain2PI; DEF MYCIRCLE(R::ISREAL)=MAP:[K:R * COS~S1,K:R * SIN~S1]:domain2PI; DEF OUT=STRUCT:(AA:MyCIRCLE:(1..10)); DEF myELLIPSE(A,B::IsNum)=MAP:[K:A * COS~S1,K:B * SIN~S1]:domain2PI; DEF OUT=STRUCT:(AA:MyELLIPSE:(DISTL:<1,(1..10)>)); DEF SPIRAL(H::ISNum)=MAP:[COS~S1,SIN~S1,K:(H/(2*PI)) * S1]:domain2PI; DEF OUT=SPIRAL:1; DEF DISK=MAP:[S2 * COS~S1,S2 * SIN~S1]: (domain2PI*domain); DEF POLY(u::IsNum) = 3*u**2 + 2*u + 4 ; POLY:0; POLY:1; POLY:2; DEF OUT=MAP:[POLY~S1,S1]:(Intervals:10:16); DEF POWERBASIS(n::IsNat)=AA:(**~[K:ID,K]):(RANGE:); % (**~[K:ID,K]):3 = **: = ** : < ID, K:3 > = ID ** K:3 % (CONS:(POWERBASIS:8)):2; InnerProd:<<1,2,4>,<4,2,3>>; DEF POLY2=(InnerProd:>); POLY2:0; POLY2:1; POLY2:2; DEF OUT=MAP:[POLY2~S1,S1]:(Intervals:2:16); DEF mkPOLY = InnerProd ~ [POWERBASIS~LEN,fun] WHERE fun=AA:K END; DEF POLY3=mkPoly:<3,2,4>; POLY3:0; POLY3:1; POLY3:2; DEF OUT=MAP:[POLY3~S1,S1]:(Intervals:2:16); DEF mkVPOLY = AA:InnerProd ~ DISTL ~ [POWERBASIS~LEN,fun~TRANS] WHERE fun = (AA ~ AA):K END; DEF VPOLY=mkVPOLY:<<3,0,4>,<2,1,2>,<4,0,3>>; (CONS:VPOLY):0; (CONS:VPOLY):1; (CONS:VPOLY):2; DEF OUT=MAP:(CONS:VPOLY~S1):(Intervals:2:16); <<-1,1>,<1,0>> * <<0,0>,<1,1>>; DEF LINE=mkVPOLY~*~[K:<<-1,1>,<1,0>>,ID]; DEF ALINE=mkVPOLY:(<<1,1>,<0,0>>); DEF ALINE=LINE:<<0,0>,<1,1>>; DEF MkCurve(geo2algMat::IsMat)=mkVPOLY~*~[K:(inv:geo2algMat),ID]; DEF LINE=MkCurve:<<0,1>,<1,1>>; DEF ALINE=LINE:<<0,0>,<1,1>>; (CONS:ALINE):0; (CONS:ALINE):0.5; (CONS:ALINE):1; DEF ALINE=LINE:<<3,0>,<1,3>>; (CONS:ALINE):0; (CONS:ALINE):0.5; (CONS:ALINE):1; DEF OUT=MAP:(CONS:(LINE:<<0,0,0>,<1,4,9>>)~S1):(Intervals:1:8); OUT; DEF QUAD=mkCurve:<<0,0,1>,<1/4,1/2,1>,<1,1,1>>; DEF AQUAD=QUAD:<<-1,1>,<0,0>,<1,1>>; (CONS:AQUAD):0; (CONS:AQUAD):0.5; (CONS:AQUAD):1; DEF OUT=MAP:((CONS:AQUAD)~S1):((T:1:-5):(Intervals:10:32)); DEF CUBICHERMITTE=mkCurve:<<0,0,0,1>,<1,1,1,1>,<0,0,1,0>,<3,2,1,0>>; DEF ACHERM=CUBICHERMITTE:<<0,0>,<10,0>,<0,10>,<10,10>>; (CONS:ACHERM):0; (CONS:ACHERM):0.5; (CONS:ACHERM):1; DEF OUT=MAP:((CONS:ACHERM)~S1):(Intervals:1:16); %------------------------------------------------------% %----Transfinite cubic Hermite mapping-----------------% %------------------------------------------------------% DEF myHermiteBasis (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 END; (cons:(myHermiteBasis:ID)):0; (cons:(myHermiteBasis:ID)):0.5; (cons:(myHermiteBasis:ID)):1; DEF myHermite (u::IsFun) (p1,p2,t1,t2::IsSeq) = (AA:InnerProd ~ DISTL): < HermiteBasis:u, (TRANS ~ fun): > WHERE fun = (AA ~ AA):(IF:) END; DEF manici = <<0,0>,<7,9>,<-1,1>,<1,-1>>; DEF curva = myHermite:S1:manici; DEF out = MAP:curva:(intervals:1:16); DEF manici = <<0,0>,<7,9>,<1,-1>,<7,9>>; DEF curva = myHermite:S1:manici; DEF out = MAP:curva:(intervals:1:16); %------------------------------------------------------% %---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 myBezier (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 manici = <<0,0>,<10,0>,<10,10>,<0,10>,<10,10>>; DEF dominio = intervals:1:30; DEF curva = myBezier:s1:manici; DEF out = MAP: curva: dominio; DEF manici = <<-1,0>,<-2,1>,<-2,2>,<0,3>,<2,2>,<2,1>,<1,0>>; DEF dominio = intervals:1:30; DEF curva = myBezier:s1:manici; DEF out = MAP: curva: dominio;