private void updateParameters() { long currentTime = System.currentTimeMillis(); double timeDelta = (currentTime - lastUpdate) / 1000.0; lastUpdate = currentTime; if(timeDelta == 0.0) return; double posX = params.get(ShipPhysicalParam.POS_X); double posY = params.get(ShipPhysicalParam.POS_Y); double velX = params.get(ShipPhysicalParam.SPEED_X_PIX_SEC); double velY = params.get(ShipPhysicalParam.SPEED_Y_PIX_SEC); double dir = params.get(ShipPhysicalParam.DIRECTION_RAD); double dirSpeed = params.get(ShipPhysicalParam.DIRECTION_SPEED_RAD_SEC); double thrust = params.get(ShipPhysicalParam.THRUST_PIX_SEC); double dirAtEnd = dir + dirSpeed * timeDelta; double thrustX = thrust * Math.sin(dir); double thrustY = thrust * Math.cos(dir); double thrustAtEndX = thrust * Math.sin(dirAtEnd); double thrustAtEndY = thrust * Math.cos(dirAtEnd); double thrustVelX = (thrustAtEndX - thrustX) / timeDelta; double thrustVelY = (thrustAtEndY - thrustY) / timeDelta; posX += velX * timeDelta + thrustX * timeDelta * timeDelta / 2.0 + thrustVelX * timeDelta * timeDelta * timeDelta / 6.0; posY += velY * timeDelta + thrustY * timeDelta * timeDelta / 2.0 + thrustVelY * timeDelta * timeDelta * timeDelta / 6.0; velX += thrustX * timeDelta + thrustVelX * timeDelta * timeDelta / 2.0; velY += thrustY * timeDelta + thrustVelY * timeDelta * timeDelta / 2.0; params.put(ShipPhysicalParam.POS_X, posX); params.put(ShipPhysicalParam.POS_Y, posY); params.put(ShipPhysicalParam.SPEED_X_PIX_SEC, velX); params.put(ShipPhysicalParam.SPEED_Y_PIX_SEC, velY); params.put(ShipPhysicalParam.DIRECTION_RAD, dirAtEnd); }

Tested and seems to work pretty nicely.

Problem solved!