/* * Calibration algorithm: * * The equation we want to apply at event time where x' and y' are the * calibrated co-ordinates. * * x' = Ax + By + C * y' = Dx + Ey + F * * For example "zero calibration" would be A=1.0 B=0.0 C=0.0, D=0.0, E=1.0, * and F=0.0. * * With 6 unknowns we need 6 equations to find the constants: * * x1' = Ax1 + By1 + C * y1' = Dx1 + Ey1 + F * ... * x3' = Ax3 + By3 + C * y3' = Dx3 + Ey3 + F * * In matrix form: * * x1' x1 y1 1 A * x2' = x2 y2 1 x B * x3' x3 y3 1 C * * So making the matrix M we can find the constants with: * * A x1' * B = M^-1 x x2' * C x3' * * (and similarly for D, E and F) * * For the calibration the desired values x, y are the same values at which * we've drawn at. * */ static void finish_calibration (struct calibrator *calibrator) { struct weston_matrix m; struct weston_matrix inverse; struct weston_vector x_calib, y_calib; int i; /* * x1 y1 1 0 * x2 y2 1 0 * x3 y3 1 0 * 0 0 0 1 */ memset(&m, 0, sizeof(m)); for (i = 0; i < (int)ARRAY_LENGTH(test_ratios); i++) { m.d[i] = calibrator->tests[i].clicked_x; m.d[i + 4] = calibrator->tests[i].clicked_y; m.d[i + 8] = 1; } m.d[15] = 1; weston_matrix_invert(&inverse, &m); memset(&x_calib, 0, sizeof(x_calib)); memset(&y_calib, 0, sizeof(y_calib)); for (i = 0; i < (int)ARRAY_LENGTH(test_ratios); i++) { x_calib.f[i] = calibrator->tests[i].drawn_x; y_calib.f[i] = calibrator->tests[i].drawn_y; } /* Multiples into the vector */ weston_matrix_transform(&inverse, &x_calib); weston_matrix_transform(&inverse, &y_calib); printf ("Calibration values: %f %f %f %f %f %f\n", x_calib.f[0], x_calib.f[1], x_calib.f[2], y_calib.f[0], y_calib.f[1], y_calib.f[2]); exit(0); }
test_loop_speed_matrixvector(void) { struct weston_matrix m; struct weston_vector v = { { 0.5, 0.5, 0.5, 1.0 } }; unsigned long count = 0; double t; printf("\nRunning 3 s test on weston_matrix_transform()...\n"); weston_matrix_init(&m); running = 1; alarm(3); reset_timer(); while (running) { weston_matrix_transform(&m, &v); count++; } t = read_timer(); printf("%lu iterations in %f seconds, avg. %.1f ns/iter.\n", count, t, 1e9 * t / count); }