#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/fcntl.h>
struct num
{
int x[5];//固定
int xfb[5]; //变化
int y[5];//固定
int yfb[5];//变化
int a[7];//保存的值
}cal={{50,430,430,50,240},{53,427,432,52,242},{50,50,222,222,136},{48,48,223,223,134},{0}};
int main(void)
{
int cal_fd;
char cal_buffer[256];
unsigned int t;
int j;
float n, x, y, x2, y2, xy, z, zx, zy;
float det, a, b, c, e, f, i;
float scaling = 65536.0;
n = x = y = x2 = y2 = xy = 0;
for(j=0;j<5;j++)
{
n += 1.0;
x += (float)cal.x[j];
printf("cal.x[%d]=%d\n",j,x);
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]);
}
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;
}
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;
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]);
}
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));
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]);
}
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));
cal.a[6] = (int)scaling;
printf ("Calibration constants: ");
for (t = 0; t < 7; t++)
printf("%d ", cal.a[t]);
printf("\n");
cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);
sprintf (cal_buffer,"%d %d %d %d %d %d %d",
cal.a[1], cal.a[2], cal.a[0],
cal.a[4], cal.a[5], cal.a[3], cal.a[6]);
write (cal_fd, cal_buffer, strlen (cal_buffer) + 1);
close (cal_fd);
t = 0;
return 0;
}
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/fcntl.h>
struct num
{
int x[5];//固定
int xfb[5]; //变化
int y[5];//固定
int yfb[5];//变化
int a[7];//保存的值
}cal={{50,430,430,50,240},{53,427,432,52,242},{50,50,222,222,136},{48,48,223,223,134},{0}};
int main(void)
{
int cal_fd;
char cal_buffer[256];
unsigned int t;
int j;
float n, x, y, x2, y2, xy, z, zx, zy;
float det, a, b, c, e, f, i;
float scaling = 65536.0;
n = x = y = x2 = y2 = xy = 0;
for(j=0;j<5;j++)
{
n += 1.0;
x += (float)cal.x[j];
printf("cal.x[%d]=%d\n",j,x);
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]);
}
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;
}
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;
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]);
}
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));
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]);
}
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));
cal.a[6] = (int)scaling;
printf ("Calibration constants: ");
for (t = 0; t < 7; t++)
printf("%d ", cal.a[t]);
printf("\n");
cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);
sprintf (cal_buffer,"%d %d %d %d %d %d %d",
cal.a[1], cal.a[2], cal.a[0],
cal.a[4], cal.a[5], cal.a[3], cal.a[6]);
write (cal_fd, cal_buffer, strlen (cal_buffer) + 1);
close (cal_fd);
t = 0;
return 0;
}