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 formularios 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

J4NBasicCalc.TasametabólicaBasalImpl() //(1)

la linea anterior al configurar el builder retorna un Map<String, Double> donde calculamos la tasa metabólica basal (TMB) mas calorías totales

Key = String Value = Double
CALORIAS_MANTENIMIENTO calorías de mantenimiento
TMB tasa metabólica basal
@Log4j2
public class TasaMetabolicaBasalMifflinsAndKatchMcArdleTest {

  private static final int PESO = 85;
  private static final int ALTURA = 176;
  private static final int EDAD = 31;
  private static final int DIAMETRO_CUELLO = 41;
  private static final int DIAMETRO_CINTURA = 86;
  private static final int DIAMETRO_CADERA = 95;

  /**
   * Esta formula no exigue un bodyfat
   */
  @Test
  void tasaMetabolicaBasaMifflins() {
    //(1)
    final Map<String, Double> map = new J4NBasicCalc.TasaMetabolicaBasalImpl()
            .conEdad(EDAD)
            .conAltura(ALTURA)
            .conFactorActividadFisica(FactorDeActividadFisica.MODERADO)
            .conGenero(Genero.HOMBRE)
            .conPeso(PESO)
            .conLabel(new StringBuilder("log")) // para informar en un label/String
            .hallarTmbMifflin()
            .tasaMetabolicaPorActividad()
            .make()
            .mapaTmbConKiloCalsMantenimiento();

    final double tmbMifflins = map.get(TMB);
    final double calcMantenimientoMifflins = map.get(CALORIAS_MANTENIMIENTO);

    MatcherAssert.assertThat(tmbMifflins, Matchers.is(1800.0));
    MatcherAssert.assertThat(calcMantenimientoMifflins, Matchers.is(2790.0));
  }
  
}

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

new J4NBasicCalc.BodyFatImpl()//(2)
  /**
   *
   * Esta formula si exigue introducir el bodyfat aproximado para el cálculo de la TMB
   */
  @Test
  void tasaMetabolicaBasalKatchMcArdle() {
    //(2)
    final Map<String,Double> map = new J4NBasicCalc.BodyFatImpl()
            .conAltura(ALTURA)
            .conPeso(PESO)
            .conGenero(Genero.HOMBRE)
            .conLabel(new StringBuilder("log()"))
            .conDiametroCuello(DIAMETRO_CUELLO)
            .conDiametroCintura(DIAMETRO_CINTURA)
            .calculateBodyFatWithFatMassAndLeanBodyMass()
            .make()
            .getMapBodyFatWithFatMassAndLeanBodyMass();

    //(1)
    final Map<String, Double> mapKatch = new J4NBasicCalc.TasaMetabolicaBasalImpl()
            .conPeso(PESO)
            .conFactorActividadFisica(FactorDeActividadFisica.MODERADO)
            .conGrasaCorporal(map.get(BODY_FAT))
            .conLabel(new StringBuilder("log")) // para informar en un label
            .hallarTmbKatchMcArdle()
            .tasaMetabolicaPorActividad()
            .make()
            .mapaTmbConKiloCalsMantenimiento();

    final double tmbKatch = mapKatch.get(TMB);
    final double calcMantenimientoKatch = mapKatch.get(CALORIAS_MANTENIMIENTO);

    MatcherAssert.assertThat(tmbKatch, Matchers.is(1946.8));
    MatcherAssert.assertThat(calcMantenimientoKatch, Matchers.is(3017.54));
  }

}

Uso para cálculo de MacroNutrientes

Con el cálculo previamente realizado obtendremos la tasa metabólica basal con las calorias de mantenimiento, con el map las obtenemos con estas constantes

  • TMB
  • CALORIAS_MANTENIMIENTO
double kilocaloriasMantenimientoMifflin = mapaTmpMantenimiento.get(CALORIAS_MANTENIMIENTO));
mapaTmpMantenimiento.get(TMB));

kilocaloriasMantenimientoMifflin //(1) es recuperada con la linea anterior y seteada aquí.

Mifflins

