Yo recuerdo que lo hice en una ocasión y resultó bastante sencillo; una regla de tres para cada eje y listo.
Si yo también hice eso al principio, pero así no pude conseguir toda la precisión que quería. Ademas, por lo menos en mi touch screen, los valores de X que tomas en las dos esquinas inferiores varían ligeramente de los dos que tomas en las esquinas superiores, así que la formula para transformar las coordenadas tenia que ser algo mas compleja que una regla de tres.
Leyendo el PDF de TI he visto que dan la formula matricial para calcular los coeficientes de compensación para todos los puntos que queramos. Ademas, para mas de 3 puntos, las soluciones a esas ecuaciones matriciales se hacen largas y difíciles de manejar, así que dan una solución equivalente pero bien ordenada para que sea sencilla de manejar.
Os lo copio aquí para quien lo pueda necesitar:
Convert Touch to LCD
X = alpha_x * Xp + beta_x * Yp + deltaX;
Y = alpha_y * Xp + beta_y * Yp + deltaY;
Donde:
Xp e Yp son los valores medidos del touch screen.
X e Y son los pixels correspondiente en el LCD.
alpha_x, beta_x y deltaX son los coeficientes de compensacion para el eje X. Estas se obtienen durante la calibración.
alpha_y, beta_y y deltaY son los coeficientes de compensacion para el eje Y. Estas se obtienen durante la calibración.
Calibrate Touch for n points
alpha_x = delta_x1 / delta;
betha_x = delta_x2 / delta;
deltaX = delta_x3 / delta;
alpha_y = delta_y1 / delta;
betha_y = delta_y2 / delta;
deltaY = delta_y3 / delta;
delta = n*(a*b - c*c) + 2*c*d*e - a*e*e - b*d*d;
delta_x1 = n*(X1*b - X2*c) + e*(X2*d - X1*e) + X3*(c*e - b*d);
delta_x2 = n*(X2*a - X1*c) + d*(X1*e - X2*d) + X3*(c*d - a*e);
delta_x3 = X3*(a*b - c*c) + X1*(c*e - b*d) + X2*(c*d - a*e);
delta_y1 = n*(Y1*b - Y2*c) + e*(Y2*d - Y1*e) + Y3*(c*e - b*d);
delta_y2 = n*(Y2*a - Y1*c) + d*(Y1*e - Y2*d) + Y3*(c*d - a*e);
delta_y3 = Y3*(a*b - c*c) + Y1*(c*e - b*d) + Y2*(c*d - a*e);
a = sum( Xp[k]*Xp[k], k, 0, n-1 );
b = sum( Yp[k]*Yp[k], k, 0, n-1 );
c = sum( Xp[k]*Yp[k], k, 0, n-1 );
d = sum( Xp[k], k, 0, n-1 );
e = sum( Yp[k], k, 0, n-1 );
X1 = sum( Xp[k]*X[k], k, 0, n-1 );
X2 = sum( Yp[k]*X[k], k, 0, n-1 );
X3 = sum( X[k], k, 0, n-1 );
Y1 = sum( Xp[k]*Y[k], k, 0, n-1 );
Y2 = sum( Yp[k]*Y[k], k, 0, n-1 );
Y3 = sum( Y[k], k, 0, n-1 );
Donde
Xp[N] e Yp[N] son los N valores medidos del touch screen.
X[N] e Y[N] son los N pixels correspondiente en el LCD.
sum( f, v, s, e ) es el sumatorio de f[v] desde v=s hasta v=e
Tambien hay otro PDF de analog.com con informacion similar aqui:
http://www.analog.com/static/imported-files/application_notes/AN-1021.pdfSaludos
Modificado un pequeño error en las variables delta_x1 y delta_y1.