Categories
Uncategorized

Calories Burnt Calculation for Walking or Running in Java

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.

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

    }

Leave a Reply