Peak Acceleration
${peakAcceleration.toFixed(2)} m/s²
Split Details
| Segment |
Speed |
Acceleration |
${tableRows}
Performance Chart
${chartHTML}
`;
resultsContainer.innerHTML = resultsHTML;
document.getElementById('download-pdf-btn').addEventListener('click', downloadPdf);
}
// --- PDF GENERATION ---
function downloadPdf() {
if (!analysisData) return;
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const peakSpeed = Math.max(...analysisData.map(d => d.speed));
const peakAcceleration = Math.max(...analysisData.map(d => d.acceleration));
// Header
doc.setFontSize(22);
doc.setFont('helvetica', 'bold');
doc.text('Sprint Performance Analysis', 105, 20, { align: 'center' });
// Summary
doc.setFontSize(12);
doc.setFont('helvetica', 'normal');
doc.text(`Report Generated: ${new Date().toLocaleDateString()}`, 20, 35);
doc.setFontSize(14);
doc.text(`Peak Speed: ${peakSpeed.toFixed(2)} m/s`, 20, 45);
doc.text(`Peak Acceleration: ${peakAcceleration.toFixed(2)} m/s²`, 20, 52);
// Table
const tableData = analysisData.map(d => [d.segment, d.speed.toFixed(2), d.acceleration.toFixed(2)]);
doc.autoTable({
startY: 60,
head: [['Segment', 'Speed (m/s)', 'Acceleration (m/s²)']],
body: tableData,
theme: 'grid',
headStyles: { fillColor: [79, 70, 229] }, // Indigo
});
doc.save('Sprint-Analysis.pdf');
}
// --- EVENT LISTENERS ---
calculateBtn.addEventListener('click', analyzePerformance);
updateRemoveButtons(); // Initial call
});