Referência técnica e fórmulas

Implementação matemática completa (copiar e colar)

Guia de implementação

Fórmulas e passos de cálculo para todas as métricas do Run Analytics. Use para implementar, validar ou entender em profundidade.

⚠️ Notas

  • Converta tempos para segundos antes de calcular
  • Ritmo é inverso (percentual maior = ritmo mais lento)
  • Valide faixas de entrada e trate divisões por zero
  • Mantenha precisão em floats ao lidar com tempos curtos

Métricas de performance

Velocidade Crítica de Corrida (VCC/CRS)

Fórmula

VCC (m/s) = (D₂ - D₁) / (T₂ - T₁)
Ritmo por 100m (s) = (T₄₀₀ - T₂₀₀) / 2

JavaScript

function calculateCRS(distance1, time1, distance2, time2) {
  const t1 = typeof time1 === 'string' ? timeToSeconds(time1) : time1;
  const t2 = typeof time2 === 'string' ? timeToSeconds(time2) : time2;
  const css_ms = (distance2 - distance1) / (t2 - t1);
  const pace100 = 100 / css_ms;
  return { css_ms, pace_seconds: pace100, pace_formatted: secondsToTime(pace100) };
}

rTSS (Running Training Stress Score)

IF = Ritmo de limiar / Ritmo médio
rTSS = (IF²) × Duração (horas) × 100

Nota: Ritmo mais lento → IF menor (inverso de velocidade).

JavaScript

function calculateRTSS(thresholdPaceSecPerKm, avgPaceSecPerKm, durationSeconds) {
  const IF = thresholdPaceSecPerKm / avgPaceSecPerKm;
  const hours = durationSeconds / 3600;
  return IF * IF * hours * 100;
}

CTL / ATL / TSB (PMC)

CTLₙ = CTLₙ₋₁ + (TSSₙ - CTLₙ₋₁) × (1 / τCTL)
ATLₙ = ATLₙ₋₁ + (TSSₙ - ATLₙ₋₁) × (1 / τATL)
TSBₙ = CTLₙ₋₁ - ATLₙ₋₁

Constantes: τCTL=42 dias, τATL=7 dias (padrão enduro).

JavaScript

function ema(prev, value, tau) {
  return prev + (value - prev) * (1 / tau);
}

function nextCTL(prevCTL, todayTSS, tauCTL = 42) {
  return ema(prevCTL, todayTSS, tauCTL);
}

function nextATL(prevATL, todayTSS, tauATL = 7) {
  return ema(prevATL, todayTSS, tauATL);
}

function tsb(yesterdayCTL, yesterdayATL) {
  return yesterdayCTL - yesterdayATL;
}

Running Efficiency (RE)

RE = Ritmo (s/100m) + FC média

Menor é melhor (menos segundos + menor FC = mais eficiência).

Cadência e comprimento de passada

Cadência (passos/min) = (Passos × 60) / Duração (s)
Passos por km = (Passos × 1000) / Distância (m)
Comprimento da passada (m) = Distância / Passos
Relação vertical = Oscilação vertical / Comprimento da passada

Conversões de ritmo e velocidade

Velocidade (km/h) = 3600 / Ritmo (s/km)
Ritmo (s/km) = 3600 / Velocidade (km/h)
function paceToSpeed(paceSecondsPerKm) {
  return 3600 / paceSecondsPerKm; // km/h
}
function speedToPace(speedKmh) {
  return 3600 / speedKmh; // seconds per km
}

Utilitários de tempo

function timeToSeconds(timeString) {
  const [m, s] = timeString.split(':').map(Number);
  return m * 60 + s;
}
function secondsToTime(seconds) {
  const minutes = Math.floor(seconds / 60);
  const secs = Math.round(seconds % 60);
  return `${minutes}:${secs.toString().padStart(2, '0')}`;
}

Adapte para horas se precisar (hh:mm:ss → horas = hh + mm/60 + ss/3600).

Campos comuns em planilhas

  • Duração (h): =SEGUNDOS/3600
  • IF (ritmo): =Ritmo_Limiar / Ritmo_Médio
  • rTSS: =(IF^2)*Duração_h*100
  • CTL: =CTL_prev + (TSS - CTL_prev)/42
  • ATL: =ATL_prev + (TSS - ATL_prev)/7
  • TSB: =CTL_prev - ATL_prev