@Test
void calcularMacrosWithMifflins(){

   final Map<String, Double> mapTmb = new J4NBasicCalc.TasaMetabolicaBasalImpl()
            .conEdad(EDAD)
            .conAltura(ALTURA)
            .conFactorActividadFisica(FactorDeActividadFisica.MODERADO)
            .conGenero(Genero.HOMBRE)
            .conPeso(PESO)
            .conLabel(new StringBuilder("log")) // para informar en un label/String
            .hallarTmbMifflin()
            .tasaMetabolicaPorActividad()
            .make()
            .mapaTmbConKiloCalsMantenimiento();

   //(1)
   final Map<String, Double> mapMacros = new J4NBasicCalc.CalculateMacrosImpl()
            .conKiloCalsMantenimiento(mapTmb.get(CALORIAS_MANTENIMIENTO))
            .conPorcentajeProteinas(PORCENTAJE_PROTEINAS)
            .conPorcentajeCarbohidratos(PORCENTAJE_CARBOHIDRATOS)
            .conPorcentajeGrasa(PORCENTAJE_GRASAS)
            .cantidadCaloriasRestar(CALORIAS_A_RESTAR)
            .cantidadCaloriasSumar(CALORIAS_A_SUMAR)
            .vecesAComer(CANDITADA_DE_VECES_A_COMER)
            .calcularMacros()
            .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);

      MatcherAssert.assertThat(proteinasEnDefinicion,Matchers.is(171.75));
      MatcherAssert.assertThat(carbohidratosEnDefinicion,Matchers.is(372.12));
      MatcherAssert.assertThat(grasasEnDefinicion,Matchers.is(12.72));
      MatcherAssert.assertThat(kiloCaloriasEnDefinicion,Matchers.is(2290.0));

      //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);

      MatcherAssert.assertThat(proteinasMantenimiento,Matchers.is(209.25));
      MatcherAssert.assertThat(carbohidratosMantenimiento,Matchers.is(453.38));
      MatcherAssert.assertThat(grasasMantenimiento,Matchers.is(15.5));
      MatcherAssert.assertThat(kiloCaloriasEnMantenimiento,Matchers.is(2790.0));

      //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);

      MatcherAssert.assertThat(proteinasEnVolumen,Matchers.is(261.75));
      MatcherAssert.assertThat(carbohidratosEnVolumen,Matchers.is(567.12));
      MatcherAssert.assertThat(grasasEnVolumen,Matchers.is(19.39));
      MatcherAssert.assertThat(kiloCaloriasEnVolumen,Matchers.is(3490.0));
        
}

Katch McArdle

