UNPKG

bowling-analysis-system

Version:

A comprehensive system for analyzing bowling techniques using video processing and metrics calculation

113 lines (96 loc) 3.66 kB
/** * @module bowling_analysis/metrics/calculators/RotationCalculator * @description Calculator for rotation-related metrics */ /** * Calculate rotation-related metrics * @param {Array} keypointData - Array of keypoint frames * @param {Array} validFrames - Array of valid keypoint frames * @param {Object} options - Calculator options * @returns {Promise<Object>} Rotation metrics */ async function calculate(keypointData, validFrames, options = {}) { try { const { debug, includeTimeSeries } = options; // Initialize result const result = {}; // Initialize time series const timeSeries = {}; // Process combined rotation metrics (with left/right variants) const combinedRotationMetrics = [ 'armRotations', 'shoulderRotations', 'hipRotations', 'pelvisRotations', 'trunkRotations', 'wristRotations', 'footRotations' ]; // Process individual rotation metrics (no left/right) const individualRotationMetrics = [ 'spineRotation', 'torsoRotation', 'pelvisRotation', 'shoulderRotation', 'armRotation', 'approachRotation', 'releaseRotation', 'followThroughRotation', 'totalBodyRotation', 'angularMomentum', 'rotationalVelocity', 'rotationalAcceleration', 'rotationalPower' ]; // TODO: Implement actual rotation calculations // For this stub, we'll just create placeholder data // Process combined rotation metrics for (const metricName of combinedRotationMetrics) { // Create the combined rotation metric result[metricName] = { left: Math.random() * 360, // Placeholder: 0 to 360 degrees right: Math.random() * 360, // Placeholder: 0 to 360 degrees asymmetry: Math.random() * 0.2 // Placeholder }; // Create time series data if enabled if (includeTimeSeries) { const leftValues = Array(keypointData.length).fill(null); const rightValues = Array(keypointData.length).fill(null); // Fill in values for valid frames for (let i = 0; i < validFrames.length; i++) { const frameIndex = validFrames[i].index || i; leftValues[frameIndex] = Math.random() * 360; // Placeholder: 0 to 360 degrees rightValues[frameIndex] = Math.random() * 360; // Placeholder: 0 to 360 degrees } timeSeries[`${metricName}.left`] = leftValues; timeSeries[`${metricName}.right`] = rightValues; } } // Process individual rotation metrics for (const metricName of individualRotationMetrics) { // Create the individual rotation metric result[metricName] = Math.random() * 360; // Placeholder: 0 to 360 degrees // Create time series data if enabled if (includeTimeSeries) { const values = Array(keypointData.length).fill(null); // Fill in values for valid frames for (let i = 0; i < validFrames.length; i++) { const frameIndex = validFrames[i].index || i; values[frameIndex] = Math.random() * 360; // Placeholder: 0 to 360 degrees } timeSeries[metricName] = values; } } // Add time series data if enabled if (includeTimeSeries) { result.timeSeries = timeSeries; } return result; } catch (error) { console.error(`Error calculating rotation metrics: ${error.message}`); return {}; } } module.exports = { calculate };