double mouseActiveForCycles = 0; float carriedOverX = 0; float carriedOverY = 0; double mouse_accel (double cycles) { double accel = atan((cycles / 50) - 5); accel += 1.5707963267944; // we want the whole s curve, not just the bit that's usually above the x and y axes; accel = accel * 0.85; if (accel < 0.25) { accel = 0.25; } return accel; } void handle_mouse_movement( char x, char y) { if (x != 0 || y != 0) { mouseActiveForCycles++; double accel = (double) mouse_accel(mouseActiveForCycles); float moveX = 0; float moveY = 0; if (x > 0) { moveX = (x * accel) + carriedOverX; carriedOverX = moveX - floor(moveX); } else if (x < 0) { moveX = (x * accel) - carriedOverX; carriedOverX = ceil(moveX) - moveX; } if (y > 0) { moveY = (y * accel) + carriedOverY; carriedOverY = moveY - floor(moveY); } else if (y < 0) { moveY = (y * accel) - carriedOverY; carriedOverY = ceil(moveY) - moveY; } #ifdef DEBUG_SERIAL Serial.println(); Serial.print("cycles: "); Serial.println(mouseActiveForCycles); Serial.print("Accel: "); Serial.print(accel); Serial.print(" moveX is "); Serial.print(moveX); Serial.print(" moveY is "); Serial.print(moveY); Serial.print(" carriedoverx is "); Serial.print(carriedOverX); Serial.print(" carriedOverY is "); Serial.println(carriedOverY); #endif Mouse.move(moveX, moveY, 0); } else { mouseActiveForCycles = 0; } }