cle.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. var basehr = 0; //静态心率
  2. var age = 0;
  3. var sex = 0; //1: 男 2: 女
  4. var weight = 0;
  5. //运动强度权重
  6. // var acWeight = {'39': 10, '54': 20, '69': 40, '79': 60, '89': 80, '100': 100};
  7. var acWeight = [0, 10, 20, 40, 60, 80, 100];
  8. //运动强度在各区间的占比
  9. // var acMap = {'39': 0, '54': 0, '69': 0, '79': 0, '89': 0, '100': 0};
  10. var acMap = [0, 0, 0, 0, 0, 0, 0];
  11. //运动数据
  12. var sportInfo = {
  13. intensity: 0, //运动强度
  14. intensityLevel: 0, //运动强度等级
  15. intensityLevelString: '', //运动强度等级说明
  16. intensityLevelColor: '', //运动强度等级颜色
  17. time: 0, //当前时刻的时长 毫秒
  18. total_time: 0, //总运动时间 毫秒
  19. cle: 0, //当前时刻的卡路里
  20. total_cle: 0, //总卡路里
  21. ei: 0, //EI
  22. };
  23. // 计算各项运动数据
  24. //time: 当前时刻的时长 毫秒 hr: 当前心率
  25. function getSportInfo(time, hr) {
  26. sportInfo.intensity = computeSpIntensity(hr); //计算运动强度 0-100
  27. sportInfo.intensityLevel = computeSpIntensityLevel(sportInfo.intensity); //计算运动强度等级
  28. sportInfo.intensityLevelString = getSpIntensityLevelString(sportInfo.intensityLevel);
  29. sportInfo.intensityLevelColor = getSpIntensityLevelColor(sportInfo.intensityLevel);
  30. sportInfo.time = time;
  31. sportInfo.total_time += sportInfo.time;
  32. sportInfo.cle = computeCAL(time, hr);
  33. sportInfo.total_cle += sportInfo.cle;
  34. computeAcMap(sportInfo.intensityLevel);
  35. sportInfo.ei = computeEi(sportInfo.total_cle, sportInfo.total_time);
  36. // console.log("time " + sportInfo.time);
  37. // console.log("total_time " + sportInfo.total_time);
  38. // console.log("cle " + sportInfo.cle);
  39. // console.log("total_cle " + sportInfo.total_cle);
  40. // console.log("ei " + sportInfo.ei);
  41. return sportInfo;
  42. }
  43. function setBaseInfo(_age, _sex, _weight, _basehr) {
  44. age = _age;
  45. sex = _sex;
  46. weight = _weight;
  47. basehr = _basehr;
  48. }
  49. /*
  50. * 计算运动强度 0-100
  51. * 目标心率 = {(220-年龄)-静态心率} × 运动强度% + 静态心率
  52. * 运动强度% = (当前心率 - 静态心率) / {(220-年龄)-静态心率}
  53. */
  54. function computeSpIntensity(hr) {
  55. let intensity = 100 * (hr - basehr) / (220 - age - basehr);
  56. if (intensity > 0)
  57. return Math.round(intensity);
  58. else
  59. return 0;
  60. }
  61. /*
  62. * 计算运动强度等级
  63. * spIntensity: 运动强度
  64. * 强度等级 1 (0%-39%) 激活放松
  65. * 强度等级 2 (40%-54%) 动态热身
  66. * 强度等级 3 (55%-69%) 脂肪燃烧
  67. * 强度等级 4 (70%-79%) 糖分消耗
  68. * 强度等级 5 (80%-89%) 心肺训练
  69. * 强度等级 6 (>=90%) 峰值锻炼
  70. */
  71. function computeSpIntensityLevel(spIntensity) {
  72. if (spIntensity >= 0 && spIntensity <= 39) return 1;
  73. else if (spIntensity >= 40 && spIntensity <= 54) return 2;
  74. else if (spIntensity >= 55 && spIntensity <= 69) return 3;
  75. else if (spIntensity >= 70 && spIntensity <= 79) return 4;
  76. else if (spIntensity >= 80 && spIntensity <= 89) return 5;
  77. else if (spIntensity >= 90) return 6;
  78. else return 0;
  79. }
  80. // spIntensityLevel: 运动强度等级
  81. function getSpIntensityLevelString(spIntensityLevel) {
  82. let str = "";
  83. switch (spIntensityLevel) {
  84. case 0:
  85. str = "暂无数据";
  86. break;
  87. case 1:
  88. str = "激活放松";
  89. break;
  90. case 2:
  91. str = "动态热身";
  92. break;
  93. case 3:
  94. str = "脂肪燃烧";
  95. break;
  96. case 4:
  97. str = "糖分消耗";
  98. break;
  99. case 5:
  100. str = "心肺训练";
  101. break;
  102. case 6:
  103. str = "峰值锻炼";
  104. break;
  105. default:
  106. str = "未知状态";
  107. }
  108. return str;
  109. }
  110. // spIntensityLevel: 运动强度等级
  111. function getSpIntensityLevelColor(spIntensityLevel) {
  112. if (spIntensityLevel == 0) return "#028FE1";
  113. else if (spIntensityLevel == 1) return "#028FE1";
  114. else if (spIntensityLevel == 2) return "#6D29FA";
  115. else if (spIntensityLevel == 3) return "#0AB105";
  116. else if (spIntensityLevel == 4) return "#B9CB01";
  117. else if (spIntensityLevel == 5) return "#EA8813";
  118. else if (spIntensityLevel == 6) return "#D11122";
  119. else return "#028FE1";
  120. }
  121. /*
  122. * 计算总卡路里 (与TAKE数值接近)
  123. * 男:((-55.0969 +(0.6309×HR) +(0.1988 xW)+(0.2017×A))/ 4.184) xT
  124. * 女:((-20.4022 +(0.4472×HR) -(0.1263 xW)+(0.074×A))/ 4.184) xT
  125. * HR =心率(次/分钟) W =体重(kg) A=年龄(岁) T =练习持续时间(分钟)
  126. * time: 毫秒
  127. */
  128. function computeCAL(time, hr) {
  129. let cal = 0.0
  130. if (time > 0 && hr > 0) {
  131. if (1 == sex) //男
  132. cal = ((-55.0969 + (0.6309 * hr) + (0.1988 * weight) + (0.2017 * age)) / 4.184) * time / 1000 / 60;
  133. else //女
  134. cal = ((-20.4022 + (0.4472 * hr) - (0.1263 * weight) + (0.074 * age)) / 4.184) * time / 1000 / 60;
  135. } else {
  136. cal = 0.0;
  137. }
  138. if (cal > 0)
  139. return cal;
  140. else
  141. return 0.0;
  142. }
  143. // 计算运动强度在各区间的占比
  144. // intensityLevel:运动强度等级 1-6
  145. function computeAcMap(intensityLevel) {
  146. if (intensityLevel >= 0 && intensityLevel <= 6)
  147. acMap[intensityLevel]++;
  148. }
  149. //计算EI
  150. //total_cle: 总卡路里 total_time: 总运动时间 毫秒
  151. function computeEi(total_cle, total_time) {
  152. let wi = 0;
  153. let ei = 0;
  154. let time = total_time / 1000 / 60; //转换为分钟
  155. let sumAcMap = 0;
  156. for (n=1; n<=6; n++) {
  157. sumAcMap += acMap[n];
  158. }
  159. for (i=1; i<=6; i++) {
  160. wi = acMap[i] / sumAcMap;
  161. ei += wi * acWeight[i] * total_cle / time;
  162. }
  163. return ei;
  164. }