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 macros a veces, es simple eso, puro cálculo 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 |
---|---|
|
370 + (21.6 x Lean Body Mass (kg) ) |
|
(10 * peso (kg)) + (6.25 * altura (cm)) - ( 5 * edad) + 5; |
|
(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 |
---|---|
|
1.2 |
|
1.375 |
|
1.55 |
|
1.725 |
|
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
- Vista de Katch McArdle
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 (1)
.withHeight(HEIGHT_INCHES * INCHES)//pulgadas a centimetros (2)
.withGender(Genero.HOMBRE)
.withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
.calculateTmbWithMifflin()
.basicMetabolicRateByPhysicalActivityFactor()
.log()
.make(); (3)
assertThat(tmbMifflins.getBasicMetabolicRate()).isEqualTo(BASIC_METABOLIC_RATE_MALE_MIFFLINS);
(4)
assertThat(tmbMifflins.getMaintenancekiloCals()).isEqualTo(MAINTENANCE_KILOCALS_MALE_MIFFLINS);
}
1 | Para el peso, necesitamos que sea en kilos. |
2 | Para la altura, necesitamos que sea en centímetros. |
3 | Se obtiene la tasa metabolica basal via mifflins. |
4 | También se puede acceder a las calorías de mantenimiento. |
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();(1)
final var tmbMifflins = J4NBasicCalcTypeSafe.tmbKatchMcArdleBuilder()
.withWeight(WEIGHT)
.withBodyFat(bodyFatTypeSafe.getBodyFat()) (2)
.withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
.calculateTmbKatchMcArdle()
.tmbByPhysicalActivityFactor()
.log()
.make();
assertThat(tmbMifflins.getBasicMetabolicRate()).isEqualTo(BASIC_METABOLIC_RATE_MALE_KATCHMACARDLE);
assertThat(tmbMifflins.getMaintenancekiloCals()).isEqualTo(MAINTENANCE_KILOCALS_MALE_KATCHMACARDLE);
}
1 | Obtenemos una instancia del body-fat. |
2 | KatchMcArdle necesita el body-fat. |
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(); (1)
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(); (2)
//Definicion (3)
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 (4)
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 (5)
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));
}
1 | Se obtiene la tasa metabolica basal via mifflins |
2 | Se obtienen los macros de cada macro nutriente, (proteinas, carbohidratos, grasas) |
3 | Macros para definición |
4 | Macros para mantenimiento |
5 | Macros para volumen |
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(); (1)
final var tmbMifflins = J4NBasicCalcTypeSafe.tmbKatchMcArdleBuilder()
.withWeight(WEIGHT)
.withBodyFat(bodyFatTypeSafe.getBodyFat())
.withPhysicalActivityFactor(PhysicalActivityFactor.MODERADO)
.calculateTmbKatchMcArdle()
.tmbByPhysicalActivityFactor()
.log()
.make(); (2)
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(); (3)
//Definicion (4)
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 (5)
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 (6)
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);
}
1 | Se obtiene el body-fat. |
2 | Se obtiene la tasa metabolica basal (tmb/bmr). |
3 | Se obtienen los macros de cada macro nutriente, (proteinas, carbohidratos, grasas) |
4 | Macros para definición. |
5 | Macros para mantenimiento. |
6 | Macros para volumen. |
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 vista se basa en los cálculos y test anteriores, la imagen siguiente es sobre los test de mifflin pero los test de Katch McArdle debe se usar la opción en el menu.
Vista de dieta en general
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
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 |
---|---|
|
495 / (1.0324 - .19077 * log10(CINTURA (cm) - CUELLO (cm)) + .15456 * log10(ALTURA (cm))) - 450 |
|
495 / (1.29579 - .35004 * log10CINTURA (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 |
---|---|
|
(Body-Fat/100) * peso(kg) |
|
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()(1)
.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);
}
1 | Sin invocar el ancho de la cadera |
Para hallar el bodyFat de la mujeres es un poco diferente
@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) (1)
.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);
}
1 | En mujeres se debe invocar a withHipDiameter(HIP_DIAMETER), que es el ancho de la cadera. |
-
Username:
user
-
Password:
password