Una superficie come insieme di punti di uno spazio euclideo n E è
Transcript
Una superficie come insieme di punti di uno spazio euclideo n E è
Una superficie come insieme di punti di uno spazio euclideo E n è definibile parametricamente come l’immagine di una funzione di due parametri reali S : U R 2 E n , con n>=2, dove la funzione generatrice S è detta mappa della superficie (o superficie), mentre l’insieme dei punti è l’immagine della superficie. Se il dominio U è limitato, S(U) è detto intervallo o patch della superficie. Possiamo scrivere: (u, v) U ( x1 (u, v)....xn (u, v))T cioè S ( x1 .... xn )T , dove xi : R 2 R sono le funzioni coordinate della superficie. La superficie S si dice regolare in (u,v) se: - le funzioni coordinate hanno derivate parziali continue in (u,v) - i vettori derivata parziale di S sono linearmente indipendenti: S u (u, v) ( u x1 (u, v).... u xn (u, v)) S v (u, v) ( v x1 (u, v).... v xn (u, v)) cioè S u (u, v) S v (u, v) 0 . Se ciò vale per ogni (u, v) U , la superficie si dice regolare. Generiamo una sfera unitaria in E 3 a partire da una semicirconferenza nel sottospazio y=0: costruiamo una meridiana c(u)=Ry(u)e1 per rotazione attorno all’asse y: cos u 0 sin u 1 cos u cos v sin v 0 cos u sin v c(u ) 0 1 0 0 0 sin u 0 cos u 0 dove /2 u /2 e S (u, v) R z (v)c(u ) sin v cos v 0 0 sin u Su Sv 0 c(u ) cos u sin v 1 sin u cos u , cioè è regolare tranne ai poli dove cosu=0. DEF UnitSphere=MAP:[COS~S1*COS~S2,COS~S1*SIN~S2,-~SIN~S1]: ((intervals:(2*PI):12)*(intervals:(2*PI):12)); Una superficie prodotto profilo è generata in E 3 trasformando affinemente una curva sezione lungo una curva profilo. Siano le curve profilo e sezione: T T (u) ( 1 (u) 0 (v) ( 1 (v) 0) S (u, v) ( 1 (u) 1 (v) 3 (u )) , 2 (v) 1 (u ) 2 (v) 3 (u )) dove si noti che la funzione coordinata a1 è usta come coefficiente di scala, mentre a3 come coefficiente di traslazione nella direzione z. DEF ProfileProdSurface (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 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>>; MAP:(ProfileProdSurface:<alpha,beta>):(Intervals:1:20*Intervals:1:20) Si noti che la funzione sezione è composta con s2 per consentire l’applicazione di sezione sulla seconda coordinate dei punti del dominio. Una superficie rotazionale si ottiene ruot. attorno all’asseZ una curva profilo definita nel pianoXZ: cos v sin v 0 f (u ) cos v (u ) ( f (u ) 0 g(u)) T S (u, v) R z (v ) u sin v cos v 0 u f (u ) sin v 0 0 1 g (u ) Se per ogni u, f(u)!=0 e a(u)!=0, allora la superficie è sempre regolare. Tali superfici sono un caso particolare delle superf. prodotto profilo, dove la curva sezione è un cerchio unitario (cosv sinv 0)T. DEF RotationalSurface(ProfileCurve::IsSeqOf:IsFun)=<f*cos~s2,f*sin~s2,g> WHERE f = s1:ProfileCurve, g = s2:ProfileCurve END; DEF ProfileCurve = 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 domain = Intervals:4:32 * Intervals:(2*PI):32; MAP:(RotationalSurface:ProfileCurve):domain; Una superficie è rigata se ogni suo punto appartiene ad una linea retta tutta contenuta nella superficie. Può essere generata dal movimento di una retta. Se a(u) è una curva che attraversa tutte le rette della superficie e b(u) è un vettore orientato come la retta che attraversa a(u), allora: S (u, v) (u) v (u) DEF RuledSurface(a,b::IsSeqOf:IsFun)=a vectSum (S2 scalarVectProd b); Un cilindro è una superficie rigata in cui la direzione delle rette è data da un vettore costante b: Tale superficie non è regolare dove a’(u)Xb=0 e inoltre se a(u) è un S (u, v) (u) v cerchio e b è ortogonale al suo piano, si ha il cilindro circolare retto. La funzione che la implementa richiede che b sia parallelo alle rette e non complanare alla curva sezione e che la curva sezione a sia tridimensionale. 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 Domain = Intervals:1:20*Intervals:1:6; MAP:(CylindricalSurface:< alpha, <0,1,1> >):Domain; Una superficie conica è una superficie rigata tale che: S (u, v) v (u) dove a è il punto che appartiene a tutti i raggi vb(u) ed è detto apice o vertice della superficie. Se per ogni u i vettori b(u) formano un angolo costante con un vettore fisso, la superficie è un cono circolare. Sull’apice, per v= 0, dove bXb’=0, tale superficie non è regolare. 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 Domain = Intervals:1:20 * Intervals:1:16; MAP:(ConicalSurface:< <0,0,1>, beta >):surfaceDomain; Le curve polinomiali sono una combinazione lineare di punti o vettori con un’opportuna base di funzioni polinomiali di una variabile: le superfici prodotto tensore sono una generalizzazione di tali curve, in cui la base è composta da funzioni polinomiali di due variabili, calcolata come prodotto tensore di due basi univariate. Le proprietà di tali superfici provengono perciò direttamente dalle proprietà delle curve parametriche. Una curva polinomiale di grado m in forma matriciale: , dove è il vettore riga della base di potenze di grado m, è la matrice (m+1)X(m+1) della forma geometrica, è la base polinomiale e è il vettore colonna dei manici geometrici. Se i manici non sono punti ma funzioni vettoriali univariate: con 0 , da cui , in cui sono due basi univariate di funzioni polinomiali di gradi m e n, mentre è un tensore dei manici di controllo. Facendo dipendere la superficie dai gradi n e m: = , che è il prodotto interno dei manici di controllo con la base bivariata, la quale è il prodotto tensore di due basi univariate: che è la forma matriciale di prodotto tensore. Una superficie bilineare interpola quattro punti di controllo arbitrari, dati in una matrice 2x2: può essere sia in forma di Lagrange che di Bezier. La forma matriciale di tale superficie si ricava dall’equazione: , dove , dove , e vale : . Tale superficie è lineare in entrambi i parametri u e v. DEF BilinearSurface (ControlPoints::IsMatOf:IsPoint) = TensorProdSurface:< BernsteinBasis:S1:1, BernsteinBasis:S1:1>:ControlPoints; MAP:(BilinearSurface:<<punti riga1>,<punti riga2>>):UVDOMAIN Un superficie biquadratica (di Lagrange) interpola un array 3x3 di punti di controllo. Ricordando che l’equazione di una curva polinomiale quadratica vale: e che per la superficie S(u,v) p1,p2,p3 sono in realtà funzioni vettor. di v: dove , è la base di Lagrange di grado 2. DEF BiquadraticSurface (ControlPoints::IsMatOf:IsPoint) = TensorProdSurface:< Basis, Basis >:ControlPoints WHERE Basis = < u2, u1, u0 >, u2 = (k:2 * uu) - (K:3 * u) + K:1, u1 = (k:4 * u) - (k:4 * uu), u0 = (k:2 * uu) - u, uu = u * u, u = s1 END; DEF Mapping = BiquadraticSurface:< <<0,0,1>, <1,0,0>,<2,0,1>>, <<0,1,-1>, <1,1,0>,<2,1,2>>, <<0,2,0>, <1,2,1>,<2,2,0>> >; Una superficie bicubica polinomiale è caratterizzata da 16 coefficienti vettoriali, tali che in E3 consentono di avere 48 gradi di libertà. La forma algebrica è data da: . Le forme geometriche sono però più utili, visto il significato esplicito dei gradi di libertà e delle basi polinomiali. Tali basi sono ricavabili a partire da una matrice 4x4 di vincoli vettoriali. La superficie bicubica di Hermite è caratterizzata da 4 curve, di cui 2 sono curve tangenti e 2 sono interpolate: T , che in forma matriciale e tensoriale diventa: . Invece: , cioè è decomposto in quattro sottomatrici corrispondenti alla superficie S, alle sue derivate parziali Su e Sv e alla derivata parziale seconda mista Suv, valutate nei quattro angoli del dominio [0,1]2. DEF HermiteSurface (ControlPoints::IsMatOf:IsPoint) = TensorProdSurface:< HermiteBasis:S1, HermiteBasis:S1 >:ControlPoints; DEF Mapping1 = HermiteSurface: < <<0,0,0>, <1,0,0>, <0,0,1>, <0,0,-1>>, <<0,1,0>, <1,1,0>, <0,0,-1>,<0,0,1>>, <<0,0,1>, <0,0,-1>,<0,0,1>, <0,0,-1>>, <<0,0,-1>,<0,0,1>, <0,0,-1>, <0,0,1>> >; MAP:Mapping1:UVDOMAIN; La bicubica di Bezier è definita come combinazione lineare della base di Bezier di grado 3 con 4 curve di Bezier dello stesso grado, in modo che le due estreme saranno interpolate e quelle centrali approssimate. Se si vuole la bicubica razionale, si usa una base razionale invece che polinomiale. , dove Gbb è la matrice 4x4 che contiene qii. La forma tensoriale: . Per generare superfici di Bezier di grado arbitrario: DEF BezierSurface (ControlPoints::IsMatOf:IsPoint) = TensorProdSurface: < BernsteinBasis:S1:m, BernsteinBasis:S1:n >:ControlPoints WHERE m = LEN:ControlPoints - 1, n = (LEN ~ S1):ControlPoints – 1 END; DEF UVDOMAIN=(INTERVALS:1:16)*(INTERVALS:1:16); DEF points1 = <<0,0,0>,<1,0,1>,<2,0,-1>,<3,0,0>>; DEF points2 = <<0,1,-1>,<1,1,2>,<2,1,-2>,<3,1,1>>; DEF points3 = <<0,2,1>,<1,2,-2>,<2,2,2>,<3,2,-1>>; DEF points4 = <<0,3,0>,<1,3,-1>,<2,3,1>,<3,3,0>>; DEF pointArray = < points1, points2,points3,points4 >; surf = MAP:(BezierSurface:pointArray):UVDOMAIN; “Blending Transfinito” significa interpolazione o approssimazione in spazi funzionali. Mescolando con una base polinomiale delle funzioni univariate si ottiene un mapping bivariato (superficie), mentre mescolando con una base di polinomi alcune funzioni bivariate si ottiene un mapping trivariato, e così via. Il blending transfinito è una forte generalizzazione dei metodi parametrici standard, così che si può estendere alle superfici la generazione di curve cubiche standard di Hermite, dove sono interpolati due punti e si hanno 2 tangenti estreme. Il blending transfinito è semplice e flessibile: non è necessario che tutte le geometrie componenti abbiano lo stesso grado e neppure che tutte siano state generate con la stessa funzione (si possono usare funzioni di Bezier in blending con funzioni di Hermite o di Lagrange). Si noti che la funzione “Bezier” può essere usata per mescolare punti ottenendo funzioni generatrici di curve, per mescolare curve ottenendo funzioni generatrici di superfici e così via: una regola generale dice di usare il selettore s1 se la funzione deve riportare una mappa uni variata (per generare curve), s2 per una mappa bivariata, s3 per quella trivariata e così via. Così a partire da quattro curve di Bezier di grado arbitrario si può produrre un mapping bivariato: DEF UDOMAIN =(INTERVALS:1:16); DEF UVDOMAIN=UDOMAIN*UDOMAIN; DEF c1 = Bezier:S1: <<0,0,0>,<10,0,0>>; DEF c2 = Bezier:S1: <<0,2,0>,<8,3,0>,<9,2,0>>; DEF c3 = Bezier:S1: <<0,4,1>,<7,5,-1>,<8,5,1>,<12,4,0>>; DEF c4 = Bezier:S1: <<0,6,0>,<9,6,3>,<10,6,-1>>; DEF surf = BEZIER:S2:<c1,c2,c3,c4>; MAP:surf:UVDOMAIN; Analogamente si può definire la cubica transfinita di Hermite a partire dalle curve di Bezier: DEF surf = Hermite:s2:<c1,c2,c3,c4>; Le superfici di Coons interpolano Quattro curve di bordo esse. Le curve di bordo possono essere ad esempio curve usando funzioni lineari di mescola, quali: . Se le quattro curve di bordo sono: S(u,0) S(u,1) S(0,v) superficie è: La normale a tale superficie vale: con punti estremi comuni a coppie di di Bezier. L’interpolazione è ottenuta S(1,v), l’espressione vettoriale di tale = dove Su e Sv sono le derivate parziali. DEF CoonsPatch (Su0,Su1,S0v,S1v::IsSeqOf:IsFun) = (vectSum ~ AA:scalarVectProd): <<a0u,S0v>,<a1u,S1v>,<a0v,Su0>,<a1v,Su1>,<-~a0v,b0u>,<-~a1v,b1u>> WHERE b0u = (vectSum ~ AA:scalarVectProd):<<a0u,S_00>,<a1u,S_10>>, b1u = (vectSum ~ AA:scalarVectProd):<<a0u,S_01>,<a1u,S_11>>, 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 ru0 = BezierCurve:<<0,0,0>,<10,0,0>>(AA:COMP ~DISTR)[S1]; def ru1 = BezierCurve:<<0,10,0>,<2.5,10,3>,<5,10,-3>,<7.5,10,3>, <10,10,0>> (AA:COMP ~DISTR) [S1]; Def r0v = BezierCurve:<<0,0,0>,<0,0,3>,<0,10,3>,<0,10,0>> (AA:COMP ~DISTR) [S2]; Def r1v = BezierCurve:<<10,0,0>,<10,5,3>,<10,10,0>> (AA:COMP ~DISTR) [S2]; def Domain2D (n,m::IsIntPos) = Intervals:1:n * Intervals:1:m; MAP:(CoonsPatch:<ru0,ru1,r0v,r1v>):(Domain2D:<12,12>);