Continuità G2

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”. :blush:

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. :blush:
    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)

8 Mi Piace

… roba da ingegneri :rofl: :rofl: :rofl:

1 Mi Piace

Ciao Fabio
Esatto, nel caso 3d non cambia nulla perché basta fare un cambio di base usando i primi 3 punti di controllo: p0 origine p1 direzione asse x e p2 per definire il piano.

Bella spiegazione. Hai provato anche con livelli superiori di continuità?

3 Mi Piace

Al momento no, ma l’ho messo in lista, ovviamente! :anxious_face_with_sweat:
Appena trovo un attimo di calma provo a valutare G3.
Credo sia sufficiente uguagliare la derivata prima della curvatura (jerk).
Avevo pensato anche alla torsione, ma ho concluso che non serve per la continuità geometrica.
… e nemmeno per quella parametrica.
Forse ci si avvicinerebbe, ma non basta, servirebbe proprio una parametrizzazione regolare. :thinking:
E poi, C3 per la modellazione non ci interessa granché.

3 Mi Piace

Bella Fabietto!
Un gran bel post in generale. Sai quanto personalmente apprezzo l’argomento.
Nello specifico (G2), essendo richiesto stesso centro per il raggio che rappresenta la curvatura nel punto di connessione, ne deriva (banalizzo geometricamente) che i tre CV finali, che per ogni curva intervengono nella continuità G2, devono giacere sullo stesso piano. Diversamente potremmo avere stesso raggio ma centri non coincidenti (piani passanti per i rispettivi tre punti, diversi).

Altra nota: il comando BlendCrv rappresenta quello che dici. La direzione consentita al terzo Cv è lungo una retta parallela alla tangente.

3 Mi Piace

Grazie a tutti per l’apprezzamento. :heart_eyes:

Ne approfitto per due piccoli wish “legati” alla questione:

  1. _GCon si ferma a G2, perché?
  2. _EndBulge idem … l’algoritmo fino a G4 è già implementato nel BlendCrv :thinking:

Magari mi sfugge qualcosa, ma mi sembrano due rinunce gratuite.

In effetti nella guida si parla di G3 e G4 ma di fatto si ferma a G2.