bool Calibrator::add_click(int x, int y) { // Double-click detection if (threshold_doubleclick > 0 && clicked.num > 0) { int i = clicked.num - 1; while (i >= 0) { if (abs(x - clicked.x[i]) <= threshold_doubleclick && abs(y - clicked.y[i]) <= threshold_doubleclick) { if (verbose) { printf("DEBUG: Not adding click %i (X=%i, Y=%i): within %i pixels of previous click\n", clicked.num, x, y, threshold_doubleclick); } return false; } i--; } } // Mis-click detection if (threshold_misclick > 0 && clicked.num > 0) { bool misclick = true; switch (clicked.num) { case 1: // check that along one axis of first point if (along_axis(x,clicked.x[UL],clicked.y[UL]) || along_axis(y,clicked.x[UL],clicked.y[UL])) { misclick = false; } else if (verbose) { printf("DEBUG: Mis-click detected, click %i (X=%i, Y=%i) not aligned with click 0 (X=%i, Y=%i) (threshold=%i)\n", clicked.num, x, y, clicked.x[UL], clicked.y[UL], threshold_misclick); } break; case 2: // check that along other axis of first point than second point if ((along_axis( y, clicked.x[UL], clicked.y[UL]) && along_axis( clicked.x[UR], clicked.x[UL], clicked.y[UL])) || (along_axis( x, clicked.x[UL], clicked.y[UL]) && along_axis( clicked.y[UR], clicked.x[UL], clicked.y[UL]))) { misclick = false; } else if (verbose) { printf("DEBUG: Mis-click detected, click %i (X=%i, Y=%i) not aligned with click 0 (X=%i, Y=%i) or click 1 (X=%i, Y=%i) (threshold=%i)\n", clicked.num, x, y, clicked.x[UL], clicked.y[UL], clicked.x[UR], clicked.y[UR], threshold_misclick); } break; case 3: // check that along both axis of second and third point if ( ( along_axis( x, clicked.x[UR], clicked.y[UR]) && along_axis( y, clicked.x[LL], clicked.y[LL]) ) ||( along_axis( y, clicked.x[UR], clicked.y[UR]) && along_axis( x, clicked.x[LL], clicked.y[LL]) ) ) { misclick = false; } else if (verbose) { printf("DEBUG: Mis-click detected, click %i (X=%i, Y=%i) not aligned with click 1 (X=%i, Y=%i) or click 2 (X=%i, Y=%i) (threshold=%i)\n", clicked.num, x, y, clicked.x[UR], clicked.y[UR], clicked.x[LL], clicked.y[LL], threshold_misclick); } } if (misclick) { reset(); return false; } } clicked.x.push_back(x); clicked.y.push_back(y); clicked.num++; if (verbose) printf("DEBUG: Adding click %i (X=%i, Y=%i)\n", clicked.num-1, x, y); return true; }
/* add a click with the given coordinates */ gboolean add_click (struct Calib *c, int x, int y) { /* Double-click detection */ if (c->threshold_doubleclick > 0 && c->num_clicks > 0) { int i = c->num_clicks-1; while (i >= 0) { if (abs(x - c->clicked_x[i]) <= c->threshold_doubleclick && abs(y - c->clicked_y[i]) <= c->threshold_doubleclick) { return FALSE; } i--; } } /* Mis-click detection */ if (c->threshold_misclick > 0 && c->num_clicks > 0) { gboolean misclick = TRUE; if (c->num_clicks == 1) { /* check that along one axis of first point */ if (along_axis(c, x,c->clicked_x[0],c->clicked_y[0]) || along_axis(c, y,c->clicked_x[0],c->clicked_y[0])) { misclick = FALSE; } } else if (c->num_clicks == 2) { /* check that along other axis of first point than second point */ if ((along_axis(c, y,c->clicked_x[0],c->clicked_y[0]) && along_axis(c, c->clicked_x[1],c->clicked_x[0],c->clicked_y[0])) || (along_axis(c, x,c->clicked_x[0],c->clicked_y[0]) && along_axis(c, c->clicked_y[1],c->clicked_x[0],c->clicked_y[0]))) { misclick = FALSE; } } else if (c->num_clicks == 3) { /* check that along both axis of second and third point */ if ((along_axis(c, x,c->clicked_x[1],c->clicked_y[1]) && along_axis(c, y,c->clicked_x[2],c->clicked_y[2])) || (along_axis(c, y,c->clicked_x[1],c->clicked_y[1]) && along_axis(c, x,c->clicked_x[2],c->clicked_y[2]))) { misclick = FALSE; } } if (misclick) { reset(c); return FALSE; } } c->clicked_x[c->num_clicks] = x; c->clicked_y[c->num_clicks] = y; c->num_clicks++; return TRUE; }
bool Calibrator::add_click(int x, int y) { // Double-click detection if (threshold_doubleclick > 0 && num_clicks > 0) { int i = num_clicks-1; while (i >= 0) { if (abs(x - clicked_x[i]) <= threshold_doubleclick && abs(y - clicked_y[i]) <= threshold_doubleclick) { if (verbose) { printf("DEBUG: Not adding click %i (X=%i, Y=%i): within %i pixels of previous click\n", num_clicks, x, y, threshold_doubleclick); } return false; } i--; } } // Mis-click detection if (threshold_misclick > 0 && num_clicks > 0) { bool misclick = true; if (num_clicks == 1) { // check that along one axis of first point if (along_axis(x,clicked_x[0],clicked_y[0]) || along_axis(y,clicked_x[0],clicked_y[0])) misclick = false; } else if (num_clicks == 2) { // check that along other axis of first point than second point if ((along_axis(y,clicked_x[0],clicked_y[0]) && along_axis(clicked_x[1],clicked_x[0],clicked_y[0])) || (along_axis(x,clicked_x[0],clicked_y[0]) && along_axis(clicked_y[1],clicked_x[0],clicked_y[0]))) misclick = false; } else if (num_clicks == 3) { // check that along both axis of second and third point if ((along_axis(x,clicked_x[1],clicked_y[1]) && along_axis(y,clicked_x[2],clicked_y[2])) || (along_axis(y,clicked_x[1],clicked_y[1]) && along_axis(x,clicked_x[2],clicked_y[2]))) misclick = false; } if (misclick) { if (verbose) { if (num_clicks == 1) printf("DEBUG: Mis-click detected, click %i (X=%i, Y=%i) not aligned with click 0 (X=%i, Y=%i) (threshold=%i)\n", num_clicks, x, y, clicked_x[0], clicked_y[0], threshold_misclick); else if (num_clicks == 2) printf("DEBUG: Mis-click detected, click %i (X=%i, Y=%i) not aligned with click 0 (X=%i, Y=%i) or click 1 (X=%i, Y=%i) (threshold=%i)\n", num_clicks, x, y, clicked_x[0], clicked_y[0], clicked_x[1], clicked_y[1], threshold_misclick); else if (num_clicks == 3) printf("DEBUG: Mis-click detected, click %i (X=%i, Y=%i) not aligned with click 1 (X=%i, Y=%i) or click 2 (X=%i, Y=%i) (threshold=%i)\n", num_clicks, x, y, clicked_x[1], clicked_y[1], clicked_x[2], clicked_y[2], threshold_misclick); } reset(); return false; } } clicked_x[num_clicks] = x; clicked_y[num_clicks] = y; num_clicks++; if (verbose) printf("DEBUG: Adding click %i (X=%i, Y=%i)\n", num_clicks-1, x, y); return true; }