Un saluto a tutti.
Mi sono spesso chiesto se esista un metodo semplice, grafico, per mettere in continuità G2 due curve.
In sostanza, un metodo che richieda soltanto Rhino e una calcolatrice.
Sono partito da un minimo di trattazione analitica.
Chi non fosse interessato può passare direttamente alla sezione “Applicazione pratica”.
TRATTAZIONE ANALITICA:
Prendiamo per semplicità curve di Bezier di grado tre:
B(t)=(1-t)^3P_0+3(1-t)^2tP_1+3(1-t)t^2P_2+t^3P_3
La curvatura è data da:
k= \frac{|(x'(t)y''(t)-y'(t)x''(t)|} {(x'(t)^2 + y'(t)^2)^\frac{3}{2}}
Le derivate prime e seconde della Bezier, calcolate per t=0 sono:
B'(0)=3(P_1-P_0)
B''(0)=6(P_2-2P_1+P0)=6h
Vedremo dopo il perché del vettore h
Al numeratore della formula della curvatura abbiamo in sostanza il modulo del prodotto vettoriale
| B'(0) \times B''(0) | = |3(P1-P0) \times 6h| = 18|(P1-P0) \times h|
Al denominatore:
|B'(0)^3| = 27 |(P1-P0)|^3
Quindi k(0) = \frac{2}{3} \frac{|(P1-P0) \times h|}{||(P1-P0)||^3}
Per avere la stessa continuità basta quindi uguagliare la formula della curvatura per le due curve.
Da qui in poi possiamo - sotto le ipotesi iniziali fatte - usare la curvatura a meno di costanti.
Cosa rappresenta il vettore h?
Dovrebbe fornire in maniera discreta “l’accelerazione” della curva nel punto iniziale.
Possiamo ovviamente scomporlo nelle sue componenti ortogonale e parallela alla retta tangente.
Ma:
|(P1-P0)| \times h_\parallel =0
Da cui:
k(0) = \frac{2}{3} \frac{||(P1-P0)|| \times |h|}{||(P1-P0)||^3} = \frac{2}{3} \frac{ |h_\perp|}{||(P1-P0)||^2}
In sostanza è solo la componente ortogonale che ci dà la curvatura, quella parallela è arbitraria.
Quindi non c’è una soluzione unica, piuttosto abbiamo un luogo delle soluzioni che è una retta.
Siamo pertanto alla ricerca della condizione per cui:
\frac{|h_{s\perp}|}{||S_1-S_0||^2} = \frac{|h_{p\perp}|}{||P_1-P_0||^2}
APPLICAZIONE PRATICA
Ma dopo queste considerazioni, come possiamo procedere “graficamente”?
Allego il file di esempio “Studio G2”.
Consideriamo due curve, quella verde (P) a sinistra e quella rossa a destra (S), in continuità di tangenza (G1).
Poniamoci nel caso in cui la tangente comune sia orizzontale, se così non fosse basta ruotare il tutto.
La curva rossa è quella che voglio modificare, spostando il punto di controllo S2 in modo da avere la continuità di curvatura.
Basta misurare con Rhino i valori che servono per comporre la formula.
Misuro la distanza tra i primi due punti di controllo
Misuro (S_1 – S_0)
Misuro (P_1 – P_0)
Faccio il rapporto, lo elevo al quadrato e moltiplico per h_\perp della curva che voglio usare come riferimento: per quanto detto è la distanza di P2 dalla tangente.
Cosa ottengo?
Di quanto il corrispondente punto di controllo S2 va spostato, sempre in direzione ortogonale rispetto alla tangente (nel nostro caso verticalmente).
Studio G2.3dm (103,3 KB)
CONSIDERAZIONI FINALI
-
Muovendo il terzo CV sulla parallela alla tangente, nel nostro caso una retta orizzontale, la continuità rimane G2.
Questo conferma - oltre l’esperienza - la trattazione analitica: è solo la componente ortogonale a dare la curvatura e quindi siamo in presenza di un luogo di punti che forniscono la soluzione. -
Potrebbe sembrare una semplificazione il fatto che abbia usato delle Bezier.
E’ semplice verificare che il ragionamento vale anche per curve più “generiche” come delle Basis Spline. -
E se le due curve non avessero lo stesso grado?
Questo è più interessante.
Di sicuro i coefficienti che compaiono nelle derivate vanno considerati, non possiamo più semplificare usando la curvatura a meno di costanti.
Ad esempio, per una curva di grado tre da “adattare” ad una curva di grado cinque mi aspetto un coefficiente \frac{(n-1)}{n}, quindi \frac{4}{5} per la curva di grado cinque e \frac{2}{3} per la curva di grado tre.
Alla fine, il valore calcolato prima, andrà moltiplicato per \frac{2}{3} \cdot \frac{5}{4} = \frac{5}{6} -
E se lavorassimo con delle Nurbs, intese come funzioni razionali?
C’è ovviamente una complicazione aggiuntiva nel calcolo delle derivate, ma concettualmente il discorso è lo stesso.
Se i pesi dei primi tre punti di controllo sono identici non cambia nulla rispetto a quanto detto prima.
Se invece i pesi sono differenti vale lo stesso ragionamento ma occorre capire come “misurare” le distanze che, mi aspetto, siano filtrate dal peso dei CV.
La distanza tra i primi due CV diventa \frac{||w_1P_1 – w_0P_0)||}{|w_1-w_0|}.
La distanza h diventa h=\frac{w_2h}{|w2-w1|}
Potremmo, alternativamente, lavorare con le coordinate omogenee.
Avremmo il vantaggio di portarci dietro direttamente i pesi dei punti di controllo, basta poi riconvertire in coordinate cartesiane. -
Ho sottoposto il ragionamento ad un caro amico che, giustamente, mi ha fatto notare che manca la trattazione del caso in cui le curve si sviluppino in 3d e non semplicemente nel piano.
Anche qui non cambia nulla nel ragionamento, ovviamente andranno utilizzate le norme e il prodotto vettoriale in 3d.
All’atto pratico dovremo semplicemente misurare le distanze h_\perp nel piano passante per la tangente e il punto di riferimento.
Anche in questo caso, la continuità G2 è mantenuta, a patto di muovere il punto di controllo sulla retta del piano che abbia la distanza calcolata dalla retta tangente.
Allego il file “Studio G2 caso tridimensionale”.
Studio G2 caso tridimensionale.3dm (126,6 KB)