Riferimento Tecnico e Formule
Implementazione Matematica Completa
Guida all'Implementazione
Questa pagina fornisce formule copia-incolla e metodi di calcolo passo-passo per tutte le metriche Run Analytics. Usale per implementazioni personalizzate, verifica, o comprensione più profonda.
⚠️ Note di Implementazione
- Tutti i tempi dovrebbero essere convertiti in secondi per i calcoli
- Il ritmo di corsa è inverso (% più alta = ritmo più lento)
- Valida sempre gli input per range ragionevoli
- Gestisci casi limite (divisione per zero, valori negativi)
Metriche Prestazioni Principali
Critical Run Speed (CRS)
Formula:
CRS (m/s) = (D₂ - D₁) / (T₂ - T₁)
Ritmo CRS/100m (secondi) = (T₄₀₀ - T₂₀₀) / 2
🧪 Calcolatore Interattivo - Testa la Formula
Implementazione JavaScript:
function calculateCRS(distance1, time1, distance2, time2) {
// Converti tempi in secondi se necessario
const t1_seconds = typeof time1 === 'string' ? timeToSeconds(time1) : time1;
const t2_seconds = typeof time2 === 'string' ? timeToSeconds(time2) : time2;
// Calcola CRS in m/s
const crs_ms = (distance2 - distance1) / (t2_seconds - t1_seconds);
// Converti in ritmo per 100m
const pace_per_100m = 100 / crs_ms;
return {
crs_ms: crs_ms,
pace_per_100m: pace_per_100m,
pace_per_km: pace_per_100m * 10,
pace_per_mile: pace_per_100m * 16.09344
};
}
function timeToSeconds(timeString) {
const [minutes, seconds] = timeString.split(':').map(Number);
return minutes * 60 + seconds;
}
Validazione Input:
function validateCRSInputs(d1, t1, d2, t2) {
// Controlla che d2 > d1
if (d2 <= d1) throw new Error("Distanza 2 deve essere maggiore di Distanza 1");
// Controlla che t2 > t1
if (t2 <= t1) throw new Error("Tempo 2 deve essere maggiore di Tempo 1");
// Controlla range ragionevoli
if (d1 < 50 || d1 > 2000) throw new Error("Distanza 1 fuori range (50-2000m)");
if (d2 < 100 || d2 > 5000) throw new Error("Distanza 2 fuori range (100-5000m)");
// Controlla che i ritmi siano ragionevoli (non più lenti di 10 min/km)
const pace1 = t1 / (d1 / 1000);
const pace2 = t2 / (d2 / 1000);
if (pace1 > 600 || pace2 > 600) throw new Error("Ritmo troppo lento");
return true;
}
Training Stress Score (TSS)
Formula:
TSS = (Durata_secondi × IF²) / 36
IF = Ritmo_Normalizzato / CRS_Ritmo
Implementazione JavaScript:
function calculateTSS(duration_seconds, normalized_pace, crs_pace) {
// Calcola Intensity Factor (IF)
const intensity_factor = normalized_pace / crs_pace;
// Calcola TSS
const tss = (duration_seconds * Math.pow(intensity_factor, 2)) / 36;
return Math.round(tss);
}
function calculateNormalizedPace(paces, durations) {
// Per corse a ritmo costante, NP = ritmo medio
// Per corse con variazioni, usa media ponderata
let total_weighted_pace = 0;
let total_duration = 0;
for (let i = 0; i < paces.length; i++) {
total_weighted_pace += paces[i] * durations[i];
total_duration += durations[i];
}
return total_weighted_pace / total_duration;
}
Zone di Allenamento
Formule Zone (basate su CRS):
Zona 1: > 129% CRS (Recupero Attivo)
Zona 2: 114-129% CRS (Base Aerobica)
Zona 3: 106-113% CRS (Aerobico)
Zona 4: 100-105% CRS (Soglia)
Zona 5: < 100% CRS (VO2max)
Implementazione JavaScript:
function calculateTrainingZones(crs_pace_per_km) {
return {
zone1: {
name: "Recupero Attivo",
min_pace: crs_pace_per_km * 1.29,
max_pace: Infinity,
percentage: "129%+"
},
zone2: {
name: "Base Aerobica",
min_pace: crs_pace_per_km * 1.14,
max_pace: crs_pace_per_km * 1.29,
percentage: "114-129%"
},
zone3: {
name: "Aerobico",
min_pace: crs_pace_per_km * 1.06,
max_pace: crs_pace_per_km * 1.13,
percentage: "106-113%"
},
zone4: {
name: "Soglia",
min_pace: crs_pace_per_km * 1.00,
max_pace: crs_pace_per_km * 1.05,
percentage: "100-105%"
},
zone5: {
name: "VO2max",
min_pace: 0,
max_pace: crs_pace_per_km * 1.00,
percentage: "<100%"
}
};
}
function getZoneForPace(pace, zones) {
for (const [zoneNum, zone] of Object.entries(zones)) {
if (pace >= zone.min_pace && pace <= zone.max_pace) {
return {
zone: zoneNum,
name: zone.name,
percentage: zone.percentage
};
}
}
return null;
}
Performance Management Chart (PMC)
Formule:
CTL_oggi = CTL_ieri + (TSS_oggi - CTL_ieri) / 42
ATL_oggi = ATL_ieri + (TSS_oggi - ATL_ieri) / 7
TSB_oggi = CTL_ieri - ATL_oggi
Implementazione JavaScript:
function calculatePMC(tss_history) {
let ctl = 0;
let atl = 0;
const pmc_data = [];
for (let i = 0; i < tss_history.length; i++) {
const tss_today = tss_history[i] || 0;
// Calcola CTL (Chronic Training Load) - 42 giorni
ctl = ctl + (tss_today - ctl) / 42;
// Calcola ATL (Acute Training Load) - 7 giorni
atl = atl + (tss_today - atl) / 7;
// Calcola TSB (Training Stress Balance)
const tsb = ctl - atl;
pmc_data.push({
date: i,
tss: tss_today,
ctl: Math.round(ctl * 10) / 10,
atl: Math.round(atl * 10) / 10,
tsb: Math.round(tsb * 10) / 10
});
}
return pmc_data;
}
Metriche Biomeccaniche
Meccanica del Passo
Formule:
Frequenza Passo (spm) = Passi / (Tempo_minuti / 2)
Lunghezza Passo (m) = Distanza / Numero_Passi
DPS = Distanza_per_Passo (metri)
Implementazione JavaScript:
function calculateStrideMetrics(distance_m, duration_s, steps) {
// Calcola frequenza passo (passi per minuto)
const cadence = (steps / (duration_s / 60));
// Calcola lunghezza passo
const stride_length = distance_m / steps;
// Calcola DPS (Distance Per Stride)
const dps = stride_length;
// Calcola velocità da cadenza e lunghezza passo
const speed_ms = (cadence / 60) * stride_length;
return {
cadence: Math.round(cadence),
stride_length: Math.round(stride_length * 100) / 100,
dps: Math.round(dps * 100) / 100,
speed_ms: Math.round(speed_ms * 100) / 100
};
}
Utilità e Conversioni
Conversioni Tempo e Ritmo
Implementazione JavaScript:
// Converti mm:ss in secondi
function timeToSeconds(timeString) {
const parts = timeString.split(':');
if (parts.length === 2) {
return parseInt(parts[0]) * 60 + parseInt(parts[1]);
} else if (parts.length === 3) {
return parseInt(parts[0]) * 3600 + parseInt(parts[1]) * 60 + parseInt(parts[2]);
}
return 0;
}
// Converti secondi in mm:ss
function secondsToTime(seconds) {
const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60);
return `${mins}:${secs.toString().padStart(2, '0')}`;
}
// Converti ritmo per km in velocità m/s
function paceToSpeed(pace_per_km_seconds) {
return 1000 / pace_per_km_seconds;
}
// Converti velocità m/s in ritmo per km
function speedToPace(speed_ms) {
return 1000 / speed_ms;
}
// Converti miglia in km
function milesToKm(miles) {
return miles * 1.609344;
}
// Converti km in miglia
function kmToMiles(km) {
return km / 1.609344;
}