2010-02-23 16 views
6

Capirai cosa intendo se usi programmi di editing grafico come Gimp o Photoshop. Per modificare una curva su quei programmi (che probabilmente è la curva di Bezier), possiamo cliccare sulla curva, trascinare il mouse e la curva viene modificata di conseguenza. Sospetto che tutte le cose dietro questo meccanismo riguardino i vettori, ma non sono riuscito a trovare alcun documento che menzionasse come farlo. Qualcuno potrebbe dirmi come posso farlo? Grazie mille.Trascina una curva di Bezier per modificarla

[modifica] Quello che intendevo era selezionare la curva per cambiarla (modificarla) (fare clic sulla curva e trascinare la curva per modificarla). Nel solito modo, selezioniamo i punti di controllo per cambiare la curva. So di cambiare la curva, ho bisogno di modificare i punti di controllo, ma come posso interpretare una modifica di una curva in una modifica in una modifica ai punti di controllo?

risposta

0

Il trascinamento cambia semplicemente i punti di controllo della curva di Bezier e la curva viene ricalcolata di conseguenza. Vedi Wikipedia per una buona spiegazione su come funzionano.

0

Si prega di chiarire cosa si desidera fare? Vuoi modificare le curve di Bezier in un'applicazione? Ti interessa la matematica generale che c'è dietro?

Normalmente si manipolano i punti di controllo utilizzati per generare la curva di Bezier.

1

EDIT - In risposta alla tua domanda di modifica

Al fine di essere in grado di selezionare la curva stessa per spostare i punti di controllo, vorrei suggerire che le curve di Bezier, non sono sicuramente la strada da seguire - si avrebbe risolvere l'equazione al contrario per trovare le giuste posizioni dei punti di controllo. Scoprirai anche che in alcuni casi non è possibile spostare i punti di controllo per far andare la curva dove vuoi.

Se si utilizza B-Spline, è possibile semplicemente inserire un nuovo punto di controllo nel punto della curva più vicino al punto in cui l'utente ha fatto clic e quindi spostare il nuovo punto di controllo. Quindi, in modo efficace, dovresti aggiungere un nuovo punto di controllo.

Testo originale

Supponendo che si dispone già di un'implementazione di una curva di Bezier, che, dato un insieme di punti di controllo (in genere tre per Bezier, ma può essere come molti come si desidera) in grado di produrre un insieme di punti da unire con le linee sul dispositivo di visualizzazione (in genere si utilizza l'equazione parametrica 0 >= u <= 1), quindi questo è facile.

I punti di controllo determinano dove va la curva, quindi è sufficiente implementare il feedback di selezione e trascinare/rilasciare su quei punti di controllo.

Se stai cercando la corrispondenza esatta dei punti, tuttavia, le curve di Bézier non sono l'ideale dato che passano solo attraverso il primo e l'ultimo punto di controllo. E più punti aggiungi alla curva, meno diventano precisi.

B-Spline sarebbe meglio, e le variazioni di questi sono ciò che si vede in Photoshop et al.

+0

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. –

0

OK, quindi supponiamo di dover usare le curve di Bezier perché stai usando una libreria di rendering che le ha come primitive.Se sei assolutamente sposato all'idea di utilizzare i punti di controllo sulla curva stessa, puoi semplicemente interpolare i punti di controllo usando il metodo descritto qui: How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# - AKA Cubic Bezier 4-point Interpolation

In altre parole, per ogni set di 4 punti sulla curva, tu avrebbe eseguito l'algoritmo sopra e ottenere i 4 punti di controllo necessari per disegnare il cubo Bezier.

3

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.

0

Vedi github.com/bootchk/freehandTool per modelli di oggetti

un utente trascina. Proiettare il trascinamento sul punto di controllo o braccio più vicino tra i punti di controllo. Interpretare la resistenza come rotazione e/o traduzione (trasformazione) di detti punti di controllo più vicini.Nota plurale: i più vicini possono essere i punti di controllo coincidenti (estremità) di due segmenti o punti di controllo del braccio del segmento più bezier.