@Test
void calculateMacrosWithKatchMcArdle() {

        //primero calcular el BodyFat
        final Map<String,Double> mapBodyFat = new J4NBasicCalc.BodyFatImpl()
                .conAltura(ALTURA)
                .conPeso(PESO)
                .conGenero(Genero.HOMBRE)
                .conLabel(new StringBuilder())
                .conDiametroCuello(41)
                .conDiametroCintura(86)
                .calculateBodyFatWithFatMassAndLeanBodyMass()
                .make()
                .getMapBodyFatWithFatMassAndLeanBodyMass();

        final Map<String, Double> mapTmb = new J4NBasicCalc.TasaMetabolicaBasalImpl()
                .conPeso(PESO)
                .conFactorActividadFisica(FactorDeActividadFisica.MODERADO)
                .conGrasaCorporal(mapBodyFat.get(BODY_FAT))
                .conLabel(new StringBuilder("log()")) // para informar en un label
                .hallarTmbKatchMcArdle()
                .tasaMetabolicaPorActividad()
                .make()
                .mapaTmbConKiloCalsMantenimiento();

        final Map<String, Double> mapMacros = new J4NBasicCalc.CalculateMacrosImpl()
                .conKiloCalsMantenimiento(mapTmb.get(CALORIAS_MANTENIMIENTO))
                .conPorcentajeProteinas(PORCENTAJE_PROTEINAS)
                .conPorcentajeCarbohidratos(PORCENTAJE_CARBOHIDRATOS)
                .conPorcentajeGrasa(PORCENTAJE_GRASAS)
                .cantidadCaloriasRestar(CALORIAS_A_RESTAR)
                .cantidadCaloriasSumar(CALORIAS_A_SUMAR)
                .vecesAComer(CANDITADA_DE_VECES_A_COMER)
                .calcularMacros()
                .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);

       MatcherAssert.assertThat(proteinasEnDefinicion, Matchers.is(188.82));
       MatcherAssert.assertThat(carbohidratosEnDefinicion, Matchers.is(409.1));
       MatcherAssert.assertThat(grasasEnDefinicion, Matchers.is(13.99));
       MatcherAssert.assertThat(kiloCaloriasEnDefinicion, Matchers.is(2517.54));

       //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);

       MatcherAssert.assertThat(proteinasMantenimiento, Matchers.is(226.32));
       MatcherAssert.assertThat(carbohidratosMantenimiento, Matchers.is(490.35));
       MatcherAssert.assertThat(grasasMantenimiento, Matchers.is(16.76));
       MatcherAssert.assertThat(kiloCaloriasEnMantenimiento, Matchers.is(3017.54));

       //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);

       MatcherAssert.assertThat(proteinasEnVolumen, Matchers.is(278.82));
       MatcherAssert.assertThat(carbohidratosEnVolumen, Matchers.is(604.1));
       MatcherAssert.assertThat(grasasEnVolumen, Matchers.is(20.65));
       MatcherAssert.assertThat(kiloCaloriasEnVolumen, Matchers.is(3717.54));

}

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 imágen anterior resume, que las etapas pasadas son obligatorias para esta, para obtener tablas con los 3 macronutrientes escenciales 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 formula de los Navy Seal para obtener un %graso aproximado sin plicómetro, y algunas otras tecnicas mas complejas y costosas.

Genero Formula
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 Formula
Masa Grasa (FatMass) (Body-Fat/100) * peso(kg)
Masa Limpia (Lbm) peso(kg) - (FatMass)

Código java para hallar el bodyFat en hombres

Constantes de ejemplo, por la brevedad

private static final int PESO = 80;
private static final int ALTURA = 176;
private static final int DIAMETRO_CUELLO = 41;
private static final int DIAMETRO_CINTURA = 86;
private static final int DIAMETRO_CADERA = 95;
@Test
void calculoBodyFatHombre() {
    final Map<String,Double> map = new J4NBasicCalc.BodyFatImpl()
        .conAltura(ALTURA)
        .conPeso(PESO)
        .conGenero(Genero.HOMBRE)
        .conLabel(new StringBuilder())
        .conDiametroCuello(DIAMETRO_CUELLO)
        .conDiametroCintura(DIAMETRO_CINTURA)
        .calculateBodyFatWithFatMassAndLeanBodyMass()
        .make()
        .getMapBodyFatWithFatMassAndLeanBodyMass();

    MatcherAssert.assertThat(map.get(BODY_FAT), Matchers.is(15.19));
    MatcherAssert.assertThat(map.get(FAT_MASS), Matchers.is(12.15));
    MatcherAssert.assertThat(map.get(LEAN_BODY_MASS), Matchers.is(67.85));
}

Para hallar el bodyFat en mujeres invocar a

.conDiametroCadera(cadera)//(1)
@Test
void calculoBodyFatMujer() {
     final Map<String,Double> map = new J4NBasicCalc.BodyFatImpl()
                .conAltura(ALTURA)
                .conPeso(PESO)
                .conGenero(Genero.MUJER)
                .conLabel(new StringBuilder())
                .conDiametroCuello(DIAMETRO_CUELLO)
                .conDiametroCintura(DIAMETRO_CINTURA)
                .conDiametroCadera(DIAMETRO_CADERA) //(1)
                .calculateBodyFatWithFatMassAndLeanBodyMass()
                .make()
                .getMapBodyFatWithFatMassAndLeanBodyMass();

    MatcherAssert.assertThat(map.get(BODY_FAT), Matchers.is(25.59));
    MatcherAssert.assertThat(map.get(FAT_MASS), Matchers.is(20.47));
    MatcherAssert.assertThat(map.get(LEAN_BODY_MASS), Matchers.is(59.53));
}

Y de Vzla pal mundo 💛💙❤️ alt text

Comments