exercise.dart 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import '../../../navigation/utils/geometry_utils.dart';
  2. import '../widgets/pose_detector.dart';
  3. class Exercise {
  4. final int reps;
  5. final int series;
  6. final Criteria startMovement;
  7. final Criteria endMovement;
  8. const Exercise({
  9. required this.reps,
  10. required this.series,
  11. required this.startMovement,
  12. required this.endMovement,
  13. });
  14. bool isAtStartMovement(MeanFilteredData meanFilteredData) {
  15. return startMovement.isAtPosition(meanFilteredData);
  16. }
  17. bool isAtEndMovement(MeanFilteredData meanFilteredData) {
  18. return endMovement.isAtPosition(meanFilteredData);
  19. }
  20. }
  21. abstract class Criteria {
  22. bool isAtPosition(MeanFilteredData meanFilteredData);
  23. }
  24. class CriteriaDistance implements Criteria {
  25. final int jointStart;
  26. final int jointEnd;
  27. final int axis;
  28. final int threshold;
  29. const CriteriaDistance({
  30. required this.jointStart,
  31. required this.jointEnd,
  32. required this.axis,
  33. required this.threshold,
  34. });
  35. @override
  36. bool isAtPosition(MeanFilteredData meanFilteredData) {
  37. final landmarks = meanFilteredData.toList();
  38. final start = landmarks[jointStart][axis];
  39. final end = landmarks[jointEnd][axis];
  40. final distance = (start - end).abs();
  41. return distance < threshold;
  42. }
  43. }
  44. class CriteriaAngle implements Criteria {
  45. final int jointStart;
  46. final int jointCenter;
  47. final int jointEnd;
  48. final int threshold;
  49. const CriteriaAngle({
  50. required this.jointStart,
  51. required this.jointCenter,
  52. required this.jointEnd,
  53. required this.threshold,
  54. });
  55. @override
  56. bool isAtPosition(MeanFilteredData meanFilteredData) {
  57. final landmarks = meanFilteredData.toList();
  58. final start = Point3D(x: landmarks[jointStart][0], y: landmarks[jointStart][1], z: landmarks[jointStart][2]);
  59. final center = Point3D(x: landmarks[jointCenter][0], y: landmarks[jointCenter][1], z: landmarks[jointCenter][2]);
  60. final end = Point3D(x: landmarks[jointEnd][0], y: landmarks[jointEnd][1], z: landmarks[jointEnd][2]);
  61. final angle = DistanceUtils.angleBetweenThreePoints(start, center, end).round();
  62. return angle > threshold;
  63. }
  64. }