Giorni fa mi sono imbattuto casualmente in un’equazione che mi ha incuriosito e che ho scoperto essere quella di una clotoide.
Si tratta in sostanza di una curva usata (anche) nell’ingegneria “stradale” per effettuare dei raccordi tra vari tratti di strada.
In particolare permette di passare da tratti con curvatura nulla a tratti con curvatura costante, in modo progressivo, evitando discontinuità.
Quando questi criteri sono rispettati, entrando in curva, l’accelerazione laterale aumenta gradualmente e pertanto la manovra è fluida, il veicolo entra in curva in modo naturale, a tutto a vantaggio del confort ma, soprattutto, della sicurezza.
Mi sono chiesto se, in ambiente Rhino, sia possibile disegnare una curva NURBS che presenti un andamento della curvatura il più possibile regolare e, idealmente, lineare.
Preciso subito che non intendo sostituirmi ai i metodi analitici formali per il calcolo della clotoide, né tanto meno pormi in concorrenza con eventuali algoritmi di minimizzazione degli errori o plugin specialistici che, immagino, siano disponibili sul mercato.
Si tratta semplicemente di cercare una metodologia euristica e consapevole per approssimare una spirale di transizione all’interno di un ambiente NURBS, sfruttando le proprietà intrinseche delle curve.
Sono abbastanza convinto che non si possano ricavare i CV di una NURBS come soluzione diretta delle equazioni della clotoide in forma chiusa.
Il motivo non è tanto l’implementazione ma è strutturale, visto che la clotoide è definita da integrali di Fresnel mentre una NURBS è una combinazione polinomiale.
La clotoide è definita rispetto alla lunghezza d’arco s, mentre una NURBS è parametrizzata in funzione di un parametro t.
Inoltre, la curva risultante non interpola il poligono di controllo ma lo “filtra”, introducendo una redistribuzione della curvatura, una sorta di filtro passa-basso spaziale.
Questo implica che una discretizzazione matematicamente rigorosa della clotoide non dovrebbe produrre necessariamente un andamento lineare del grafico di curvatura di Rhino.
Esempio pratico: Ipotizziamo di volere raccordare un tratto di strada rettilineo con un tratto curvilineo distante circa 100 metri con raggio di curvatura di 500 metri.
Anticipo qui i punti di controllo calcolati per chi non fosse interessato alla trattazione matematica.
Allego comunque le curve in formato R6.
P_0=(0,0)
P_1=(20,0)
P_2=(40,0)
P_3 = (59.98, 0.35)
P_4 = (79.99,1.33
P_5=(99.90,3.33)
Trattazione matematica:
Partiamo dalla clotoide.
Dal punto di vista teorico, è descritta da una curvatura lineare rispetto alla lunghezza d’arco \kappa(s) = a \cdot s
Integrando rispetto a s, si ottiene l’angolo della tangente \theta(s) = \frac{a}{2}s^2
Il parametro fondamentale della clotoide è A (vedi dopo).
Possiamo calcolare le coordinate esatte del punto finale e l’angolo della tangente, utilizzando gli integrali di Fresnel, ovvero dovremmo risolvere queste due “bestie grame”:
Trattandosi di integrali di Fresnel, sappiamo già che non esiste una funzione elementare che dia una soluzione esatta con formula chiusa.
Quindi o ci si affida ad algoritmi numerici o ci si affida allo zio Taylor! ![]()
La serie di Taylor ci dice che ogni funzione “morbida” (continua e derivabile) può essere trasformata in un polinomio infinito, cioè una somma di potenze (x, x^2, x^3 \dots), e direi che è il nostro caso.
Per il coseno e il seno, le serie “madri” sono:
Sostituendo u con \frac{t^2}{2A^2} nella serie del coseno dovrebbe risultare una cosa del genere:
L’integrale ora è abbordabile.
Per la X:
Per la Y:
Sostituiamo nella serie del seno: \sin(\frac{t^2}{2A^2}) \approx \frac{t^2}{2A^2}.
Per un raccordo così “morbido” penso bastino (e avanzino) i primi due termini.
Certo che se la clotoide si arrotola su se stessa un po’ di volte penso occorra tirarsi dietro molti più termini, ma qui stiamo parlando di un raccordo autostradale e non un giochetto matematico.
In definitiva, SE&O mi risulta:
Parametro A della clotoide:
Angolo finale (\theta):
Quindi le coordinate target della nostra curva sono:
x \approx 99,90
y \approx 3,33
Ho ipotizzato che una bezier di quito grado possa essere sufficiente.
Per ottenere i punti di controllo per il raccordo con R=500 e s=100, ho seguito una logica a “vincoli a cascata”.
Ho scelto una distribuzione uniforme, un passo pari a 20 unità, per mantenere la parametrizzazione uniforme ed evitare che la curva acceleri bruscamente.
Il punto finale viene gratis: P_5=(99.90,3.33)
Se partiamo dall’origine del piano XY, con tangenza orizzontale, per avere una curvatura nulla occorre che i primi tre CV siano collineari.
Quindi, in maniera altrettanto semplice avremo che:
P_0=(0,0)
P_1=(20,0)
P_2=(40,0)
Per la tangente, sappiamo che l’angolo finale deve essere \theta = 5,73^\circ.
Quindi P_4 deve “tirare” la curva verso quell’angolo.
Lo posizioniamo lungo la retta che passa per P_5 con inclinazione 5,73^\circ.
Ma siccome la distanza |P_5 - P_4|, è regolata dalla stessa logica del passo 20, le coordinate sono presto calcolate:
- x_4 = 99.90 - 20 \cdot \cos(5.73^\circ) \approx 79.99
- y_4 = 3.33 - 20 \cdot \sin(5.73^\circ) \approx 1.33
Il problema si riduce quindi al calcolo del CV P_3
P_3 determina la linearità della curvatura.
Se lo mettiamo troppo alto, la curvatura crescerà troppo presto.
Se lo mettiamo troppo basso, la curva resterà piuttosto piatta e sarà costretta ad accelerare alla fine, cosa che stiamo cercando di evitare.
Ho calcolato la posizione di P_3 affinché l’angolo del segmento P_2-P_3 fosse circa 1/9 dell’angolo finale (secondo la serie dei numeri dispari 1, 3, 5 \dots che governa queste transizioni, vedi dopo), ottenendo:
P_3 = (59.98, 0.35)
Direi che, se vediamo il poligono di controllo come una successione di bracci, la loro rotazione totale deve seguire una progressione quadratica!
Abbiamo infatti visto che, in una clotoide, la curvatura \kappa aumenta linearmente con la lunghezza s.
Ma la curvatura è, per definizione, la rapidità con cui cambia l’angolo della tangente (\kappa = d\theta/ds).
Se la curvatura è lineare (\kappa \propto s),
Allora l’angolo della tangente deve essere quadratico (\theta \propto s^2).
In una curva di Bézier, sappiamo che la direzione della curva “insegue” la direzione dei segmenti del poligono.
Se vogliamo che la tangente della curva cresca col quadrato del tempo, dobbiamo far sì che anche gli angoli dei segmenti del poligono crescano seguendo una logica precisa.
Per ottenere una crescita “clotoidale” in una Bézier di grado 5, i segmenti del poligono non devono ruotare in modo uniforme ovviamente, altrimenti otterremmo un arco di cerchio, una curvatura costante.
Dobbiamo invece usare una progressione che mimi l’integrale del quadrato.
Abbiamo visto che, nella clotoide, l’angolo della tangente cresce con il quadrato della distanza (\theta \propto s^2).
Ma la differenza tra quadrati successivi di numeri interi segue la serie dei dispari:
1^2 - 0^2 = 1
2^2 - 1^2 = 3
3^2 - 2^2 = 5
4^2 - 3^2 = 7
In parole povere, nel costruire il poligono di controllo per la clotoide, dobbiamo “discretizzare” quella crescita quadratica dell’angolo.
Affinché la curva (che è il risultato di una media pesata continua) senta una crescita di curvatura lineare, i “comandi” che diamo tramite i bracci del poligono devono fornire step di rotazione che seguono questa progressione:
Angolo braccio P_0-P_1: 0
Angolo braccio P_1-P_2: 0 (fisso, per azzerare la derivata seconda all’inizio)
Angolo braccio P_2-P_3: \alpha (incremento di 1 unità)
Angolo braccio P_3-P_4: 3\alpha (incremento di 3 unità rispetto all’origine)
Angolo braccio P_4-P_5: 5\alpha (incremento di 5 unità rispetto all’origine
Va evidenziato che, questa proprietà, è esatta solo per “piccoli angoli” perché nella formula reale della curvatura di una Bézier il denominatore è notoriamente (\dot{x}^2 + \dot{y}^2)^{3/2}.
Quando gli angoli diventano grandi, la velocità della curva lungo il parametro t non è più costante, il denominatore inizia a pesare molto e la “magia” dei numeri dispari non basta più: la rampa di curvatura su Rhino inizierebbe a curvarsi (diventando una parabola o peggio).
Riassumendo, la serie dei dispari permette di fare ruotare i segmenti del poligono di controllo seguendo la differenza dei quadrati, così da “ingannare” la curva facendogli credere che sta seguendo una traiettoria a curvatura lineare.
Questa progressione “dolce” è ciò che inganna quindi la matematica della Bézier e la costringe a comportarsi circa come una clotoide.
Il grafico di curvatura dà soddisfazione, è quasi dritto e, con tutte le approssimazioni fatte e - soprattutto - con tutti i limiti del metodo, mi sembra un buon risultato.
Il raccordo, visto da Rhino, risulta essere G2 a meno di un piccolo errore.
Il raggio di curvatura reale è di di 488,36 contro il valore teorico di 500. ![]()
Studio clotoide.3dm (34,6 KB)



