DEF UnitSphere=MAP:[COS~S1 * COS~S1, COS~S1 * SIN~S2, -~SIN~S1] :((intervals:(2*PI):12)*(intervals:(2*PI):12)); DEF OUT=@1:UnitSphere; DEF myProfileProdSurface (profile, section::IsSeqOf:IsFun) = < fx, fy, fz > WHERE fx = s1:profile * s1:section ~ [S2], fy = s1:profile * s2:section ~ [S2], fz = s3:profile END; DEF myRuledSurface (alpha,beta::IsSeqOf:IsFun) = alpha vectSum (S2 scalarVectProd beta); DEF alpha = Bezier:S1:<<0.1,0,0>,<2,0,0>,<0,0,4>,<1,0,5>>; DEF beta = Bezier:S1:<<0,0,0>,<3,-0.5,0>,<3,3.5,0>,<0,3,0>>; DEF out = STRUCT:< MAP:alpha:(Intervals:1:20), MAP:beta :(Intervals:1:20), MAP:(ProfileProdSurface:< alpha, beta >):(Intervals:1:20 * Intervals:1:20) >; DEF myRotationalSurface (ProfileCurve::IsSeqOf:IsFun) = < f * cos ~ s2, f * sin ~ s2, g > WHERE f = s1:ProfileCurve, g = s2:ProfileCurve END; DEF myProfileCurve = Blend:(BsplineBasis:4:<0,0,0,0,1,2,3,4,4,4,4>): <<0.1,0>,<2,0>,<6,1.5>,<6,4>,<2,5.5>,<2,6>,<3.5,6.5>>; DEF mydomain = Intervals:4:32 * Intervals:(2*PI):32; DEF out = MAP:(myRotationalSurface:myProfileCurve):mydomain; DEF myRuledSurface (alpha,beta::IsSeqOf:IsFun) = alpha vectSum (S2 scalarVectProd beta); DEF myv1 = BezierCurve:<<1,1,0>,<-1,1,0>,<1,-1,0>,<-1,-1,0>>; DEF myv2 = < COS ~ (K:(3*PI/2) * S1), SIN ~ (K:(3*PI/2) * S1), K:1 >; DEF mydomain = Intervals:1:10; DEF out = MAP:(myRuledSurface:< myv1, myv2 vectDiff myv1 >):(mydomain * mydomain); DEF CylindricalSurface (alpha::IsSeqOf:IsFun; beta::IsSeqOf:IsReal) = RuledSurface:< alpha, AA:K:beta >; DEF alpha = BezierCurve:<<1,1,0>,<-1,1,0>,<1,-1,0>,<-1,-1,0>>; DEF Udomain = Intervals:1:20; DEF Vdomain = Intervals:1:6; DEF surfaceDomain = Udomain * Vdomain; DEF out = MAP:(CylindricalSurface:< alpha, <0,1,1> >):surfaceDomain; %-----------------------------------------------------------------% %----Conical surface generator------------------------------------% %-----------------------------------------------------------------% DEF ConicalSurface (alpha::IsSeqOf:IsReal; beta::IsSeqOf:IsFun) = RuledSurface:< AA:K:alpha, beta vectDiff AA:K:alpha >; DEF beta = BezierCurve:<<1,1,0>,<-1,1,0>,<1,-1,0>,<-1,-1,0>>; DEF surfaceDomain = Intervals:1:20 * Intervals:1:6; DEF out = MAP:(ConicalSurface:< <0,0,1>, beta >):surfaceDomain;