Applica distorsione alla superficie di Bézier


8

Sto cercando di simulare l'effetto di curvatura dell'immagine, che viene utilizzato in Adobe Photoshop.

L'immagine rettangolare è deformata secondo una superficie cubica di Bézier (in 2D, tutti i componenti Z sono 0). Avere qualsiasi superficie di Bézier, distorsione verticale d[0,1] può essere applicato ad esso.

Sinistra : input superficie bézier,d=0, Destra : superficie di uscita, d=0.8

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Hai idea di cosa viene fatto sulla superficie di Bézier (16 punti) durante la conversione dalla versione a sinistra all'output a destra?

Risposte:


5

Modifica: ha cambiato la risposta in base a nuove immagini e chiarimenti.

for every control point p(k, n)
   p'(k, n) = ( p(k, n) - p(k) ) * d * l(k) + p(k, n)

dove kè l'indice di riga ed nè l'indice di colonna del punto di controllo. lè il fattore di elevazione ed è uguale a {-1, -1/3, 1/3, 1}. p(k)è il centro della k'th fila.

Fondamento logico:

Dalle nuove immagini, le linee rosse e blu sono disegnate dal centro della linea (p (k) che è sostanzialmente (k, 0)) a quel punto. Sulla prima riga, tutti i punti di controllo, compresi quelli sul grafico (linee rosse) vengono spostati nello stesso punto su quella linea. p (k, n) - p (k) fornisce il vettore che sposta un punto da p (k) a p (k, n) che ora dovrebbe essere applicato nell'altro modo, spostando il punto nella posizione desiderata. Sui tuoi grafici, d = 1 in modo che tutti i punti della prima linea vengano spostati al centro. Puoi facilmente risolvere l'equazione per verificarlo. d * l(0)è -1, quindi sarebbe -p(k, n) + p(k) + p(k, n)quale darebbe p (k).

Sulla seconda linea, la linea blu è di nuovo da un punto al centro, ma questa volta si è fermata prima di raggiungerla. Non so dire se sia davvero tagliato da 1/3 ma sarebbe un buon punto di partenza. Quindi si applica ancora la stessa formula. 1 è -1/3 d è 1, quindi il punto verrebbe spostato di 1/3 del modo. Il terzo è uguale al secondo ma ora si sposta verso l'esterno, quindi 1 è 1/3.

Nell'ultima riga, tutti i punti di controllo vengono spostati dal punto centrale di quella linea. Questo è abbastanza chiaro poiché le tue linee si incontrano in quel centro.

L'unico problema che questa formula può avere è l'assunzione di 1/3, a parte questo non vedo il motivo per cui dovrebbe fallire.

Nota: ho usato riga, colonna durante l'indicizzazione, quindi se stai usando x, y dovresti cambiare la loro posizione.


Conserva le linee verticali, è vero. Ma sto lavorando con la superficie di Bézier (16 punti in un piano) e credo che debba essere fattibile semplicemente spostando questi 16 punti, senza calcolare i punti sulle curve di Bézier ecc. Qui puoi vedere come funziona la superficie di Bézier: philipandrews.org/ sandbox / BezierSurface / bin / BezierSurface.swf
Ivan Kuckir

Penso di aver trovato la soluzione a questo problema se ho capito che è corretto. Stai chiedendo come deformare la superficie di Bezier A in quella di Bezier B o da C a D con il parametro d che è 0,8, è corretto?
Cem Kalyoncu,

Beh, sembra che non sia la formula esatta ma abbastanza vicina. Ci penserò un po 'di più. La formula è corretta almeno per i punti sulla curva.
Cem Kalyoncu,

Ti stai avvicinando :) Ma per il secondo esempio, cambia anche la coordinata Y. Come ho già detto, tutti i punti si muovono lungo le linee, quindi è sufficiente trovare la nuova posizione per d = 1 per ciascun punto, quindi posso interpolare linearmente.
Ivan Kuckir,

Ho aggiunto un'altra foto, potrebbe aiutarti.
Ivan Kuckir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.