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>);