Appliquer une distorsion à la surface de Bézier


8

J'essaie de simuler l'effet de déformation d'image utilisé dans Adobe Photoshop.

L'image rectangulaire est déformée selon une surface cubique de Bézier (en 2D, toutes les composantes Z sont à 0). Ayant n'importe quelle surface de Bézier, une distorsion verticale peut lui être appliquée.d[0,1]

Gauche : surface de Bézier d'entrée, , Droite : surface de sortie, d=0d=0.8

entrez la description de l'image ici entrez la description de l'image ici

Avez-vous une idée de ce qui se fait sur la surface de Bézier (16 points) lors de la conversion de la version de gauche à la sortie de droite?

Réponses:


5

Modifier: a changé la réponse en fonction des nouvelles images et des clarifications.

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

kest l'index de ligne et nl'index de colonne du point de contrôle. lest le facteur d'élévation et est égal à {-1, -1/3, 1/3, 1}. p(k)est le centre de la kème rangée.

Raisonnement:

À partir des nouvelles images, des lignes rouges et bleues sont tracées du centre de la ligne (p (k) qui est essentiellement (k, 0)) jusqu'à ce point. Sur la première ligne, tous les points de contrôle, y compris ceux du graphique (lignes rouges) sont déplacés vers le même point sur cette ligne. p (k, n) - p (k) donne le vecteur qui déplace un point de p (k) à p (k, n) qui devrait maintenant être appliqué dans l'autre sens, en déplaçant le point à l'emplacement souhaité. Sur vos graphiques, d = 1 pour que tous les premiers points de ligne soient déplacés vers le centre. Vous pouvez facilement résoudre l'équation pour le vérifier. d * l(0)est -1, ce serait donc -p(k, n) + p(k) + p(k, n)ce qui donnerait p (k).

Sur la deuxième ligne, votre ligne bleue est à nouveau du point au centre, mais cette fois elle s'est arrêtée avant de l'atteindre. Je ne peux pas dire si elle est vraiment coupée de 1/3 mais ce serait un bon point de départ. La même formule s'applique donc toujours. l est -1/3 d est 1, donc le point serait déplacé sur 1/3 du chemin. 3e est le même que le second mais il se déplace maintenant vers l'extérieur, donc l est 1/3.

Sur la ligne finale, tous les points de contrôle sont déplacés du point central de cette ligne. C'est assez clair puisque vos lignes se rencontrent à ce centre.

Le seul problème que cette formule peut avoir est l'hypothèse de 1/3, à part que je ne vois pas la raison pour laquelle elle devrait échouer.

Remarque: J'ai utilisé ligne, colonne lors de l'indexation, donc si vous utilisez x, y, vous devez changer leur emplacement.


Il préserve les lignes verticales, c'est vrai. Mais je travaille avec la surface de Bézier (16 points dans un plan) et je pense que cela doit être faisable simplement en déplaçant ces 16 points, sans calculer les points sur les courbes de Bézier etc. Ici vous pouvez voir comment fonctionne la surface de Bézier: philipandrews.org/ sandbox / BezierSurface / bin / BezierSurface.swf
Ivan Kuckir

Je pense que j'ai trouvé une solution à ce problème si j'ai bien compris. Vous demandez comment déformer la surface de Bézier A en surface de Bézier B ou C en D avec un paramètre d égal à 0,8, est-ce correct?
Cem Kalyoncu

Eh bien, il semble que ce ne soit pas la formule exacte, mais assez proche. J'y réfléchirai un peu plus. La formule est correcte au moins pour les points sur la courbe.
Cem Kalyoncu

Vous vous rapprochez :) Mais pour le deuxième exemple, la coordonnée Y change aussi. Comme je l'ai mentionné, tous les points se déplacent le long des lignes, il suffit donc de trouver la nouvelle position pour d = 1 pour chaque point, puis je peux interpoler linéairement.
Ivan Kuckir

J'ai ajouté une autre photo, cela peut vous aider.
Ivan Kuckir
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.