Ci sono diversi modi per realizzare ciò che stai vedendo, a seconda di come ti piacerebbe che si comportasse. Spiegherò alcuni dei metodi più semplici per modificare una curva di Bezier tramite la manipolazione di punti sulla curva.
La prima cosa da fare è capire il valore del parametro (t) in cui l'utente ha fatto clic sulla curva. Questa sarà generalmente un'approssimazione. Se stai facendo il rendering pixel o subpixel di Bezier, quindi registra per ogni pixel quale fosse il valore t e usalo. Se stai tassellando in segmenti di linea, guarda quale segmento di linea è più vicino, trova i valori t dei due punti finali e assegna il valore t in base alla distanza lungo la linea.
Una volta ottenuto il valore t, è possibile inserirlo nell'equazione della curva di Bezier. Ci si ritroverà con qualcosa della forma:
P = k0*P0 + k1*P1 + k2*P2 + k3*P3
dove P è il punto sulla curva, P0, P1, P2, e P3 sono i punti di controllo di ingresso, e k0, k1, k2, k3 e sono costanti per una data t. Chiamerò i "contributi" dei valori k, o più specificamente i contributi dei punti di controllo al punto della curva P (t). Una bella proprietà da ricordare è che k0 + k1 + k2 + k3 = 1.
Quindi, supponiamo di avere un vettore V = P '- P, dove P' è la nuova posizione e P è la posizione originale. Abbiamo bisogno di spostare alcuni dei punti di controllo per ottenere P 'dove deve andare, ma abbiamo una certa flessibilità su quale dei punti di controllo vogliamo spostare. È possibile utilizzare qualsiasi punto con un contributo diverso da zero o una combinazione.
Diciamo che l'utente fa clic sulla curva su t = 0. In questo caso, solo k0 è diverso da zero, quindi
P0 := P0 + V
produrrà il risultato corretto. Questo può anche essere scritto come
P0 := P0 + k0 * V
Nel caso generale in cui tutti i contributi sono diverso da zero, è possibile applicare la stessa trasformazione a ciascuno dei punti, che avrà l'effetto di una molto liscia, spread-out deformazione.
Un'altra opzione è spostare semplicemente il punto di controllo con il contributo massimo dell'intera distanza. Credo che l'equazione da usare sarebbe qualcosa di simile
Pmax := Pmax + 1/kmax * V
ma in entrambi i casi si riduce a guardare i contributi a un dato valore t, e spostando i punti di controllo in modo che il nuovo punto sta nella posizione desiderata.
Questo approccio è abbastanza generale e funziona per NURBS e molte altre spline, anche superfici. C'è un altro metodo abbastanza comune che usa Greville Abscissae, che attira più punti possibili, ma nella mia esperienza è troppo facile ottenere l'oscillazione.
Dovrei menzionare che con i bezier il più vicino possibile ottenere i punti di controllo corrispondenti è creare una stringa di curve a 3 punti. il punto finale di ciascuna curva è uguale al punto iniziale della curva successiva. Quindi, i due punti centrali di entrambi i lati dei punti di unione di due curve devono essere impostati in modo speculare attorno al punto di unione, forzando un raccordo uniforme tra di loro. Tuttavia, le curve non passeranno mai attraverso i punti medi. –