// Зоны пульса: 50/70/85 % от макс. ЧСС (Ф-2.2). // Макс. ЧСС хранится в масштабе ×10 (maxBpm10) — весь расчёт целочисленный, // без Float; формула Танаки 208 − 0,7×возраст тоже считается в ×10. class ZoneCalc { // Идентификаторы зон (цвет на экране дублируется подписью) var ZONE_NONE = 0; // нет данных — прочерк var ZONE_BLUE = 1; // < 50 % — восстановление var ZONE_GREEN = 2; // 50–70 % — лёгкая var ZONE_YELLOW = 3; // 70–85 % — средняя var ZONE_RED = 4; // ≥ 85 % — высокая // Макс. ЧСС ×10: ручное значение (>0) приоритетно, иначе Танака от возраста. // Возраст вне 14–100 — умолчание 45. function maxBpm10For(hrMaxBpm, age) { if (hrMaxBpm != null && hrMaxBpm > 0) { return hrMaxBpm * 10; } if (age == null || age < 14 || age > 100) { age = 45; } return 2080 - 7 * age; } // Зона по пульсу. Пороги в целых числах (масштаб ×10): // 50 % → bpm×20 < maxBpm10; 70 % → bpm×100 < maxBpm10×7; 85 % → bpm×200 < maxBpm10×17 function zoneFor(bpm, maxBpm10) { if (bpm == null || bpm <= 0 || maxBpm10 == null || maxBpm10 <= 0) { return ZONE_NONE; } if (bpm * 20 < maxBpm10) { return ZONE_BLUE; } if (bpm * 100 < maxBpm10 * 7) { return ZONE_GREEN; } if (bpm * 200 < maxBpm10 * 17) { return ZONE_YELLOW; } return ZONE_RED; } }