Nurbs curve

ahahahah allora molto meglio le mie domande incasinate
tanto in italia la politica è un caso sicuramente irrecuperabile
che arrivati a questo punto non so se piangere o ridere :joy: :joy:

4 Mi Piace

ragazzi non ho mai avuto 4 preferenze in un messaggio
mica mi state consigliando di buttarmi in politica
voi dite che avrò migliori risultati ahahahah

Salvio… adesso mi stai facendo preoccupare… :sweat_smile:

Lucio, per la serie “è meglio che mi do all’ippica” ahahahah

tranquillo non sono proprio il tipo e non mi è mai interesato
poi non credo proprio di poterci riuscire, lungi da me.

Ma no, basta avere uno slogan apprezzato tipo “più pilu per tutti!” :joy:

1 Mi Piace

Ciao a tutti

cerco di dare un contributo per fare chiarezza sulla continuità interna delle curve.
Essendo una nurbs composta da bezier concentro l’attenzione proprio sulle bezier.
Anche una bezier di grado superiore ad 1 può non essere derivabile in un punto.

Costruite una curva di grado 3 con punti di controllo alle coordinate:
0,0; 2,1; 0,1; 2,0

In mezzeria la curva ha continuità C0.

E’ vero che le nurbs sono funzioni polimoniali, ma dobbiamo ricordare di aggiungere
sempre il termine “parametriche”.

Nella matematica comune associamo alla funzione polimoniale la forma del tipo:

y=ax^3+bx^2+cx+d

e la derivata della funzione è:

dy/dx = 3ax^2+2bx + c

e così a seguire per le derivate di ordine superiore.

La bezier (grado 3) è ben altra cosa:

x(t) = P0X (1-t)^3+P1X3t(1-t)^2+P2X3t^2*(1-t)+P3Xt^3
y(t) = P0Y (1-t)^3+P1Y3
t*(1-t)^2+P2Y3t^2*(1-t)+P3Y*t^3

e la derivata prima è:

dx/dt = 3*[ (P1X-P0X) (1-t)^2+(P2X - P1X)2t(1-t)+(P3X - P2X)t^2]
dy/dt = 3
[ (P1Y-P0Y) (1-t)^2+(P2Y - P1Y)2t(1-t)+(P3Y - P2Y)*t^2]

Per calcolare la derivata della curva basta calcolare:

dy/dx = (dy(t)/dt) / (dx(t)/dt)

Vediamo la curva di grado 3 indicata. La sua espressione matematica è la seguente:

x(t) = 0 * 1 * (1-t)^3 + 2 * 3 * t * (1-t)^2 + 0 * 3 * t ^2 * (1-t) + 2 * 1 * t^3
y(t) = 0 * 1 * (1-t)^3 + 1 * 3 * t * (1-t)^2 + 1 * 3 * t ^2 * (1-t) + 0 * 1 * t^3

con t {0;1}

La sua derivata è

dx(t) = 3 * [ 1 * (2-0) (1-t)^2 + (0-2) * 2 * t * (1-t) + (2-0) * t^2 ]
dy(t) = 3 * [ 1 * (1-0) (1-t)^2 + (1-1) * 2 * t * (1-t) + (0-1) * t^2 ]

per t= 0.5 risulta

dx(t) = 0
dy(t) = 0

Quindi

dy/dx = 0 / 0 !!!

Ciò vuol dire che si è presenza di un punto angoloso.

Le formule possono sembrare complesse ma sono molto semplici da calcolare.
Spero, almeno per chi ha ancora ricordo dei concetti matematici trattati, di aver dato
un contributo in più.

Sergio

4 Mi Piace

Sergio mi hai fatto venire il freddo addosso :+1:

Annotazione 2020-08-05 120347

dovrebbe essere questa la curva da ottenere dai punti elencati giusto?

data per buona la curva sopra citata da ottenere,
il punto angoloso di cui parli sarebbe quello in foto?

Grazie, Sergio !

Ottimo contributo. :slight_smile:

Si Salvio. Attiva il il grafico di curvatura.

Scusa Sergio

Sbaglio o qui il ‘3’ prima del ‘t^3’ finale dovrebbe essere un ‘1’ ?
E l’ ‘1’ nel terzo termine della seconda equazione invece e’ un ‘3’ ?

2 Mi Piace

Si Emilio. Correggo. :+1:

1 Mi Piace

Ciao Sergio, bella!!! :heart_eyes:
Questo thread è davvero… intrigante.

Certo te le vai a cercare, stai diventando peggio di Emilio. :rofl:
Però come discorso generale non fa una piega.

Per semplicità la forma esplicita la curva di Bezier è:

B(t) = P0*(1-t)^3 + P13t(1-t)^2 + P23t^2(1-t) +P3*t^3

Derivando:

B’(t) = 3(P1-P0)(1-t)^2 + 6t(1-t)(P2-P1) + 3t^2(P3-P2)

Con la scelta dei punti fatta appare il punto angoloso … o dovremmo dire una cuspide? :thinking:

Aggiungo solo una postilla: la continuità che “utilizziamo” in Rhino è quella geometrica, che non è la stessa cosa di quella parametrica.
Due curve continue parametricamente saranno in generale continue geometricamente, ma non vale il viceversa.
Per la continuità parametrica (forte), occorre che le due derivate abbiano la stessa direzione e lo stesso modulo.
Per la continuità geometrica (debole), occorre che le due derivate abbiano la stessa direzione ma non necessariamente lo stesso modulo.
La continuità geometrica è, notoriamente per i Rhinofili, indicata con la lettera Gi, quella parametrica con la lettera Ci.

Sottoscrivo :slight_smile:

Hmmm …
E se nella curva di Sergio azzero le Y ?
Nel punto medio cosa c’e’ ?
Geometricamente sembra continua, ma la derivata dy/dx e’ sempre 0/0.
O detto in un altro modo, il vettore dP/dt e’ sempre 0,0 (o 0,0,0 in 3D).

Non so perché ma mi viene in mente il vaso di Pandora! :wink:

Se per azzerare le Y allineiamo i quattro CV della curva sull’asse X, avremo che che P0=P2 e P1=P3.
Se non faccio errori:
dX(t) = 4t^2-4t+1 che si azzera per t=1/2
dY(t) = 0 sempre
Ho verificato cosa ne pensa il bestio: si ottiene una curva di grado tre con con i quattro Cv che coincidono, a due a due, negli estremi.
Il vettore dei nodi ha due valori con molteplicità piena, all’inizio e alla fine:
U (deg=3) 0.000 , 0.000 , 0.000 , 6.472 , 6.472 , 6.472
Una maniera originale per disegnare una linea con grado tre senza CV intermedi. :rofl:

Se invece proviamo a tracciare la curva partendo dai nuovi punti, arrivati a P2 (P0) Rhino chiude con una curva di grado 2 che ha un vettore dei nodi così:
U (deg=2) -3.000 , 0.000 , 3.000 , 6.000 , 9.000

Ma facciamo un altro gioco. :blush:
Separiamo la curva di Sergio in due parti con un punto collocato nella singolarità.
Qui il comando Gcon mi dice che le curve sono G2. :thinking: :thinking: :rofl:

Hahaha ! Giusto.

Si’, ha sempre avuto la mania di chiudere le curve quando vuole lui … :roll_eyes:

Hmmm … qui dice: Cannot evaluate curve
… che mi sembra anche giusto … :confused:

Come diceva qualcuno: “mistero misterioso”. :grinning:

“Command: GCon
Curve end difference = 0.000 millimeters
Radius of curvature difference = 0.000 millimeters
Curvature direction difference in degrees = 0.000
Tangent difference in degrees = 0.000
Curves are G2.”

Sicuro che la curva e’ splittata in mezzeria ?

Sì, ho anche verificato che le due parti fossero perfettamente simmetriche.

Edit: ho staccato le due parti per comodità.

"Curve curvature evaluation at parameter 19.1421:
3-D Point: (8, 7.5, 0)
3-D Tangent: (0, 1, 0)
Center of radius of curvature: (8, 7.5, 0)
Radius of curvature: 1.29606e-08
Select point on curve for curvature measurement. Press Enter when done ( MarkCurvature=Yes )
Command: Curvature
Select curve or surface for curvature measurement
Select point on curve for curvature measurement ( MarkCurvature=Yes )

Curve curvature evaluation at parameter 19.1421:
3-D Point: (5, 7.5, 0)
3-D Tangent: (-0, 1, -0)
Center of radius of curvature: (5, 7.5, 0)
Radius of curvature: 1.29606e-08
Select point on curve for curvature measurement. Press Enter when done ( MarkCurvature=Yes )"

Scusa, che comando usi per vedere quei dati ?
Hai ridisegnato la curva ?
Punti e nodi sono diversi da quella di Sergio.
Che CV hai usato ? :slight_smile:

Curvature.

Sì, i valori di Sergio non me li ricordavo, ma il concetto non cambia.

Boh, ho attivato “grid snap” è ho usato i vertici di un rettangolo, non dovrebbe modificare la questione.

Questo con i punti “originali”:

"Curve curvature evaluation at parameter 3.23607:
3-D Point: (1, 0.75, 0)
3-D Tangent: (0, 1, 0)
Center of radius of curvature: (1, 0.75, 0)
Radius of curvature: 1.76064e-10
Select point on curve for curvature measurement. Press Enter when done ( MarkCurvature=Yes )
Command: Curvature
Select curve or surface for curvature measurement
Select point on curve for curvature measurement ( MarkCurvature=Yes )

Curve curvature evaluation at parameter 3.23607:
3-D Point: (1, 0.75, 0)
3-D Tangent: (-0, 1, -0)
Center of radius of curvature: (1, 0.75, 0)
Radius of curvature: 1.76064e-10"
Select point on curve for curvature measurement. Press Enter when done ( MarkCurvature=Yes )