Calculadora de la tasa metabólica basal J4NBasicCalc

DISCLAIMER

Este proyecto es algo básico y de ejemplo, muchos quizás les inspire, otros, no les agradará mucho por la simple razón de que, el calcular los macros a veces, es simple eso, puro calculo y la realidad que afronta un atleta esta más allá, por ejemplo estrés, muchísima masa muscular, capacidad de absorción de nutrientes, que no le guste comer, poco apetito muchas variables. Es de conocimiento que atletas de alto nivel no usan nada de fórmulas sino que hacen dieta por medio de la experiencia adquirida durante años y años de entrenamiento puro, duro y acérrimo, más observación del propio cuerpo, mirando como reacciona, y de ahí, suman o restan comida.`

J4NBasicCalc🏋🏼‍♂️

Es una aplicación básica para calcular la tasa metabólica basal usando fórmulas de Mifflin/St Jeor y Katch McArdle, mas dietas aleatorias configurables (añadir, quitar alimentos, dividir alimentos para recalcular calorías diarias) en las 3 etapas, definición, mantenimiento, volumen. próximamente generación de reportes en pdf.

Cuenta con un módulo para cálculo aproximado de la grasa corporal (bodyfat).

Las fórmulas de nutrición todas calculan el TMB/BMR por sus siglas:

  • Tasa Metabólica Basal
  • Basal Metabolic Rate

dependiento el nutricionista tendrán ecuaciones distintas, por ejemplo:

Nutricionistas Fórmulas
Katch McArdle 370 + (21.6 x Lean Body Mass (kg) )
Mifflins/St Jeor **Hombres** (10 * peso (kg)) + (6.25 * altura (cm)) - ( 5 * edad) + 5;
Mifflins/St Jeor **Mujeres** (10 * peso (kg)) + (6.25 * altura (cm)) - ( 5 * edad) - 161;

Luego eso se multiplica por el factor de actividad física que puede ser un rango de 1.2 a 1.9

Factor Actividad física Rango
Sedentario 1.2
Liguero 1.375
Moderado 1.55
Muy Activo 1.725
Extremo 1.9

Dando las calorías de MANTENIMIENTO en las siguientes dos imagenes se presentan los fórmularios correspondientes para dicho cálculo

Uso para el TMB tasa metabólica basal

- Vista de Mifflins / St Jeor

alt text

- Vista de Katch McArdle

alt text

Estos test son basados en las vistas anteriores

@Test
@DisplayName("Tasa metabolica basal mifflins para Hombres sistema ingles, pulgadas y libras")
void tasaMetabolicaBasalMifflinsHombreConSistemaIngles() {
    
    final var tmbMifflins = J4NBasicCalcTypeSafe.tmbMifflinsBuilder()
        .withAge(AGE)
        .withWeight(WEIGHT_POUNDS / POUNDS) //libras a kilos
        .withHeight(HEIGHT_INCHES * INCHES)//pulgadas a centimetros
        .withGender(Genero.HOMBRE)
        .withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
        .calculateTmbWithMifflin()
        .basicMetabolicRateByPhysicalActivityFactor()
        .log()
        .make();
    
    assertThat(tmbMifflins.getBasicMetabolicRate()).isEqualTo(BASIC_METABOLIC_RATE_MALE_MIFFLINS);
    assertThat(tmbMifflins.getMaintenancekiloCals()).isEqualTo(MAINTENANCE_KILOCALS_MALE_MIFFLINS);
    
}

Para Katch-McArdle necesitamos el bodyfat aproximado, como aquí Vista Body-Fat aproximado

@Test
@DisplayName("Tasa metabolica basal katchMcArdle con porcentaje graso de hombres sistema ingles")
void tasaMetabolicaBasalKatchMcArdleParaHombresSistemaIngles() {
    
    final var bodyFatTypeSafe = J4NBasicCalcTypeSafe.bodyFatBuilder()
        .withWeight(WEIGHT_POUNDS / POUNDS) //libras a kilos
        .withHeight(HEIGHT_INCHES * INCHES)//pulgadas a centimetros
        .withGender(Genero.HOMBRE)
        .neckDiameter(NECK_DIAMETER)
        .waistDiameter(WAIST_DIAMETER)
        .withOutHip()
        .calculateBodyFatWithFatMassAndLeanBodyMass()
        .make();

    final var tmbMifflins = J4NBasicCalcTypeSafe.tmbKatchMcArdleBuilder()
        .withWeight(WEIGHT)
        .withBodyFat(bodyFatTypeSafe.getBodyFat())
        .withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
        .calculateTmbKatchMcArdle()
        .tmbByPhysicalActivityFactor()
        .log()
        .make();

    assertThat(tmbMifflins.getBasicMetabolicRate()).isEqualTo(BASIC_METABOLIC_RATE_MALE_KATCHMACARDLE);
    assertThat(tmbMifflins.getMaintenancekiloCals()).isEqualTo(MAINTENANCE_KILOCALS_MALE_KATCHMACARDLE);
    
}

Uso para cálculo de MacroNutrientes

Con el cálculo previamente realizado obtendremos las calorías de mantenimiento gracias a multiplicar la tasa metabólica basal por el factor de actividad física, muy necesario para los pasos siguientes:

Mifflins

@Test
@DisplayName("Calcular macros en hombres en las 3 etapas con Mifflins")
void calculateMacrosMifflins() {

    final var tmbMifflins = J4NBasicCalcTypeSafe.tmbMifflinsBuilder()
        .withAge(AGE)
        .withWeight(WEIGHT)
        .withHeight(HEIGHT)
        .withGender(Genero.HOMBRE)
        .withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
        .calculateTmbWithMifflin()
        .basicMetabolicRateByPhysicalActivityFactor()
        .log()
        .make();

    final var mapMacros = J4NBasicCalcTypeSafe.calculateMacrosBuilder()
        .withMaintenanceKiloCalories(tmbMifflins.getMaintenancekiloCals())
        .withProteinPercentage(PROTEINS_PERCENTAGE_HIGH_CARBS)
        .withCarbohydratesPercentage(CARBS_PERCENTAGE_HIGH_CARBS)
        .withFatPercentage(FAT_PERCENTAGE_HIGH_CARBS)
        .amountToSubtract(AMOUNT_TO_SUBTRACT)
        .amountToAdd(AMOUNT_TO_ADD)
        .timesToEat(TIMES_TO_EAT)
        .calculateMacros()
        .log()
        .make()
        .getMacros();

    //Definicion
    final double proteinasEnDefinicion = mapMacros.get(PROTEINA_DEFINICION);
    final double carbohidratosEnDefinicion = mapMacros.get(CARBOS_DEFINICION);
    final double grasasEnDefinicion = mapMacros.get(GRASAS_DEFINICION);
    final double kiloCaloriasEnDefinicion = mapMacros.get(KILOCALS_DEFINICION);

    assertThat(proteinasEnDefinicion).isEqualTo(PROTENS_STAGE_DEFINITION_MIFFLINS);
    assertThat(carbohidratosEnDefinicion).isEqualTo((CARBS_STAGE_DEFINITION_MIFFLINS));
    assertThat(grasasEnDefinicion).isEqualTo((FAT_STAGE_DEFINITION_MIFFLINS));
    assertThat(kiloCaloriasEnDefinicion).isEqualTo((KILO_CALS_STAGE_DEFINITION_MIFFLINS));

    //Mantenimiento
    final double proteinasMantenimiento = mapMacros.get(PROTEINA_MANTENIMIENTO);
    final double carbohidratosMantenimiento = mapMacros.get(CARBOS_MANTENIMIENTO);
    final double grasasMantenimiento = mapMacros.get(GRASAS_MANTENIMIENTO);
    final double kiloCaloriasEnMantenimiento = mapMacros.get(KILOCALS_MANTENIMIENTO);

    assertThat(proteinasMantenimiento).isEqualTo((PROTENS_STAGE_MAINTENANCE_MIFFLINS));
    assertThat(carbohidratosMantenimiento).isEqualTo((CARBS_STAGE_MAINTENANCE_MIFFLINS));
    assertThat(grasasMantenimiento).isEqualTo((FAT_STAGE_MAINTENANCE_MIFFLINS));
    assertThat(kiloCaloriasEnMantenimiento).isEqualTo((KILO_CALS_STAGE_MAINTENANCE_MIFFLINS));

    //Volumen
    final double proteinasEnVolumen = mapMacros.get(PROTEINA_VOLUMEN);
    final double carbohidratosEnVolumen = mapMacros.get(CARBOS_VOLUMEN);
    final double grasasEnVolumen = mapMacros.get(GRASAS_VOLUMEN);
    final double kiloCaloriasEnVolumen = mapMacros.get(KILOCALS_VOLUMEN);

    assertThat(proteinasEnVolumen).isEqualTo(PROTENS_STAGE_VOLUMEN_MIFFLINS);
    assertThat(carbohidratosEnVolumen).isEqualTo(CARBS_STAGE_VOLUMEN_MIFFLINS);
    assertThat(grasasEnVolumen).isEqualTo((FAT_STAGE_VOLUMEN_MIFFLINS));
    assertThat(kiloCaloriasEnVolumen).isEqualTo((KILO_CALS_STAGE_VOLUMEN_MIFFLINS));
    
}

Katch McArdle

@Test
@DisplayName("Calcular macros en hombres en las 3 etapas con KatchMcArdle")
void calculateMacrosKatchMcArdleHombre() {
    
    final var bodyFatTypeSafe = J4NBasicCalcTypeSafe.bodyFatBuilder()
            .withWeight(WEIGHT)
            .withHeight(HEIGHT)
            .withGender(Genero.HOMBRE)
            .neckDiameter(NECK_DIAMETER)
            .waistDiameter(WAIST_DIAMETER)
            .withOutHip()
            .calculateBodyFatWithFatMassAndLeanBodyMass()
            .make();

    final var tmbMifflins = J4NBasicCalcTypeSafe.tmbKatchMcArdleBuilder()
            .withWeight(WEIGHT)
            .withBodyFat(bodyFatTypeSafe.getBodyFat())
            .withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
            .calculateTmbKatchMcArdle()
            .tmbByPhysicalActivityFactor()
            .log()
            .make();

    final var mapMacros = J4NBasicCalcTypeSafe.calculateMacrosBuilder()
            .withMaintenanceKiloCalories(tmbMifflins.getMaintenancekiloCals())
            .withProteinPercentage(PROTEINS_PERCENTAGE_HIGH_CARBS)
            .withCarbohydratesPercentage(CARBS_PERCENTAGE_HIGH_CARBS)
            .withFatPercentage(FAT_PERCENTAGE_HIGH_CARBS)
            .amountToSubtract(AMOUNT_TO_SUBTRACT)
            .amountToAdd(AMOUNT_TO_ADD)
            .timesToEat(TIMES_TO_EAT)
            .calculateMacros()
            .log()
            .make()
            .getMacros();

    //Definicion
    final double proteinasEnDefinicion = mapMacros.get(PROTEINA_DEFINICION);
    final double carbohidratosEnDefinicion = mapMacros.get(CARBOS_DEFINICION);
    final double grasasEnDefinicion = mapMacros.get(GRASAS_DEFINICION);
    final double kiloCaloriasEnDefinicion = mapMacros.get(KILOCALS_DEFINICION);

    assertThat(proteinasEnDefinicion).isEqualTo((PROTENS_STAGE_DEFINITION_KATCH_MCARDLE));
    assertThat(carbohidratosEnDefinicion).isEqualTo((CARBS_STAGE_DEFINITION_KATCH_MCARDLE));
    assertThat(grasasEnDefinicion).isEqualTo((FAT_STAGE_DEFINITION_KATCH_MCARDLE));
    assertThat(kiloCaloriasEnDefinicion).isEqualTo((KILO_CALS_STAGE_DEFINITION_KATCH_MCARDLE));

    //Mantenimiento
    final double proteinasMantenimiento = mapMacros.get(PROTEINA_MANTENIMIENTO);
    final double carbohidratosMantenimiento = mapMacros.get(CARBOS_MANTENIMIENTO);
    final double grasasMantenimiento = mapMacros.get(GRASAS_MANTENIMIENTO);
    final double kiloCaloriasEnMantenimiento = mapMacros.get(KILOCALS_MANTENIMIENTO);

    assertThat(proteinasMantenimiento).isEqualTo((PROTENS_STAGE_MAINTENANCE_KATCH_MCARDLE));
    assertThat(carbohidratosMantenimiento).isEqualTo((CARBS_STAGE_MAINTENANCE_KATCH_MCARDLE));
    assertThat(grasasMantenimiento).isEqualTo((FAT_STAGE_MAINTENANCE_KATCH_MCARDLE));
    assertThat(kiloCaloriasEnMantenimiento).isEqualTo((KILO_CALS_STAGE_MAINTENANCE_KATCH_MCARDLE));

    //Volumen
    final double proteinasEnVolumen = mapMacros.get(PROTEINA_VOLUMEN);
    final double carbohidratosEnVolumen = mapMacros.get(CARBOS_VOLUMEN);
    final double grasasEnVolumen = mapMacros.get(GRASAS_VOLUMEN);
    final double kiloCaloriasEnVolumen = mapMacros.get(KILOCALS_VOLUMEN);

    assertThat(proteinasEnVolumen).isEqualTo((PROTENS_STAGE_VOLUMEN_KATCH_MCARDLE));
    assertThat(carbohidratosEnVolumen).isEqualTo((CARBS_STAGE_VOLUMEN_KATCH_MCARDLE));
    assertThat(grasasEnVolumen).isEqualTo((FAT_STAGE_VOLUMEN_KATCH_MCARDLE));
    assertThat(kiloCaloriasEnVolumen).isEqualTo((KILO_CALS_STAGE_VOLUMEN_KATCH_MCARDLE));
    assertThat(kiloCaloriasEnVolumen).isEqualTo(KILO_CALS_STAGE_VOLUMEN_KATCH_MCARDLE);

}

Motivación de hacer todo esto?

En esta aplicación el atleta se ahorra ese cálculo tedioso de los macros y porcentajes correspondientes de una manera fácil , sencilla y visual con pocos clicks, basta con el cansancio que sufrimos, estrés muscular, mental, del sistema nervioso central, simpático y parasimpático, y pare de contar, lo que provoca que muchas veces no podamos ni siquiera sentarnos por distintos tipos de incomodidades, una de ellas es esa, el cansancio extremo.

Logrando aquí que se puedan sumar o restar calorías fácilmente, a esas calorías de mantenimiento calculadas por ambos nutricionistas, en la siguiente pestaña/tab Configurar Macros, tiene el objetivo de establecer dichos valores para hallar los Macro-Nutrientes

Aquí se deberá introducir los valores de porcentajes para cada macronutriente, en 2 etapas muy conocidas por ejemplo:

  • Low carbs
    • 45% proteinas
    • 30% carbohidratos
    • 25% de grasas
  • High-carbs
    • 30% proteinas
    • 65% carbohidratos
    • 5% grasas

también se deberá establecer el número de veces a comer, mínimo recomendado 3 por último sumar o restar calorías a etapas de definición o volumen.

Vista de ⚙ Configurar Macros

esta se basa en los calculos y test anteriores

alt text


Vista de dieta en general

alt text

La imagen anterior resume, que las etapas pasadas son obligatorias para esta, para obtener tablas con los 3 macronutrientes esenciales y aleatorios para un atleta, para una dieta mínima, etc, se pueden incluir también carbohidratos simples, legumbres, y verduras.

En versiones futuras se podra exportar a distintos formatos como .pdf, quiza exista la posibilidad de .xsls .docx etc.

colores basados en 🇻🇪


▪Vista Body-Fat aproximado

alt text

Este módulo es usado para el cálculo de 3 cosas que son:

  • Grasa corporal (Body-Fat)
  • Masa limpia (Lbm)
  • Masa grasa (Fat-Mass)

Aquí se usa la fórmula de los Navy Seal para obtener un %graso aproximado sin plicómetro, y algunas otras tecnicas mas complejas y costosas.

Genero Fórmula
Hombre 495 / (1.0324 - .19077 * log10(CINTURA (cm) - CUELLO (cm)) + .15456 * log10(ALTURA (cm))) - 450
Mujer 495 / (1.29579 - .35004 * log10((CINTURA (cm) + CADERA (cm)) - CUELLO (cm)) + .22100 * log10(ALTURA (cm))) - 450

Fórmulas para la Masa grasa y Masa limpia (Lbm), gracias al bodyfat obtenido previamente.

Tipo Fórmula
Masa Grasa (FatMass) (Body-Fat/100) * peso(kg)
Masa Limpia (Lbm) peso(kg) - (FatMass)

Código java para hallar el bodyFat en hombres con sistema métrico

@Test
@DisplayName("BodyFat-MasaLimpia-MasaGrasa para hombres sistema metrico")
void bodyFatHombres() {

    var bodyFatTypeSafe = J4NBasicCalcTypeSafe.bodyFatBuilder()
        .withWeight(WEIGHT)
        .withHeight(HEIGHT)
        .withGender(Genero.HOMBRE)
        .neckDiameter(NECK_DIAMETER)
        .waistDiameter(WAIST_DIAMETER)
        .withOutHip()
        .calculateBodyFatWithFatMassAndLeanBodyMass()
        .log()
        .make();

    assertThat(bodyFatTypeSafe.getBodyFat()).isEqualTo(BODY_FAT_MALE);
    assertThat(bodyFatTypeSafe.getFatMass()).isEqualTo(FAT_MASS_MALE);
    assertThat(bodyFatTypeSafe.getLeanBodyMass()).isEqualTo(LEAN_BODY_MASS_MALE);

}

Para hallar el bodyFat en mujeres invocar a .withHipDiameter(HIP_DIAMETER)

@Test
@DisplayName("BodyFat-MasaLimpia-MasaGrasa para mujeres sistema metrico")
void bodyFatMujeresSistemaMetrico() {

    var bodyFatTypeSafe = J4NBasicCalcTypeSafe.bodyFatBuilder()
        .withWeight(WEIGHT)
        .withHeight(HEIGHT)
        .withGender(Genero.MUJER)
        .neckDiameter(NECK_DIAMETER)
        .waistDiameter(WAIST_DIAMETER)
        .withHipDiameter(HIP_DIAMETER)
        .calculateBodyFatWithFatMassAndLeanBodyMass()
        .log()
        .make();

    assertThat(bodyFatTypeSafe.getBodyFat()).isEqualTo(BODY_FAT_FEMALE);
    assertThat(bodyFatTypeSafe.getFatMass()).isEqualTo(FAT_MASS_FEMALE);
    assertThat(bodyFatTypeSafe.getLeanBodyMass()).isEqualTo(LEAN_BODY_MASS_FEMALE);

}

Y de Vzla pal mundo 💛💙❤️ alt text

Comments