Skip to content
Permalink
d09d2cdc00
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
88 lines (76 sloc) 2.24 KB
/*
* tslib/tests/ts_calibrate_common.c
*
* Copyright (C) 2001 Russell King.
*
* This file is placed under the GPL. Please see the file
* COPYING for more details.
*
* SPDX-License-Identifier: GPL-2.0+
*
*
* common functions for calibration
*/
#include <stdio.h>
#include "ts_calibrate.h"
int perform_calibration(calibration *cal)
{
int j;
float n, x, y, x2, y2, xy, z, zx, zy;
float det, a, b, c, e, f, i;
float scaling = 65536.0;
/* Get sums for matrix */
n = x = y = x2 = y2 = xy = 0;
for (j = 0; j < 5; j++) {
n += 1.0;
x += (float)cal->x[j];
y += (float)cal->y[j];
x2 += (float)(cal->x[j]*cal->x[j]);
y2 += (float)(cal->y[j]*cal->y[j]);
xy += (float)(cal->x[j]*cal->y[j]);
}
/* Get determinant of matrix -- check if determinant is too small */
det = n*(x2*y2 - xy*xy) + x*(xy*y - x*y2) + y*(x*xy - y*x2);
if (det < 0.1 && det > -0.1) {
printf("ts_calibrate: determinant is too small -- %f\n", det);
return 0;
}
/* Get elements of inverse matrix */
a = (x2*y2 - xy*xy)/det;
b = (xy*y - x*y2)/det;
c = (x*xy - y*x2)/det;
e = (n*y2 - y*y)/det;
f = (x*y - n*xy)/det;
i = (n*x2 - x*x)/det;
/* Get sums for x calibration */
z = zx = zy = 0;
for (j = 0; j < 5; j++) {
z += (float)cal->xfb[j];
zx += (float)(cal->xfb[j]*cal->x[j]);
zy += (float)(cal->xfb[j]*cal->y[j]);
}
/* Now multiply out to get the calibration for framebuffer x coord */
cal->a[0] = (int)((a*z + b*zx + c*zy)*(scaling));
cal->a[1] = (int)((b*z + e*zx + f*zy)*(scaling));
cal->a[2] = (int)((c*z + f*zx + i*zy)*(scaling));
printf("%f %f %f\n", (a*z + b*zx + c*zy),
(b*z + e*zx + f*zy),
(c*z + f*zx + i*zy));
/* Get sums for y calibration */
z = zx = zy = 0;
for (j = 0; j < 5; j++) {
z += (float)cal->yfb[j];
zx += (float)(cal->yfb[j]*cal->x[j]);
zy += (float)(cal->yfb[j]*cal->y[j]);
}
/* Now multiply out to get the calibration for framebuffer y coord */
cal->a[3] = (int)((a*z + b*zx + c*zy)*(scaling));
cal->a[4] = (int)((b*z + e*zx + f*zy)*(scaling));
cal->a[5] = (int)((c*z + f*zx + i*zy)*(scaling));
printf("%f %f %f\n", (a*z + b*zx + c*zy),
(b*z + e*zx + f*zy),
(c*z + f*zx + i*zy));
/* If we got here, we're OK, so assign scaling to a[6] and return */
cal->a[6] = (int)scaling;
return 1;
}