private AgeGenderClassification SelectCategory(Gender gender, float age)
        {
            AgeGenderClassification selectedCategory = new AgeGenderClassification();

            foreach (var category in PersonCategories)
            {
                if (age >= category.AgeMin && age < category.AgeMax && gender == category.Gender)
                {
                    selectedCategory = category;
                    break;
                }
            }
            return(selectedCategory);
        }
        private Distribution GetAnalizeDistribution(Dictionary <BodyType, BodyTypeAttributes> result,
                                                    AgeGenderClassification selectedCategory)
        {
            var distribution = GetDistribution(result);

            distribution.DistributionName = AnalizeDistributionName;

            for (int i = 0; i < BODY_TYPES_CNT; i++)
            {
                var prevValue = i == 0 ? 0 : distribution.Measurements[i - 1].Quantity;
                var diff      = selectedCategory.FatIntervals[i + 1] - selectedCategory.FatIntervals[i];
                distribution.Measurements[i].Quantity = diff + prevValue;
            }
            return(distribution);
        }
        private BodyType CalcBodyType(AgeGenderClassification selectedCategory, float fatPercent)
        {
            var bodyTypeZone = BodyType.thin;

            for (int i = BODY_TYPES_CNT - 1; i >= 0; i--)
            {
                var enm = (BodyType)i;
                if (fatPercent > selectedCategory.FatIntervals[i])
                {
                    bodyTypeZone = enm;
                    break;
                }
            }
            return(bodyTypeZone);
        }
        public InterpolationResults(float height, float initWeight, float dream_weight, float age, string gender,
                                    string activity, float waist, float hips, float neck, bool hardMode)
        {
            // Отображение введенных показателей
            InputHeight      = height.ToString();
            InputWeight      = initWeight.ToString();
            InputAge         = age.ToString();
            InputGender      = gender.ToString();
            InputActivity    = activity.ToString();
            InputDreamWeight = dream_weight == 0 ? "" : dream_weight.ToString();

            // Пол
            Gender genderValue = GenderDict[gender];

            // Отнесение человека к одной из 6 категорий по половозрастноым признакам
            AgeGenderClassification selectedCategory = SelectCategory(genderValue, age);

            // Расчет распределения зон телосложения, результирущих показателей % жировой ткани, веса и кол-ва недель
            var results = CalcSchedule(height, initWeight, dream_weight, age, genderValue,
                                       activity, waist, hips, neck, hardMode);

            // График распределения зон телосложений
            ScheduleValues = results.Item1;

            // Получаем словарь со списками распределения графика похудения по типам телосложения
            _bodyTypeZonesDict = GetBodyZonesDictionary(height, initWeight, dream_weight, waist,
                                                        hips, neck, genderValue, selectedCategory, hardMode);

            // Масса на границе начала зоны истощения
            LimitWeight = GetLimitWeight(_bodyTypeZonesDict[BodyType.thin]);

            // Критическая масса тела (несовместимая с жизнью)
            CriticalWeight = GetCriticalWeight(genderValue, results.Item2, results.Item3);

            // Кол-во недель в плане
            WeeksCount = results.Item4.ToString();

            // Рекомендации
            Recomendations = GetWarning(LimitWeight, CriticalWeight);

            // Распределение веса в зависимости от недель (для каждой зоны телосложения отдельная зависимость)
            Distribution = GetInterpltnDistribution(ResultDict, _bodyTypeZonesDict);

            // Фокус на график
            Anchor = "charts";
        }
        public AnalizeResults(string gender, float age, float waist, float hips, float neck,
                              float height, float weight, bool hardMode)
        {
            // Отображение введенных показателей
            InputGender = gender;
            InputAge    = age.ToString();
            InputWaist  = waist == 0 ? "" : waist.ToString();
            InputHips   = hips == 0 ? "" : hips.ToString();
            InputNeck   = neck == 0 ? "" : neck.ToString();
            InputHeight = height.ToString();
            InputWeight = weight.ToString();

            Gender genderValue = GenderDict[gender];

            // Расчет % жировой ткани в организме
            float fatPercent = CalcFatPercent(genderValue, waist, hips, neck, height, weight, hardMode);

            // Не завышен ли уровень висцеральной жировой ткани
            ViscellarFatConclusion = CalcVisceralFat(genderValue, waist, hips, hardMode);

            // Отнесение человека к одной из 6 категорий по половозрастноым признакам
            AgeGenderClassification selectedCategory = SelectCategory(genderValue, age);

            // Вычисление типа телосложения человека
            BodyType bodyTypeZone = CalcBodyType(selectedCategory, fatPercent);

            // Результат: тип телосложения и % жировой ткани + Рекомендация
            Recomendations = $"У вас наблюдается {ResultDict[bodyTypeZone].Name.ToLower()}," +
                             $" жировая ткань в организме составляет {Math.Round(fatPercent, 2)} % " +
                             ResultDict[bodyTypeZone].Recomendations;

            // Свойство видимости ссылки на страницу с составлением плана снижения веса
            LinkVisibility = GetVisibility(bodyTypeZone);

            // Свойство видимости графика
            ChartVisibility = "visible";

            // Распределение по типам телосложения в зав-сти от % жировой ткани в организме для выбранной половозрастной категории
            Distribution = GetAnalizeDistribution(ResultDict, selectedCategory);

            // Фокус на график
            Anchor = "charts";
        }
        private Dictionary <BodyType, List <WeightToTime> > GetBodyZonesDictionary(float height, float initWeight, float dream_weight,
                                                                                   float waist, float hips, float neck, Gender gender, AgeGenderClassification selectedCategory, bool hardMode)
        {
            var dictionary = new Dictionary <BodyType, List <WeightToTime> >()
            {
                { BodyType.thin, BodyTypeZones.UnderfatZone = new List <WeightToTime>() },
                { BodyType.athletic, BodyTypeZones.AthleticZone = new List <WeightToTime>() },
                { BodyType.good, BodyTypeZones.FitZone = new List <WeightToTime>() },
                { BodyType.average, BodyTypeZones.HealthyZone = new List <WeightToTime>() },
                { BodyType.excess, BodyTypeZones.OverfatZone = new List <WeightToTime>() },
                { BodyType.extra, BodyTypeZones.ObeseZone = new List <WeightToTime>() },
            };

            float weight               = 0;
            float fatPercent           = 0;
            float fatPercentDifference = 0;
            int   week = 0;

            do
            {
                // Вес и %жировой ткани
                if (week == 0)
                {
                    // Начальный вес
                    weight = initWeight;

                    // Расчет % жировой ткани
                    var res = CalcFatPercent(height, weight, gender, waist, hips, neck, hardMode);
                    fatPercent           = res.Item1;
                    fatPercentDifference = res.Item2;
                }
                else
                {
                    // Пересчет веса
                    weight = (1 - KbguCalculation.GetWeightRecession(fatPercent, gender)) * weight;

                    // Персчет % жировой ткани
                    fatPercent = KbguCalculation.FatPercent(height, weight, gender) + fatPercentDifference;
                }

                // Инициализация элементов списков словаря нулевыми значениями
                for (int i = 0; i < BODY_TYPES_CNT; i++)
                {
                    var enm = (BodyType)i;
                    dictionary[enm].Add(new WeightToTime {
                        PeriodId = week, Weight = 0
                    });
                }

                // Заполнение элементов списков словаря значениями если вес находится в рассматриваемой зоне
                for (int i = BODY_TYPES_CNT - 1; i >= 0; i--)
                {
                    var enm = (BodyType)i;
                    if (fatPercent > selectedCategory.FatIntervals[i])
                    {
                        dictionary[enm][week].Weight = (float)Math.Round(weight, 2);
                        break;
                    }
                }
                week++;
            }while (!IsCriticalFatValue(gender, fatPercent) && weight > dream_weight);

            return(dictionary);
        }