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; } }