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