HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Ulteriori considerazioni sull’interpolazione tra curve  (Letto 2386 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
La difficoltà nell’affrontare l’interpolazione tra curve, rispetto quella tra punti, risiede nel fatto che, aumentando la dimensione, entrano in gioco più fattori contemporaneamente. Come accade per il cervello delle mosche, che se vengono minacciate da due posizioni differenti vanno in tilt, alzandosi verticalmente e finendo poi schiacciate, così accade per il cervello umano, che se non riesce a suddividere i problemi composti in parti semplici, da affrontare singolarmente, non è in grado di ricavare soluzioni.
Pertanto, nonostante il problema sia simmetrico tra le curve che consideriamo convenzionalmente frontali: fm=AB,gm=CD e quelle che assumiamo come laterali: fn=AC,gn=BD, proviamo a dare ad esse significati differenti.
Le due curve fm, frontale anteriore, e gm, frontale posteriore, le assumiamo come direttrici, cioè come una sorta di binari su cui fare scorrere la curva laterale generatrice di sinistra: fn, che nello scorrere da A verso B cambia di forma fino a trasformarsi nella curva del bordo destro gn.  I binari sono collegati tra loro da traversine, secondo la formula: rf=fm*(1-j/n)+gm*j/n. Questo raccordo rf tra curve frontali è funzione di j e di i, la parte dipendente da i riguarda le componenti fm(i) e gm(i).  Il raccordo non è necessariamente lineare, potendo essere sostituito da una formula tipo Bézier di grado a piacere. La funzione rf0, nel solo parametro j, corrisponde alla sezione del raccordo di sinistra, avendo prefissato il valore dell’altro parametro i=0:
rf0= fm(0)*(1-j/n)+gm(0)*j/n.
Analogamente il limite di destra del raccordo è:
rfm=fm(m)*(1-j/n)+gm(m)*j/n.
La curva generatrice gn sormonta i binari, pertanto occorre considerare solo la parte che li sovrasta:
dfn=fn - rf0.
Analogamente succede per la generatrice di destra:
dgn=gn – rfm.
Tali generatrici laterali vengono a loro volta raccordate in modo lineare o secondo formule tipo Bézier.
Nel caso lineare si ha:
rl=dfn*(1-i/m)+dgn*i/m.
La superficie avrà allora equazione:
OP=rf+rl
Da rilevare che la funzione da 2D a 3D: rl(i,j) deve annullare tutti i termini per j=0 e j=n, altrimenti va a sovrapporsi alle curve frontali. Questo senz’altro accade se rl è lineare e collega due nodi con tutti i valori nulli, come in questo caso.

Nel caso lineare la formula corrisponde a:
tm=i/n
tn=j/n
OP=fm*(1-tn)+gm*tn + (fn-(fm(0)*(1-tn)+gm(0)*tn))*(1-tm)+(gn-(fm(m)*(1-tn)+gm(m)*tn))*tm
Da notare che la parte rl contiene in sé la formulazione rf, applicata per i=0 e i=m.
Se vogliamo variare la forma intervenendo lungo una sezione frontale, occorre operare su rl.
Volendo introdurre tangenti che creano un culmine o un avvallamento si scriverà:
rl=dfn*(1-i/m)^3+3*(dfn+tfn)*(1-i/m)^2*i/m+3*(dgn+tgn)*(1-i/m)^2*i/m+dgn*(i/m)^3
Le funzioni tfn,tgn dipendono da j.

In modo analogo, volendo introdurre oltre le tangenti, un vincolo per il passaggio della superficie, al fine di deformarla, si può applicare la formula con l’interpolazione.
La proiezione su x è data da:
dnx= !dnx(j), dnx(0)=dnx(m)=0
t=m1/m
tm=i/m
j1=dfnx*(1-t)^4+4*(1-t)^3*t*(dfnx+tfnx)+4*(1-t)*t^3*(dgnx+tgnx)+dgnx*t^4
qx=(dnx-j1)/(t^2*(1-t)^2)
rlx=dfnx*(1-tm)^4+4*(1-tm)^3*tm*(dfnx+tfnx)+tm^2*(1-tm)^2*qx+4*(1-tm)*tm^3*(dgnx+tgnx)+dgnx*tm^4
Con m1 che corrisponde alla sezione trasversale, ove si considera la curva di attraversamento.

In questo caso la funzione dn=(dnx,dny,dnz) non rappresenta l’equazione parametrica in j di una curva spaziale, perché va riferita alle “traversine” di collegamento, quindi deve azzerarsi per j=0 e per j=n.Il suo valore massimo, positivo o negativo, alzerà o abbasserà la superficie al centro.  Pertanto, corrispondendo alla traversa i=m1, il suo valore spaziale è fornito da:
in= dn + rfm1
dove:  rfm1= fm(m1)*(1-j/n)+gm(m1)*j/n
questo se i raccordi trasversali sono lineari.
Viceversa se è nota la curva spaziale intermedia in=(inx,iny,inz), si ricava dn da:
dn= in - rfm1
con proiezione su x:
dnx=inx- fmx(m1)*(1-j/n)-gmx(m1)*j/n   dove inx è funzione 3D di j.
Naturalmente dovrà risultare:
inx(0)= fmx(m1)  e  inx(n)= gmx(m1).

C’è  da considerare che le funzioni tangenti lungo i bordi laterali sono sottoposte a un vincolo. Concretamente la superficie è costituita da due fasci di curve: un fascio con direzione frontale composto di n+1 curve e uno laterale composto di m+1 curve. La prima curva di raccordo tra le due curve laterali coincide con la linea fmx prefissata e lo stesso vale per l’ultima, corrispondente a j=n+1, che coincide con gmx. Pertanto su tali curve con possono essere introdotti nuovi parametri, quali le tangenti. Pertanto le funzioni tangenti devono annullarsi sui nodi, ovverossia per j=0 e per j=n,


Nell’insieme, infine, abbiamo l’espressione:

t=m1/m
tm=i/m

fmx=      !equazione in i curva frontale anteriore: fmx(0)=ax, fmx(m)=bx
gmx=     !equazione in i curva frontale posteriore: gmx(0)=cx, gmx(m)=dx
fnx=       !equazione in j curva laterale sinistra: fnx(0)=ax, fnx(n)=cx
gnx=      !equazione in j curva laterale destra: gnx(0)=bx, gnx(n)=dx
inx=        !equazione in j curva trasversale mediana: inx(0)= fmx(m1), inx(n)= gmx(m1)
tfnx=      ! tfn=tfn(j),equazione tangenti sul bordo AC,deve annullarsi in A:j=0 e in C:j=n
tgnx=     ! tgn=tgn(j),equazione tangenti sul bordo BD,deve annullarsi in B:j=0  e in D:j=n

rfx=fmx*(1-j/n)+gmx*j/n
dfnx=fnx - (ax*(1-j/n)+cx*j/n)
dgnx=gnx - (bx*(1-j/n)+dx*j/n)
dnx=inx - (fm1x*(1-j/n)+gm1x*j/n)
j1=dfnx*(1-t)^4+4*(1-t)^3*t*(dfnx+tfnx)+4*(1-t)*t^3*(dgnx+tgnx)+dgnx*t^4
qx=(dnx-j1)/(t^2*(1-t)^2)
rlx=dfnx*(1-tm)^4+4*(1-tm)^3*tm*(dfnx+tfnx)+tm^2*(1-tm)^2*qx+4*(1-tm)*tm^3*(dgnx+tgnx)+dgnx*tm^4
x=rfx+rlx

Per introdurre invece tangenti sui bordi frontali, o inserire una curva mediana longitudinale, si deve operare sulla parte ri, ricordando che poi occorre applicare la stessa formula per i=0 e i=m entro la componente denotata con rl, rappresentativa del raccordo tra curve laterali.

Riconsideriamo ancora l’ultima formula con curva interna longitudinale in(j) e tangenti di Bézier sui bordi laterali.  Proviamo ad applicare una curva di Bézier di ordine 3 alle traverse, dopo aver definito le due funzioni relative in i: tfm su AB e tgm su CD, le quali devono assumere valori nulli sui poli e sui nodi della curva intermedia in , non potendo influenzare tali curve predefinite.  I termini che dobbiamo variare sono rf, dfn, dgn,dn.
Qui dovremo sostituire la formula lineare con quella del grado 3.

t=m1/m
tm=i/m
tn=j/n

fmx=  !equazione in i curva frontale anteriore: fmx(0)=ax, fmx(m)=bx
gmx=  !equazione in i curva frontale posteriore: gmx(0)=cx, gmx(m)=dx
fnx=  !equazione in j curva laterale sinistra: fnx(0)=ax, fnx(n)=cx
gnx= !equazione in j curva laterale destra: gnx(0)=bx, gnx(n)=dx
inx= !equazione in j curva trasversale mediana: inx(0)= fmx(m1), inx(n)= gmx(m1),

tfnx=         ! tfn=tfn(j),equazione tangenti sul bordo AC; deve annullarsi per j=0, j=n
tgnx=        ! tgn=tgn(j),equazione tangenti sul bordo BD; deve annullarsi per j=0, j=n
tfmx=       ! tfm=tfm(i),equazione tangenti sul bordo AB; deve annullarsi per i=0, i=m1, i=m
tgmx=      ! tgm=tgm(i),equazione tangenti sul bordo CD; deve annullarsi per i=0, i=m1, i=m

rfx=      fmx*(1-tn)^3+  (fmx+tfmx)*(1-tn)^2*tn+  (gmx+tgmx)^2*(1-tn)*tn +gmx*tn^3
dfnx=fnx -(ax*(1-tn)^3+    (ax+tax)*(1-tn)^2*tn+    (cx+tcx)^2*(1-tn)*tn  +cx*tn^3)
dgnx=gnx -(bx*(1-tn)^3+    (bx+tbx)*(1-tn)^2*tn+    (dx+tdx)^2*(1-tn)*tn  +dx*tn^3)
dnx=inx-(fm1x*(1-tn)^3+(fm1x+tfm1x)*(1-tn)^2*tn+(gm1x+tgm1x)^2*(1-tn)*tn+gm1x*tn^3)
j1=dfnx*(1-t)^4+4*(1-t)^3*t*(dfnx+tfnx)+4*(1-t)*t^3*(dgnx+tgnx)+dgnx*t^4
qx=(dnx-j1)/(t^2*(1-t)^2)
rlx=dfnx*(1-tm)^4+4*(1-tm)^3*tm*(dfnx+tfnx)+tm^2*(1-tm)^2*qx+4*(1-tm)*tm^3*(dgnx+tgnx)+dgnx*tm^4
x=rfx+rlx

La formula diventa sempre più complessa, mentre aumentano i parametri funzionali da definire.
Per semplificare la formula, in luogo di curve tipo Bèzier con tangenti definite agli estremi, si può utilizzare l’interpolazione semplice,senza tangenti. Questo metodo permette di inserire fino a 5 curve intermedie, anche se quest’ultimo caso, dovendo risolvere sistemi di 5 equazioni, presenta uno script difficile da gestire, per la sua complessità.
Presento la formula con due curve interne, che corrisponde al grado algebrico 3:

tm=i/m
t1=m1/m
t2=m2/m

a1=(1-t1)^2*t1
a2=(1-t2)^2*t2
b1=(1-t1)*t1^2
b2=(1-t2)*t2^2
dt=a1*b2-b1*a2 !determinante diverso da 0, regola di Cramer

!i termini seguenti vanno copiati e incollati 2 volte,sostituendo rispettivamente y e z ad x:
dfnx= fnx - (ax*(1-j/n) +cx*j/n)
dgnx= gnx - (bx*(1-j/n) +dx*j/n)
dn1x=in1x-(fm1x*(1-j/n)+gm1x*j/n)
dn2x=in2x-(fm2x*(1-j/n)+gm2x*j/n)

cx1=dn1x-dfnx*(1-t1)^3-dgnx*t1^3
cx2=dn2x-dfnx*(1-t2)^3-dgnx*t2^3
d1x=cx1*b2-b1*cx2
d2x=a1*cx2-cx1*a2

gx1=d1x/dt
gx2=d2x/dt

rlx=dfnx*(1-tm)^3+gx1*(1-tm)^2*tm+gx2*(1-tm)*tm^2+dgnx*tm^3
x=fmx*(1-j/n)+gmx*j/n + rlx

Gli esempi allegati hanno curve di contorno algebriche, costruite sfruttando sia la forma che fornisce direttamente le radici di una parabola di ordine pari al numero di fattori:
(x-x1)*…*(x-xn)
sia una sorta di generalizzazione delle curve di Bézier:
x=xi *(1-t)^a+n1*(1-t)^c*t^d+ …   +xf*t^b
Una curva algebrica definita nel modo suddetto, con i membri interni con potenze non nulle,  attraversa sempre xi per t=0 e xf per t=1.

Da rilevare che la superficie costruita con interpolazione lineare, cioè di grado 1°, non contiene alcuna curva interna. Ogni volta che si aggiunge una curva intermedia, l’equazione di interpolazione cresce di un grado. In questi esempi si è utilizzata l’interpolazione senza definizione delle tangenti agli estremi, altrimenti l’equazione cresce ancora di un  grado.