Its surprisingly difficult to find a calorie calculation for Java for performing a number of steps at a certain speed. Based on the Compendium of Physical Activities (https://sites.google.com/site/compendiumofphysicalactivities/corrected-mets ) and using Corrected METS, I have converted the formulas on their website into Java code! I found the website particularly difficult to read as it did not have brackets in the right places to ensure that the calculations were correct. Hopefully I can save someone the hassle of having to wonder what is going on with all their formulas.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
/** * Calculated the energy expenditure for an activity. Adapted from the following website https://sites.google.com/site/compendiumofphysicalactivities/corrected-mets * * @param height The height in metres. * @param age The date of birth. * @param weight The weight of the user. * @param gender The gender of the user. * @param durationInSeconds The duration of the activity in seconds. * @param stepsTaken The steps taken. * @param strideLengthInMetres The stride length of the user * @return The number of calories burnt (kCal) */ public static float calculateEnergyExpenditure(float height, Date age, float weight, int gender, int durationInSeconds, int stepsTaken, float strideLengthInMetres) { float ageCalculated = getAgeFromDateOfBirth(age); float harrisBenedictRmR = convertKilocaloriesToMlKmin(harrisBenedictRmr(gender, weight, ageCalculated, convertMetresToCentimetre(height)), weight); float kmTravelled = calculateDistanceTravelledInKM(stepsTaken, strideLengthInMetres); float hours = UnitConverter.convertSecondsToHours(durationInSeconds); float speedInMph = UnitConverter.convertKilometersToMiles(kmTravelled) / hours; float metValue = getMetForActivity(speedInMph); float constant = 3.5f; float correctedMets = metValue * (constant / harrisBenedictRmR); return correctedMets * hours * weight; } /** * Gets a users age from a date. Only takes into account years. * * @param age The date of birth. * @return The age in years. */ private static float getAgeFromDateOfBirth(Date age) { Calendar currentDate = Calendar.getInstance(); Calendar dateOfBirth = Calendar.getInstance(); dateOfBirth.setTime(age); if (dateOfBirth.after(currentDate)) { throw new IllegalArgumentException("Can't be born in the future"); } int currentYear = currentDate.get(Calendar.YEAR); int dateOfBirthYear = dateOfBirth.get(Calendar.YEAR); int age2 = currentYear - dateOfBirthYear; int currentMonth = currentDate.get(Calendar.MONTH); int dateOfBirthMonth = dateOfBirth.get(Calendar.MONTH); if (dateOfBirthMonth > currentMonth) { age2--; } else if (currentMonth == dateOfBirthMonth) { int currentDay = currentDate.get(Calendar.DAY_OF_MONTH); int dateOfBirthDay = dateOfBirth.get(Calendar.DAY_OF_MONTH); if (dateOfBirthDay > currentDay) { age2--; } } return age2; } public static float convertKilocaloriesToMlKmin(float kilocalories, float weightKgs) { float kcalMin = kilocalories / 1440; kcalMin /= 5; return ((kcalMin / (weightKgs)) * 1000); } public static float convertMetresToCentimetre(float metres) { return metres * 100; } public static float calculateDistanceTravelledInKM(int stepsTaken, float entityStrideLength) { return (((float) stepsTaken * entityStrideLength) / 1000); } /** * Gets the MET value for an activity. Based on https://sites.google.com/site/compendiumofphysicalactivities/Activity-Categories/walking . * * @param speedInMph The speed in miles per hour * @return The met value. */ private static float getMetForActivity(float speedInMph) { if (speedInMph < 2.0) { return 2.0f; } else if (Float.compare(speedInMph, 2.0f) == 0) { return 2.8f; } else if (Float.compare(speedInMph, 2.0f) > 0 && Float.compare(speedInMph, 2.7f) <= 0) { return 3.0f; } else if (Float.compare(speedInMph, 2.8f) > 0 && Float.compare(speedInMph, 3.3f) <= 0) { return 3.5f; } else if (Float.compare(speedInMph, 3.4f) > 0 && Float.compare(speedInMph, 3.5f) <= 0) { return 4.3f; } else if (Float.compare(speedInMph, 3.5f) > 0 && Float.compare(speedInMph, 4.0f) <= 0) { return 5.0f; } else if (Float.compare(speedInMph, 4.0f) > 0 && Float.compare(speedInMph, 4.5f) <= 0) { return 7.0f; } else if (Float.compare(speedInMph, 4.5f) > 0 && Float.compare(speedInMph, 5.0f) <= 0) { return 8.3f; } else if (Float.compare(speedInMph, 5.0f) > 0) { return 9.8f; } return 0; } /** * Calculates the Harris Benedict RMR value for an entity. Based on above calculation for Com * * @param gender Users gender. * @param weightKg Weight in Kg. * @param age Age in years. * @param heightCm Height in CM. * @return Harris benedictRMR value. */ private static float harrisBenedictRmr(int gender, float weightKg, float age, float heightCm) { if (gender == Entity.GENDER_FEMALE) { return 655.0955f + (1.8496f * heightCm) + (9.5634f * weightKg) - (4.6756f * age); } else { return 66.4730f + (5.0033f * heightCm) + (13.7516f * weightKg) - (6.7550f * age); } } |