HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: interpolazione tra curve per generare superfici  (Letto 2581 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
interpolazione tra curve per generare superfici
« il: 04 Agosto 2013, 12:14 »
Nel post intitolato: lo strumento COONS presento una formula:
OP= Fn(j)+(Gn(j)-Fn(j))*i/m+Fm(i)+(Gm(i)-Fm(i))*j/n-(A+(B-A)*i/m+(C+(D-C)*i/m-(A+(B-A)*i/m)*j/n)
=Fn(j)+Fm(i)-A+(Gn(j)-Fn(j)-B-A)*i/m+(Gm(j)-Fm(j)-C-A)*j/n+(C-D+B-A)*i/m*j/n  (1)
Tale formula può essere riscritta, ponendo i/m=tm e j/n=tn, nel modo seguente:
OP=Fn(j)*(1-tm)+Gn(j)*tm + Fm(i)*(1-tn)+Gm(i)*tn-(A*(1-tm)+B*tm+(C*(1-tm)+D*tm-(A*(1-tm)+B*tm)*tn)
OP=Fn(j)*(1-tm)+Gn(j)*tm + Fm(i)*(1-tn)+Gm(i)*tn - ((A*(1-tm)+B*tm)*(1-tn)+(C*(1-tm)+D*tm)*tn)
Espressa in tal modo, la formula presenta espressioni analoghe alla curva di Bézier del primo ordine.
Introducendo due nuove curve hn(j),hm(i), che definiscono le tangenti sui bordi, intesi come successioni di nodi,  si ha una nuova formula, dove i raccordi tra le curve gemelle sono costituiti da archi di Bézier del secondo ordine, cioè parabole:
Cj=Fn(j)*(1-tm)^2+2*Hn(j)*(1-tm)*tm+Gn(j)*tm^2
Ci=Fm(i)*(1-tn)^2+2*Hm(i)*(1-tn)*tn+Gm(i)*tn^2
OP=Cj+Ci-((A*(1-tm)^2+2*Hn(j)*(1-tm)*tm+B*tm^2)*(1-tn)+2*Hm(j)*(1-tn)*tn+(C*(1-tm)^2+2*Hm(i)*(1-tm)*tm+D*tm^2)*tn)   

Proiettando ad esempio sull’ asse x si ha:

jx=fnx*(1-tm)^2+2*hnx*(1-tm)*tm+gnx*tm^2
ix=fmx*(1-tn)^2+2*hmx*(1-tn)*tn+gmx*tn^2
x=jx+ix-((ax*(1-tm)^2+2*hnx*(1-tm)*tm+bx*tm^2)*(1-tn)^2+2*hmx*(1-tn)*tn+(cx*(1-tm)^2+2*hnx*(1-tm)*tm+dx*tm^2)*tn^2)

Dato che per i=0 o i=m o j=0 o j=n si annullano i termini in Gn,Gm, si riottengono i valori della formula (1), cioè sui bordi si mantengono le curve fm,gm,fn,gn.

Tale formula di grado 2, lungo x, si può riscrivere:
jx=fnx*(1-tm)^2+gnx*tm^2
ix=fmx*(1-tn)^2+gmx*tn^2
tjx=2*hnx*(1-tm)*tm
tix=2*hmx*(1-tn)*tn
x=jx+tjx+ix+tix-((ax*(1-tm)^2+tjx+bx*tm^2)*(1-tn)^2+tix+(cx*(1-tm)^2+tjx+dx*tm^2)*tn^2)

Notiamo che questa formula, seppure funzioni, contiene una parte che non risulta simmetrica rispetto i termini tix, tjx:
-((ax*(1-tm)^2+tjx+bx*tm^2)*(1-tn)^2+tix+(cx*(1-tm)^2+tjx+dx*tm^2)*tn^2)
 In effetti uno dei due valori relativi alle tangenti hn,hm, di conseguenza, non produce effetti rilevanti sulla distorsione.  Per renderla simmetrica rispetto tali termini aggiungiamo una componente, dimezzando quella esistente:
!COONS grado 2
jx=fnx*(1-tm)^2+gnx*tm^2
ix=fmx*(1-tn)^2+gmx*tn^2
tjx=2*hnx*(1-tm)*tm
tix=2*hmx*(1-tn)*tn
xtj=((ax*(1-tm)^2+tjx+bx*tm^2)*(1-tn)^2+tix+(cx*(1-tm)^2+tjx+dx*tm^2)*tn^2)/2
xti=((ax*(1-tn)^2+tix+cx*tn^2)*(1-tm)^2+tjx+(bx*(1-tn)^2+tix+dx*tn^2)*tm^2)/2
x=jx+tjx+ix+tix-xtj-xti

Le curve hn e hm definiscono il punto di incontro delle tangenti spiccate da ciascun nodo corrispondente tra le curve appaiate: ad esempio Hm(i) è il punto di incontro delle tangenti ai punti dei bordi Gm(i) e Fm(i), con i intero prefissato tra 0 e m.

La superficie potrebbe essere ulteriormente complicata utilizzando per i raccordi curve di Bézier di grado superiore a 2, oppure utilizzando curve interpolate.

Per costruire superfici con raccordi dati da curve di Bézier di grado superiore a 2, si può generalizzare la formula.
In analogia alla formula di grado 2, l’equazione della superficie può essere, ad esempio, riscritta  al grado 3, con funzioni tangenti separate per ognuna delle quattro curve di confine: tfm(i),tgm(i), tfn(j),tgn(j).
Ad esempio la proiezione lungo x ha la forma:
!COONS grado 3
jx=fnx*(1-tm)^3+gnx*tm^3               
tjx=3*tfnx*(1-tm)^2*tm+3*tgnx*(1-tm)*tm^2
ix=fmx*(1-tn)^3+gmx*tn^3
tix=3*tfmx*(1-tn)^2*tn+3*tgmx*(1-tn)*tn^2
xti=((ax*(1-tn)^3+tix+cx*tn^3)*(1-tm)^3+tjx+(bx*(1-tn)^3+tix+dx*tn^3)*tm^3)/2
xtj=((ax*(1-tm)^3+tjx+bx*tm^3)*(1-tn)^3+tix+(cx*(1-tm)^3+tjx+dx*tm^3)*tn^3)/2
x= jx+tjx+ix+tix -xtj-xti

A questo punto sarebbe utile riuscire a costruire una superficie che attraversa, oltre i bordi, una linea intermedia. Solitamente i programmi 3D permettono di farlo in maniera intuitiva spostando i nodi di una data superficie.  Ho provato ad applicare le formule per curve interpolate, ma il risultato non è soddisfacente.
Esempio: COONS di grado 4 definita da una linea intermedia fgm compresa tra fm,gm e una linea fgn compresa tra fn,gn:
t=t1
jx=fnx*(1-tm)^4+gnx*tm^4
dd=fnx*(1-t)^4+4*t*(1-t)^3*(fnx+tfnx)+4*t^3*(1-t)*(gnx+tgnx)+gnx*t^4
qq=(fgnx-dd)/(t^2*(1-t)^2)
tjx=4*tfnx*(1-tm)^3*tm+qq*(1-tm)^2*tm^2+4*tgnx*(1-tm)*tm^3
! fnx, gnx, tfnx, tgnx, fgnx funzioni di j da 0 a n

t=t2
ix=fmx*(1-tn)^4+gmx*tn^4
dd=fmx*(1-t)^4+4*t*(1-t)^3*(fmx+tfmx)+4*t^3*(1-t)*(gmx+tgmx)+gmx*t^4
qq=(fgmx-dd)/(t^2*(1-t)^2)
tix=4*tfmx*(1-tn)^3*tn+qq*(1-tn)^2*tn^2+4*tgmx*(1-tn)*tn^3
! fmx, gmx, tfmx, tgmx, fgmx funzioni di i da 0 a m

tn=j/n
tm=i/m
xti=((ax*(1-tn)^4+tix+cx*tn^4)*(1-tm)^4+tjx+(bx*(1-tn)^4+tix+dx*tn^4)*tm^4)/2
xtj=((ax*(1-tm)^4+tjx+bx*tm^4)*(1-tn)^4+tix+(cx*(1-tm)^4+tjx+dx*tm^4)*tn^4)/2
x= jx+tjx+ix+tix -xtj-xti

La suddetta formula, pur funzionando, non è molto pratica. Infatti, a differenza del caso analogo 2D, ovvero della curva definita da estremi con tangenti e punto medio, qui le curve interne, che pure contribuiscono a costruire la superficie, non vengono attraversate da questa, perché le equazioni relative si sommano tra loro, oltre ad essere ulteriormente modificate dalla parte che impone il passaggio per i nodi esterni, dando luogo a risultati inaspettati.

Questa formula è stata applicata al seguente oggetto:
coons_Béz_4°
L’oggetto è costruito con curve simmetriche rispetto il piano verticale per AD: lungo il contorno, costruito con curve su piani verticali, le linee fm=AB e fn=AC sono archi di Bèzier del terzo ordine che approssimano il semicerchio, mentre gm=CD e gn=BD sono parabole di Bèzier che pure approssimano il semicerchio. Le curve interne, orizzontali, si toccano lungo il piano di simmetria per AB, formando una curva chiusa, sono pure archi di Bèzier del terzo ordine che,insieme, approssimano il cerchio. Se la forma ha il centro su O ne deriva una superficie con piano di simmetria x=y, ma se gli offset interni ox e oy assumono valori diversi tra loro, si perde la simmetria: questo perché le curve interne interagiscono, oltre che con il contorno, con i valori dei nodi A,B,C,D.  La superficie inoltre cambia forma variando i parametri delle curve interne l,h, ma in generale non le attraversa mai.

Un  modo per costruire una superficie che attraversa una curva data, potrebbe essere quello di spezzarla in due parti, utilizzando la formula per COONS tipo Beziér grado 2, che è esposta in questo capitolo. In tal modo, operando sulle tangenti, è possibile raccordare le parti. Tuttavia, dal punto di vista operativo, la cosa diventa piuttosto complessa.  Un esempio di  applicazione di questo metodo, che può comunque dare risultati interessanti in forme simmetriche, potendo gestire in modo indipendente metà della forma, si trova nell’oggetto:
COONS\ coons_Béz_1°2.
Concretamente occorre costruire una metà della forma e poi rifletterla, invertendo il senso della variabile, Così facendo raddoppia però il numero di vertici e occorre tenerne conto nello script.