Curve di Bézier

Ciao Emilio
Ti rispondo al volo. La risposta la trovi sopra nell’esempio di elevazione del grado. Parti dall’arco standard, bezier razionale grado due, e fai la stessa cosa. Nulla di complesso. Ma fai attenzione che devi fare l’operazione rispetto al poligono dei punti di controllo 4 dimensionale:

{ wi * Pxi; wi * Pyi;wi * Pzi; wi}

Ovviamente si può fare anche l’operazione inversa … :sunglasses:

1 Mi Piace

Mi risulta difficile. :sweat_smile:

Questo thread è interessantissimo!

Quando hai un attimo ce lo spieghi?

Con le curve razionali bisogna fare due passaggi in più.

La bezier grado 2 è definita in forma estesa

(B0 * P0 * w0 + B1 * P1 * w1 + B2 * P2 * w2) /(B0 * w0 + B1 * w1 + B2 * w2)

Per fare le operazioni sopra si opera con i punti nello spazio 4d moltiplicando
i punti di controllo per i rispettivi pesi e aggiungendo il peso come quarta coordinata.
Il primo punto avrà coordinate:
{P0x * w0; P0y * w0; P0z * w0; w}
Analogamente per gli altri punti di controllo.

Ad esempio operando un degree elevation da grado due a grado 3 il
risultato sarà del tipo:
{(Q0x,Q0y;Q0z;r0);(Q1x,Q1y;Q1z;r1);(Q2x,Q2y;Q2z;r2);(Q3x,Q3y;Q3z;r3)}

I nuovi punti di controllo sono: {(Q0/r0);(Q0/r1);(Q0/r2);(Q0/r3)}
e i nuovi pesi: {r0 ; r1 ; r2 ; r3}

4 Mi Piace

Ciao,… ho una domanda: ma sull’arco di terzo grado, il raggio è costante?
Mi sembra impossibile :roll_eyes:

OK, grazie Sergio !

Da una rapida occhiata non mi sembra che GH preveda punti 4D …
Ma in RhinoCommon c’e’ la Structure Point4d.
Provo poi a vedere … :slight_smile:

Per @RiccardoMajewski :
Se non sbaglio le coordinate di cui parla Sergio sono chiamate ‘coordinate omogenee’ ( ‘homogeneous coordinates’ ), nel caso volessi cercare informazioni :slight_smile: .
(Dovrebbero anche essere spiegate nei testi sulle Nurbs … )
Poi credo siano anche usate nelle trasformazioni con le matrici 4X4, ma con un significato diverso.
… Sempre se non prendo cantonate … :confused:

2 Mi Piace

Ciao Sergio, grazie innanzitutto per queste chicche! :heart_eyes:

Quindi se ho capito si passa dalle coordinate euclidee a quelle omogenee rappresentando il punto Pi con una quarta e nuova componente uguale ad 1.
Si moltiplica per il peso Wi (moltiplicando per uno scalare non si dovrebbe modificare la posizione del punto, almeno mi pare).
Tornando indietro alle tre dimensioni ci si ritrova con la forma razionale.
Estendendo il discorso, con tutta la confusione che ho in testa, potremmo allora vedere una Nurbs come la proiezione di un Spline in uno spazio quadrimensionale? :thinking:

Si Fabio. Ma senza rompersi la testa basta considerare una curva nel piano X Y
e considerare la curva nel piano z=1.

Li gestisci all’interno degli script … e li converti in uscita.

Si’, OK, ma cercavo qualcosa di piu’ visibile (nella definizione) di uno script tipo black-box. :wink:
Poi ho anche pensato che sarebbero comunque difficili e complicati sia la visualizzazione che l’input dei CV in 4D.
… Quindi credo che sia meglio provare, almeno all’inizio, con una curva piana (in fondo parliamo di archi di cerchio),
in modo di avere la Z a disposizione sia per l’input del peso (se si preferisce partire da un control polygon invece che da una curva razionale) che per lavorare in coordinate omogenee in modo ‘visibile’ …
Ma devo provare … Se ne tiro fuori qualcosa, mi rifaccio vivo. :neutral_face:

3 Mi Piace

Ciao

Qui c’e’ il mio tentativo.
Lavora su curve 2D nel piano XY.

Ammesso che funzioni …

Si puo’ scegliere l’input da una curva razionale (credo anche non razionale …)
oppure da una polilinea che funge da control polygon … taroccato, nel senso che X e Y rappresentano X e Y, ma la Z rappresenta il peso dei vari CV.
Vedi l’input selector per settare l’input da utilizzare.

La definizione serve ad aumentare il grado della curva di 1

Il risultato e’ la nuova curva, ma solo se il grado e’ minore di 12

Per ogni valore del grado c’e’ comunque anche come output una polilinea di visualizzazione e una polilinea control polygon X,Y,W

Se partiamo da un arco di grado 2, la definizione costruisce la curva di grado 3.
Per costruire curve di grado maggiore bisogna cuocere la curva risultante (o il control polygon X,Y,W)
e utilizzarla come nuovo input per la definizione …
In pratica dobbiamo aumentare il grado di 1 ogni volta. :confused:
( Non saprei come fare diversamente, a meno di ridurre la definizione a uno script,
mi fermo qui e lascio proseguire gli esperti di GH :slight_smile: )

sergio-4.gh (23,3 KB)

Lo script serve solo a ricavare una polilinea dalle curve, per poter vedere anche quelle con grado > 11:

import Rhino

def step( cv, uu ):
    cv2 = []
    for ix in range( len( cv ) - 1 ):
        cv2.append( cv[ ix ] * ( 1.0 - uu ) + cv[ ix + 1 ] * uu )
    return cv2
    
def pt( cv, uu ):
    if len( cv ) == 1:
        return cv[ 0 ]
    return pt( step( cv, uu ), uu )
    
if cv:
    du = 1.0 / ( pc - 1 )
    pts = []
    for ix in range( pc ):
        pts.append( pt( cv, du * ix ) )
    a = pts

EDIT

La prima linea dello script

import Rhino

non serve … l’ho dimenticata quando ho modificato il vecchio script.
Si puo’ eliminare.

EDIT 2

Ho dimenticato di specificare che funziona solo su curve di Bezier … sorry.

3 Mi Piace

e scatta la ola…

1 Mi Piace

Chissa’ se fa in tempo ad uscire GH2 ?
:confused: :wink: :grinning_face_with_smiling_eyes:

Citofonare David :rofl:

Eh, senza offesa per nessuno dei due …
Ma tra David e il mio amico Sergio direi che e’ una bella lotta …
:wink: :grinning_face_with_smiling_eyes:

David chi? :roll_eyes: (quella volta tanto che sto in silenzio…). Boh!

Rutten? (non il verso che fai quando bevi birre a piombo…).

2 Mi Piace

David Rutten [McNeel Wiki]

1 Mi Piace

Ahhhhhhhhh, non so chi sia… Boh, cose vostre… :wink:

“Rutten” sta per rutto in tedesco, giusto? :rofl: :rofl:

Siete pazzi :stuck_out_tongue_winking_eye::joy: senza offesa…

Preferisco fare la magistrale che leggere il thread :rofl::rofl: