2010-07-17 4 views
2

Je fais une application de dessin vectoriel et j'ai remarqué que l'Anti Grain Geometry avait un exemple qui fait exactement ce que je veux. http://www.antigrain.com/demo/index.html puis ci-dessous il y a un exemple sur la perspective pour Win32. Je ne comprends pas leur fichier cpp. Basé sur cet exemple. Si j'ai un groupe de verticies pour former un objet, comme leur lion, et puis j'ai 4 verticies comme points de contrôle, comment pourrais-je obtenir leur effet? Ex, quelle transformation est-ce que j'applique à chaque point?Transformations en perspective et Bilinear

Merci

Répondre

1

A partir de cette page que vous avez affichée, il y a un lien vers le code source . Je vais vous expliquer la transformation bilinéaire en

http://www.antigrain.com/__code/include/agg_trans_bilinear.h.html

L'idée ici est de trouver une transformation de la forme:

output_x = a * input_x + b * input_x * input_y + c * input_y + d 
output_y = e * input_x + f * input_x * input_y + g * input_y + h 

Le terme « bilinéaire » vient de chacun de ces équations étant linéaire l'une des coordonnées d'entrée par eux-mêmes. Nous voulons résoudre pour les bonnes valeurs de a, b, c et d. Dites que vous avez la référence rectangle r1, r2, r3, r4 que vous souhaitez mapper à (0,0), (1,0), (0,1), (1,1) (ou un système de coordonnées d'image).

a, b, c, d:

0 = a * r1_x + b * r1_x * r1_y + c * r1_y + d 
1 = a * r2_x + b * r2_x * r2_y + c * r2_y + d 
0 = a * r3_x + b * r3_x * r3_y + c * r3_y + d 
1 = a * r4_x + b * r4_x * r4_y + c * r4_y + d 

Pour e, f, g, h:

0 = e * r1_x + f * r1_x * r1_y + g * r1_y + h 
0 = e * r2_x + f * r2_x * r2_y + g * r2_y + h 
1 = e * r3_x + f * r3_x * r3_y + g * r3_y + h 
1 = e * r4_x + f * r4_x * r4_y + g * r4_y + h 

Vous pouvez résoudre ce comme bon vous semble le mieux.(Si vous connaissez la notation matricielle , il s'agit de deux équations matricielles pour lesquelles la matrice est la même, puis vous devez simplement trouver la décomposition LU une fois et résoudre les deux vecteurs inconnus). Les coefficients sont ensuite appliqués pour mapper l'intérieur du rectangle à la position dans le rectangle .

Si par hasard vous cherchez l'inverse transform, qui est, si vous voulez savoir où un pixel donné atterrira, vous passez simplement entrées et sorties:

a, b, c, d:

r1_x = a * 0 + b * 0 * 0 + c * 0 + d 
r2_x = a * 1 + b * 1 * 0 + c * 0 + d 
r3_x = a * 0 + b * 0 * 1 + c * 1 + d 
r4_x = a * 1 + b * 1 * 1 + c * 1 + d 

Pour e, f, g, h:

r1_y = e * 0 + f * 0 * 0 + g * 0 + h 
r2_y = e * 1 + f * 1 * 0 + g * 0 + h 
r3_y = e * 0 + f * 0 * 1 + g * 1 + h 
r4_y = e * 0 + f * 0 * 1 + g * 1 + h 
1

Vous parlez de la transformation en perspective de plan 2D sur un carré « dans l'espace » Je pense.

Bien - Celui-ci n'est pas si difficile. Les mathématiques sont expliqués dans le document:

Heckbert, Paul, Fondements de Texture Mapping et l'image gauchissement, thèse de maîtrise, UCB/CSD 89/516, CS Division, U.C. Berkeley, Juin 1989.

(je ne liez pas sur le papier pour des raisons de droits d'auteur. Il est disponible sur le net et vous ne devriez pas avoir de mal à la trouver si)

Cela vous donne la maths et quelques équations prêtes à l'emploi pour le faire.

Si vous recherchez un peu « facile à déchirer » code, je suggère de télécharger la mise en œuvre de référence OpenVG et regarder de près les fonctions « vguComputeWarpQuadToSquare », « vguComputeWarpSquareToQuad » et « vguComputeWarpQuadToQuad » :-) Ils couvrent tout ce que vous avoir besoin.

Télécharger ici: http://www.khronos.org/registry/vg/ri/openvg-1.1-ri.zip

Ces fonctions calculent une matrice 3x3 qui fait la transformation. Pour utiliser cette matrice, vous devez étendre vos coordonnées 2D en coordonnées 2D homogènes. Ce n'est pas que difficile mais au-delà de la portée de la question. Si vous avez besoin d'aide pour travailler avec eux, je vous suggère de poser cette question dans une autre question.

Questions connexes