private void visitPath(ExercisePath path) { //Adding the step to the solution ExerciseStep step = new ExerciseStep(getPinContainingRing(path.from), path.destination, path.from, solution.Count + 1); solution.Add(step); path.from.step = step.index; //Changing the exercise status step.from.ringPop(); //Remove the node from the current pin //Are we moving the biggest ring? (it is only moved once) if (step.ring.size == biggestRing.size) { solutionPinIndex = step.to.index; step.ring.isSolved = true; } //is this the final position for the ring? else if (step.to.index == solutionPinIndex) { RingNode rn = step.to.ringPeek(); if (rn.isSolved && rn.size == step.ring.size + 1) { step.ring.isSolved = true; } } step.to.ringPush(step.ring); //Adding the ring to the destination //Erase pending paths from the previous step if (solution.Count > 1) { solution[solution.Count - 2].ring.emptyPendingPaths(); } }
/// <summary> /// Evaluate an exercise step /// </summary> /// <param name="exerciseStep">The performed step</param> /// <param name="idealExerciseStep">Optional, required if no training set was provided</param> /// <returns></returns> public EvaluationResults EvaluateExerciseStep(ExerciseStep exerciseStep, ExerciseStep idealExerciseStep = null) { bool niceWork = true; ArticolationError[] stepEvaluationResults = _exerciseEvaluator.EvaluateExerciseStep(ExerciseTollerance, exerciseStep, idealExerciseStep); if (ExerciseTollerance != null) { for (int i = 0; i < stepEvaluationResults.Length; i++) { ArticolationError error = stepEvaluationResults[i]; niceWork &= error.Position.IsMagnitudeCorrect && error.Position.IsSpeedCorrect && error.Angle.IsSpeedCorrect && error.Angle.IsMagnitudeCorrect; } } return(new EvaluationResults(niceWork, stepEvaluationResults)); }
private async Task CreateSteps(ExerciseBody exerciseBody, Exercise newExercise) { // delete old await exerciseRepository.DeleteStepsAsync(newExercise.Id); // create new newExercise.ExerciseSteps = new List <ExerciseStep>(); int stepCount = 1; foreach (string step in exerciseBody.Steps) { ExerciseStep newStep = new ExerciseStep { Exercise = newExercise, StepNumber = stepCount, StepDescription = step }; newExercise.ExerciseSteps.Add(newStep); stepCount++; } }
/// <summary> /// /// </summary> /// <param name="tollerances"></param> /// <param name="currentStep"></param> /// <param name="idealExerciseStep"></param> /// <returns></returns> public ArticolationError[] EvaluateExerciseStep(ArticolationTollerance[] tollerances, ExerciseStep currentStep, ExerciseStep idealExerciseStep = null) { // check abiity to evaluate the step if (_isRealTimeSampling && idealExerciseStep == null) { throw new Exception("Unable to evaluate exercise step without ideal sample or a training set!"); } PerformedMovementSteps.Add(currentStep); // eventually keep training the ai (doing this all the following code is the same in both cases) if (idealExerciseStep != null) { _trainingSet.idealMovementSteps.Add(idealExerciseStep); } ExerciseStep previousStep = GetPerformedStep(-1), currentIdealStep = GetIdealStep(0), previousIdealStep = GetIdealStep(-1); if (currentIdealStep == null) { int lastStepIndex = _trainingSet.idealMovementSteps.Count - 1; currentIdealStep = _trainingSet.idealMovementSteps[lastStepIndex]; previousIdealStep = _trainingSet.idealMovementSteps[lastStepIndex - 1]; } List <ArticolationError> articolationErrors = new List <ArticolationError>(); ArticolationPoint currentStepArticolationPoint = currentStep.Root, previousStepArticolationPoint = previousStep == null ? null : previousStep.Root, currentStepIdealArticolationPoint = currentIdealStep.Root, previousStepIdealArticolationPoint = previousIdealStep == null ? null : previousIdealStep.Root; int i = 0; while (currentStepArticolationPoint != null) { ArticolationError articolationError = new ArticolationError(); ArticolationTollerance tollerance = tollerances[i++]; articolationError.Position.Magnitude = currentStepIdealArticolationPoint.Position - currentStepArticolationPoint.Position; Debug.Log("Articolation [" + i + "]"); Debug.Log("ideal position (" + currentStepIdealArticolationPoint.Position.x + ", " + currentStepIdealArticolationPoint.Position.y + ", " + currentStepIdealArticolationPoint.Position.z + ")" ); Debug.Log("real position (" + currentStepArticolationPoint.Position.x + ", " + currentStepArticolationPoint.Position.y + ", " + currentStepArticolationPoint.Position.z + ")" ); articolationError.Position.IsMagnitudeCorrect = articolationError.Position.Magnitude.magnitude < tollerance.positionTolleranceRadius; articolationError.Angle.Magnitude = currentStepIdealArticolationPoint.Angle - currentStepArticolationPoint.Angle; articolationError.Angle.IsMagnitudeCorrect = articolationError.Angle.Magnitude.magnitude < tollerance.rotationTolleranceRadius; CalculateSpeedErrors(articolationError, currentStepArticolationPoint, previousStepArticolationPoint, currentStepIdealArticolationPoint, previousStepIdealArticolationPoint); articolationError.Position.IsSpeedCorrect = articolationError.Position.Speed.magnitude < tollerance.positionSpeedTolleranceRadius; articolationError.Angle.IsSpeedCorrect = articolationError.Angle.Speed.magnitude < tollerance.positionSpeedTolleranceRadius; articolationErrors.Add(articolationError); currentStepArticolationPoint = currentStepArticolationPoint.Substaining; previousStepArticolationPoint = previousStepArticolationPoint == null ? null : previousStepArticolationPoint.Substaining; currentStepIdealArticolationPoint = currentStepIdealArticolationPoint.Substaining; previousStepIdealArticolationPoint = previousStepIdealArticolationPoint == null ? null : previousStepIdealArticolationPoint.Substaining; } return(articolationErrors.ToArray()); }
protected override void Seed(FitotrackContext context) { base.Seed(context); #region __SQL Queries__ #region _Triggers_ #region __ExerciseMusclesDelete__ //// Проверяем есть ли триггер удаления с именем 'DeleteExerciseMusclesCascadeTrig'. //// Если есть - удаляем его. //context.Database.ExecuteSqlCommand("IF EXISTS " + // "(SELECT * FROM sys.objects " + // "WHERE [type] = 'TR' " + // "AND [name] = 'DeleteExerciseMusclesCascadeTrig') " + // "DROP TRIGGER DeleteExerciseMusclesCascadeTrig;"); //// Создаем триггер удаления 'DeleteExerciseMusclesCascadeTrig', //// который будет удалять все ExerciseMuscles записи, связанные с Exercise. //context.Database.ExecuteSqlCommand("CREATE TRIGGER DeleteExerciseMusclesCascadeTrig " + // "ON [dbo].[Exercises] " + // "FOR DELETE " + // "AS " + // "DELETE [dbo].[ExerciseMuscles] " + // "FROM [dbo].[ExerciseMuscles], deleted " + // "WHERE [dbo].[ExerciseMuscles].[ExerciseMusclesId] = deleted.MainMusclesId " + // "OR [dbo].[ExerciseMuscles].[ExerciseMusclesId] = deleted.OtherMusclesId"); #endregion #region __FoodDiaryEntriesDelete__ //// Проверяем есть ли триггер удаления с именем 'DeleteFoodDiaryEntriesCascadeTrig'. //// Если есть - удаляем его. //context.Database.ExecuteSqlCommand("IF EXISTS " + // "(SELECT * FROM sys.objects " + // "WHERE [type] = 'TR' " + // "AND [name] = 'DeleteFoodDiaryEntriesCascadeTrig') " + // "DROP TRIGGER DeleteFoodDiaryEntriesCascadeTrig;"); //// Создаем триггер удаления 'DeleteFoodDiaryEntriesCascadeTrig', //// который будет удалять все FoodDiaryEntry записи, связанные с UserProfile. //context.Database.ExecuteSqlCommand("CREATE TRIGGER DeleteFoodDiaryEntriesCascadeTrig " + // "ON [dbo].[UserProfiles] " + // "FOR DELETE " + // "AS " + // "DELETE [dbo].[FoodDiaryEntries] " + // "FROM [dbo].[FoodDiaryEntries], deleted " + // "WHERE [dbo].[FoodDiaryEntries].[CreateUserId] = deleted.UserId "); #endregion #region __WorkoutDiaryEntriesDelete__ //// Проверяем есть ли триггер удаления с именем 'DeleteWorkoutDiaryEntriesCascadeTrig'. //// Если есть - удаляем его. //context.Database.ExecuteSqlCommand("IF EXISTS " + // "(SELECT * FROM sys.objects " + // "WHERE [type] = 'TR' " + // "AND [name] = 'DeleteWorkoutDiaryEntriesCascadeTrig') " + // "DROP TRIGGER DeleteWorkoutDiaryEntriesCascadeTrig;"); //// Создаем триггер удаления 'DeleteWorkoutDiaryEntriesCascadeTrig', //// который будет удалять все WorkoutDiaryEntry записи, связанные с UserProfile. //context.Database.ExecuteSqlCommand("CREATE TRIGGER DeleteWorkoutDiaryEntriesCascadeTrig " + // "ON [dbo].[UserProfiles] " + // "FOR DELETE " + // "AS " + // "DELETE [dbo].[WorkoutDiaryEntries] " + // "FROM [dbo].[WorkoutDiaryEntries], deleted " + // "WHERE [dbo].[WorkoutDiaryEntries].[CreateUserId] = deleted.UserId "); #endregion #endregion #endregion #if DEBUG //if (System.Diagnostics.Debugger.IsAttached == false) // System.Diagnostics.Debugger.Launch(); #region __Заполняем пользователей__ var UserManager = new UserManager <ApplicationUser, int>(new CustomUserStore(context)); var user = new ApplicationUser(); user.UserName = "******"; user.Email = "*****@*****.**"; string password = "******"; user.UserProfile = new UserProfile { FullName = "Dmitry Tut", DateOfBirth = new DateTime(1988, 5, 14), Gender = 1, Height = 184, ActivityLevel = 3, Location = "Moscow", Weights = { new UserWeight { Date = DateTime.Now, Weight = 80 } } }; var duplicate = UserManager.FindByEmail(user.Email); if (duplicate != null) { UserManager.Delete(duplicate); } var result = UserManager.Create(user, password); if (!result.Succeeded) { throw new Exception(result.Errors.ElementAt(0)); } user = UserManager.FindByEmail(user.Email); if (user == null) { throw new Exception("User object is null."); } //user = UserManager.FindById(user); //context.UserProfiles.AddOrUpdate(userProfile); #endregion #region __Заполняем упражнения__ ExerciseStep[] steps = { new ExerciseStep { Description = "Step1 description", Order = 0 }, new ExerciseStep { Description = "Step2 description", Order = 1 } }; var muscles = new List <ExerciseMuscles> { new ExerciseMuscles { Title = "Back" }, new ExerciseMuscles { Title = "Shoulders" } }; context.Muscles.AddOrUpdate(muscles[0]); context.Muscles.AddOrUpdate(muscles[1]); var exercise = new Exercise { Title = "Exercise 1", Description = "Exercise Description 1", Steps = steps.ToList(), MainMuscles = muscles, //OtherMuscles = new List<ExerciseMuscles>{ // new ExerciseMuscles { // Title = "Abs" // }, // new ExerciseMuscles { // Title = "Calves" // } //}, Type = (int)ExerciseTypes.Strength, Complexity = (int)ExerciseComplexity.BeginningLevel, Mechanics = (int)ExerciseMechanics.Compound, Equipment = new List <ExerciseEquipment> { new ExerciseEquipment { Title = "Bench" }, new ExerciseEquipment { Title = "Ball" } }, CanBeDoneAtHome = false, MET = 2.3M, CreationInfo = new CreationInfo { CreationTimeUTC = DateTime.UtcNow, LastModifiedTimeUTC = DateTime.UtcNow }, CreateUserId = user.Id, CreateUser = user.UserProfile }; context.Exercises.AddOrUpdate(exercise); // Running steps = new ExerciseStep[] { new ExerciseStep { Description = "Wear running shoes.", Order = 0 }, new ExerciseStep { Description = "Go running!", Order = 1 } }; muscles = new List <ExerciseMuscles> { new ExerciseMuscles { Title = "Legs" } }; context.Muscles.AddOrUpdate(muscles[0]); exercise = new Exercise { Title = "Running", Description = "Running is an excelent exercise!", Steps = steps.ToList(), MainMuscles = muscles, Type = (int)ExerciseTypes.Cardio, Complexity = (int)ExerciseComplexity.BeginningLevel, Mechanics = (int)ExerciseMechanics.Compound, //Equipment = new List<ExerciseEquipment>{}, CanBeDoneAtHome = false, MET = 8, CreationInfo = new CreationInfo { CreationTimeUTC = DateTime.UtcNow, LastModifiedTimeUTC = DateTime.UtcNow }, CreateUserId = user.Id, CreateUser = user.UserProfile }; context.Exercises.AddOrUpdate(exercise); #endregion #region __Заполняем дневник упражнений__ var workoutDiaryEntry = new WorkoutDiaryEntry { DateUTC = DateTime.UtcNow, ExerciseId = exercise.ExerciseId, Exercise = exercise, Sets = new List <WorkoutSet> { new WorkoutSet { Order = 0, Reps = 2, Weight = 33, IsCompleted = false }, new WorkoutSet { Order = 1, Reps = 4, Weight = 44, IsCompleted = false } }, CreationInfo = new CreationInfo { CreationTimeUTC = DateTime.UtcNow, LastModifiedTimeUTC = DateTime.UtcNow }, CreateUserId = user.Id, CreateUser = user.UserProfile }; context.WorkoutDiaryEntries.AddOrUpdate(workoutDiaryEntry); #endregion context.SaveChanges(); #endif }