ឯកសារយោង និងរូបមន្ត
ការអនុវត្តន៍គណិតវិទ្យាពេញលេញ
ការណែនាំអំពីការអនុវត្ត
ទំព័រនេះផ្តល់នូវរូបមន្តចម្លងបិទភ្ជាប់ និងវិធីសាស្ត្រគណនាមួយជំហានម្តងៗសម្រាប់រង្វាស់ Swim Analytics ទាំងអស់។ ប្រើវាសម្រាប់ការអនុវត្តផ្ទាល់ខ្លួន ការផ្ទៀងផ្ទាត់ ឬការយល់ដឹងកាន់តែស៊ីជម្រៅ។
⚠️ កំណត់ចំណាំការអនុវត្ត
- ពេលវេលាទាំងអស់គួរតែត្រូវបានបំប្លែងទៅជាវិនាទីសម្រាប់ការគណនា
- ល្បឿនហែលទឹកគឺបញ្ច្រាស (ខ្ពស់ជាង % = ល្បឿនយឺត)
- តែងតែធ្វើឱ្យធាតុចូលមានសុពលភាពសម្រាប់ជួរសមហេតុផល
- ដោះស្រាយករណីគែម (ចែកដោយសូន្យ តម្លៃអវិជ្ជមាន)
សូចនាករការអនុវត្តស្នូល
ល្បឿនហែលទឹកសំខាន់ (CSS)
រូបមន្ត៖
CSS (m/s) = (D₂ - D₁) / (T₂ - T₁)
CSS Pace/100m (វិនាទី) = (T₄₀₀ - T₂₀₀) / 2
🧪 ការគណនាអន្តរកម្ម - សាកល្បងរូបមន្ត
CSS ល្បឿនក្នុង 100 ម៉ែត្រ៖
1:49
ជំហានគណនា៖
CSS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
Pace/100m = 100 / 0.917 = 109 វិនាទី = 1:49
CSS (m/s) = (400 - 200) / (368 - 150) = 0.917 m/s
Pace/100m = 100 / 0.917 = 109 វិនាទី = 1:49
ការអនុវត្ត JavaScript៖
មុខងារគណនាCSS(ចម្ងាយ1,ពេលវេលា1,ចម្ងាយ2,ពេលវេលា2) {
// បំលែងពេលវេលាទៅជាវិនាទីប្រសិនបើចាំបាច់
const t1 = typeof time1 === 'string' ? timeToSeconds(time1): time1;
const t2 = typeof time2 === 'string' ? timeToSeconds(time2): time2;
// គណនា CSS ក្នុង m/s
const css_ms = (ចម្ងាយ 2 - ចម្ងាយ1) / (t2 - t1);
// គណនាល្បឿនក្នុង 100 ម៉ែត្រក្នុងមួយវិនាទី
const pace_per_100m = 100 / css_ms;
// បំលែងទៅជាទម្រង់ mm:ss
const នាទី = Math.floor(pace_per_100m / 60);
const វិនាទី = Math.round(pace_per_100m % 60);
ត្រឡប់ {
css_ms៖ css_ms,
ល្បឿន_វិនាទី៖ pace_per_100m,
pace_formatted៖ `${minutes}:${seconds.toString().padStart(2, '0')}`
};
}
// ឧទាហរណ៍ការប្រើប្រាស់៖
លទ្ធផល const = គណនា CSS(200, 150, 400, 368);
// ត្រឡប់៖ { css_ms: 0.917, pace_seconds: 109, pace_formatted: "1:49" }
ពិន្ទុស្ត្រេសហ្វឹកហាត់ហែលទឹក (sTSS)
រូបមន្តពេញលេញ៖
sTSS= (IF³) × រយៈពេល (ម៉ោង) × 100
IF = NSS / FTP
NSS = ចម្ងាយសរុប / ពេលវេលាសរុប (m/min)
🧪 ការគណនាអន្តរកម្ម - សាកល្បងរូបមន្ត
គណនា sTSS៖
៥៥
ជំហានគណនា៖
NSS = 3000m / 55min = 54.5 m/min
FTP = 100 / (93/60) = 64.5 m/min
IF = 54.5 / 64.5 = 0.845
sTSS = 0.845³ × (55/60) × 100 = 55
NSS = 3000m / 55min = 54.5 m/min
FTP = 100 / (93/60) = 64.5 m/min
IF = 54.5 / 64.5 = 0.845
sTSS = 0.845³ × (55/60) × 100 = 55
ការអនុវត្ត JavaScript៖
មុខងារគណនាSTSS(ចម្ងាយ ពេលវេលានាទី ftpMetersPerMin) {
// គណនាល្បឿនហែលទឹកធម្មតា។
const nss = ចម្ងាយ / ម៉ោងនាទី;
// គណនាកត្តាអាំងតង់ស៊ីតេ
const intensityFactor = nss / ftpMetersPerMin;
// គណនាម៉ោង
ម៉ោង const = timeminutes / 60;
// គណនា sTSS ដោយប្រើកត្តាអាំងតង់ស៊ីតេគូប
const stss = Math.pow(អាំងតង់ស៊ីតេកត្តា, 3) * ម៉ោង * 100;
ត្រឡប់ Math.round(stss);
}
// ឧទាហរណ៍ការប្រើប្រាស់៖
const stss = គណនាSTSS(3000, 55, 64.5);
// ត្រឡប់ៈ ៥៥
// អ្នកជំនួយ៖ បំប្លែង CSS ទៅ FTP
មុខងារ cssToFTP(cssPacePer100mSeconds) {
// FTP ក្នុង m/min = 100m / (ល្បឿនក្នុងមួយនាទី)
ត្រឡប់ 100 / (cssPacePer100mSeconds / 60);
}
// ឧទាហរណ៍៖ CSS នៃ 1:33 (93 វិនាទី)
const ftp = cssToFTP(93); // ត្រឡប់: 64.5 m/min
SWOLF
រូបមន្ត៖
SWOLF = ពេលវេលាលើក (វិនាទី) + ចំនួនដាច់សរសៃឈាមខួរក្បាល
SWOLF₂₅ = (ពេលវេលា × 25/ប្រវែងអាង) + (Strokes × 25/ប្រវែងអាង)
🧪 ការគណនាអន្តរកម្ម - សាកល្បងរូបមន្ត
SWOLF ពិន្ទុ៖
៣៥
ការគណនា៖
SWOLF = 20s + 15 strokes = 35
SWOLF = 20s + 15 strokes = 35
ការអនុវត្ត JavaScript៖
មុខងារគណនាSWOLF(timeSeconds, strokeCount) {
ពេលវេលាត្រឡប់វិនាទី + ចំនួន stroke;
}
មុខងារគណនាNormalizedSWOLF(timeSeconds, strokeCount, poolLength) {
const normalizedTime = timeSeconds * (25 / poolLength);
const normalizedStrokes = strokeCount * (25 / poolLength);
ត្រឡប់ normalizedTime + normalizedStrokes;
}
// ឧទាហរណ៍៖
const swolf = គណនា SWOLF(20, 15);
// ត្រឡប់៖ ៣៥
const swolf50m = គណនាNormalizedSWOLF(40, 30, 50);
// ត្រលប់មកវិញ៖ 35 (ធម្មតាដល់ 25 ម)
មេកានិចដាច់សរសៃឈាមខួរក្បាល
អត្រាដាច់សរសៃឈាមខួរក្បាល (SR)
រូបមន្ត៖
SR = 60 / ពេលវេលាវដ្ត (វិនាទី)
SR = (ចំនួន Strokes / Time in seconds) × 60
🧪 ការគណនាអន្តរកម្ម - សាកល្បងរូបមន្ត
អត្រាជំងឺដាច់សរសៃឈាមខួរក្បាល (SPM):
៧២
ការគណនា៖
SR = (30/25) × 60 = 72 SPM
SR = (30/25) × 60 = 72 SPM
ការអនុវត្ត JavaScript៖
មុខងារគណនាStrokeRate(strokeCount, timeSeconds) {
ត្រឡប់ (strokeCount / timeSeconds) * 60;
}
// ឧទាហរណ៍៖
const sr = គណនាStrokeRate(30, 25);
// ត្រលប់មកវិញ៖ 72 SPM
Distance Per Stroke (DPS)
រូបមន្ត៖
DPS = ចំនួនចម្ងាយ / ដាច់សរសៃឈាមខួរក្បាល
DPS = ចម្ងាយ / (SR / 60)
ការអនុវត្ត JavaScript៖
មុខងារគណនាDPS(ចម្ងាយ, strokeCount, pushoffDistance = 0) {
const effectiveDistance=ចម្ងាយ - pushoffDistance;
ត្រឡប់មានប្រសិទ្ធិភាពចម្ងាយ / strokeCount;
}
// ឧទាហរណ៍ (អាង 25m, 5m push-off):
const dps = គណនា DPS(25, 12, 5);
// ត្រលប់មកវិញ៖ 1.67 m/stroke
// សម្រាប់ការលើកច្រើន៖
const dps100m = គណនាDPS(100, 48, 4 * 5);
// ត្រឡប់ៈ 1.67 m/stroke (4 laps × 5m push-off)
ល្បឿនពី SR និង DPS
រូបមន្ត៖
ល្បឿន (m/s) = (SR/60) × DPS
ការអនុវត្ត JavaScript៖
មុខងារគណនាល្បឿន(strokeRate, dps) {
ត្រឡប់ (strokeRate / 60) * dps;
}
// ឧទាហរណ៍៖
const velocity = គណនាល្បឿន(70, 1.6);
// ត្រឡប់: 1.87 m/s
សន្ទស្សន៍ជំងឺដាច់សរសៃឈាមខួរក្បាល (SI)
រូបមន្ត៖
SI = ល្បឿន (m/s) × DPS (m/stroke)
ការអនុវត្ត JavaScript៖
មុខងារគណនាStrokeIndex(ល្បឿន, dps) {
ល្បឿនត្រឡប់ * dps;
}
// ឧទាហរណ៍៖
const si = គណនាStrokeIndex(1.5, 1.7);
// ត្រឡប់៖ 2.55
តារាងគ្រប់គ្រងការអនុវត្ត (PMC)
CTL, ATL, TSB ការគណនា
រូបមន្ត៖
CTL ថ្ងៃនេះ = CTL ម្សិលមិញ + (TSS ថ្ងៃនេះ - CTL ម្សិលមិញ) × (1/42)
ATL ថ្ងៃនេះ = ATL ម្សិលមិញ + (TSS ថ្ងៃនេះ - ATL ម្សិលមិញ) × (1/7)
TSB= CTL ម្សិលមិញ - ATL ម្សិលមិញ
ការអនុវត្ត JavaScript៖
មុខងារអាប់ដេតCTL(ពីមុនCTL, todayTSS) {
ត្រឡប់ PreviousCTL + (ថ្ងៃនេះTSS - PreviousCTL) * (1/42);
}
មុខងារអាប់ដេតATL(ពីមុនATL, todayTSS) {
ត្រឡប់ PreviousATL + (ថ្ងៃនេះTSS - PreviousATL) * (1/7);
}
មុខងារគណនាTSB(ម្សិលមិញCTL, ម្សិលមិញATL) {
ត្រឡប់ម្សិលមិញCTL - ម្សិលមិញATL;
}
// គណនា PMC សម្រាប់ស៊េរីនៃការហាត់ប្រាណ
មុខងារគណនាPMC(ការហាត់ប្រាណ) {
អនុញ្ញាតឱ្យ ctl = 0, atl = 0;
លទ្ធផល const = [];
workouts.forEach(ហាត់ប្រាណ => {
ctl = updateCTL(ctl, workout.tss);
atl = updateATL(atl, workout.tss);
const tsb = គណនាTSB(ctl, atl);
results.push({
កាលបរិច្ឆេទ៖ workout.date,
tss: workout.tss,
ctl: Math.round(ctl * 10) / 10,
atl: Math.round(atl * 10) / 10,
tsb: Math.round(tsb * 10) / 10
});
});
លទ្ធផលត្រឡប់មកវិញ;
}
// ឧទាហរណ៍ការប្រើប្រាស់៖
លំហាត់ const = [
{ កាលបរិច្ឆេទ៖ '2025-01-01', tss: 50 },
{ កាលបរិច្ឆេទ៖ '2025-01-02', tss: 60 },
{កាលបរិច្ឆេទ៖ '2025-01-03', tss: 45 },
// ... លំហាត់ច្រើនទៀត
];
const pmc = គណនាPMC(ការហាត់ប្រាណ);
// ត្រឡប់អារេជាមួយ CTL, ATL, TSB សម្រាប់មួយថ្ងៃៗ
ការគណនាកម្រិតខ្ពស់
CSS ពីចម្ងាយច្រើន (វិធីសាស្ត្រតំរែតំរង់)
ការអនុវត្ត JavaScript៖
មុខងារគណនាCSSRegression(ចម្ងាយ, ដង) {
// តំរែតំរង់លីនេអ៊ែរ៖ ចម្ងាយ = a + b * ពេលវេលា
const n = distances.length;
const sumX = times.reduce((a, b) => a + b, 0);
const sumY = distances.reduce((a, b) => a + b, 0);
const sumXY = times.reduce((sum, x, i) => sum + x * distances[i], 0);
const sumXX = times.reduce((sum, x) => sum + x * x, 0);
const ជម្រាល = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
const intercept = (sumY - ជម្រាល * sumX) / n;
ត្រឡប់ {
css: ជម្រាល // ល្បឿនហែលទឹកសំខាន់ (m/s)
សមត្ថភាព anaerobic: ស្ទាក់ចាប់ // សមត្ថភាពចំងាយ anaerobic (m)
};
}
// ឧទាហរណ៍ជាមួយចម្ងាយសាកល្បងច្រើន៖
ចម្ងាយ const = [100, 200, 400, 800];
const ដង = [65, 150, 340, 720]; // នៅក្នុងវិនាទី
const លទ្ធផល = គណនាCSSRegression(ចម្ងាយ, ដង);
// ត្រឡប់៖ { css: 1.18, anaerobic_capacity: 15.3 }
កត្តាអាំងតង់ស៊ីតេពីផេស
ការអនុវត្ត JavaScript៖
មុខងារគណនាIntensityFactor(actualPace100m, thresholdPace100m) {
// បំប្លែងល្បឿនទៅជាល្បឿន (m/s)
const actualSpeed = 100 / actualPace100m;
const thresholdSpeed = 100 / thresholdPace100m;
ត្រឡប់ពិតល្បឿន / កម្រិតល្បឿន;
}
// ឧទាហរណ៍៖
const if_value = គណនាIntensityFactor(110, 93);
// ត្រលប់មកវិញ៖ 0.845 (ហែលទឹកនៅកម្រិត 84.5%)
Pace Consistency Analysis
ការអនុវត្ត JavaScript៖
មុខងារវិភាគPaceConsistency(laps) {
const paces = laps.map(lap => lap.distance / lap.time);
const avgPace = paces.reduce((a, b) => a + b) / paces.length;
const variance = paces.reduce((sum, pace) =>
ផលបូក + Math.pow(pace - avgPace, 2), 0) / paces.length;
const stdDev = Math.sqrt(វ៉ារ្យង់);
const coefficientOfVariation = (stdDev / avgPace) * 100;
ត្រឡប់ {
avgPace,
stdDev,
មេគុណបំរែបំរួល,
ភាពជាប់លាប់៖ coefficientOfVariation < 5 ? "ល្អឥតខ្ចោះ":
coefficientOfVariation < 10 ? "ល្អ":
coefficientOfVariation < 15 ? "មធ្យម": "អថេរ"
};
}
// ឧទាហរណ៍៖
const laps = [
{ ចម្ងាយ៖ ១០០, ពេលវេលា៖ ៧០ },
{ ចម្ងាយ៖ ១០០, ពេលវេលា៖ ៧២ },
{ ចម្ងាយ៖ ១០០, ពេលវេលា៖ ៧១ },
//...
];
const analysis = វិភាគPaceConsistency(laps);
// ត្រឡប់៖ { avgPace: 1.41, stdDev: 0.02, coefficientOfVariation: 1.4, ភាពស៊ីសង្វាក់គ្នា៖ "ល្អឥតខ្ចោះ" }
ការរកឃើញភាពអស់កម្លាំងពីចំនួនជំងឺដាច់សរសៃឈាមខួរក្បាល
ការអនុវត្ត JavaScript៖
មុខងាររកឃើញភាពអស់កម្លាំង (laps) {
const firstThird = laps.slice(0, Math.floor(laps.length/3));
const lastThird = laps.slice(-Math.floor(laps.length/3));
const firstThirdAvg = firstThird.reduce((ផលបូក, lap) =>
sum + lap.strokeCount, 0) / firstThird.length;
const lastThirdAvg = lastThird.reduce((ផលបូក, lap) =>
sum + lap.strokeCount, 0) / lastThird.length;
const strokeCountIncrease = ((lastThirdAvg - firstThirdAvg) / firstThirdAvg) * 100;
ត្រឡប់ {
firstThirdAvg៖ Math.round(firstThirdAvg * 10) / 10,
LastThirdAvg៖ Math.round(lastThirdAvg * 10) / 10,
ភាគរយកើនឡើង៖ Math.round(strokeCountIncrease * 10) / 10,
ភាពអស់កម្លាំងកម្រិត៖ ជំងឺដាច់សរសៃឈាមខួរក្បាលចំនួនកើនឡើង < 5 ? "អប្បបរមា"៖
strokeCountIncrease < 10 ? "មធ្យម"៖
strokeCountIncrease < 20 ? "សំខាន់": "ធ្ងន់ធ្ងរ"
};
}
// ឧទាហរណ៍៖
const laps = [
{ stroke Count: 14 }, { strokeCount: 14 }, { stroke Count: 15 },
{ stroke Count: 15 }, { strokeCount: 16 }, { stroke Count: 16 },
{ stroke Count: 17 }, { stroke Count: 18 }, { stroke Count: 18 }
];
const fatigue = រកឃើញភាពអស់កម្លាំង(laps);
// ត្រឡប់៖ { firstThirdAvg: 14.3, lastThirdAvg: 17.7, ភាគរយកើនឡើង: 23.8, fatigueLevel: "Severe" }
សុពលភាពទិន្នន័យ
ការត្រួតពិនិត្យគុណភាពទិន្នន័យ Workout
ការអនុវត្ត JavaScript៖
មុខងារ validateWorkoutData (ហាត់ប្រាណ) {
បញ្ហា const = [];
// ពិនិត្យមើលជួរល្បឿនសមរម្យ (1:00-5:00 ក្នុង 100m)
const avgPace = (workout.totalTime / workout.totalDistance) * 100;
ប្រសិនបើ (avgPace < 60 || avgPace > 300) {
issue.push(`ល្បឿនមធ្យមមិនធម្មតា៖ ${Math.round(avgPace)}s ក្នុង 100m`);
}
// ពិនិត្យមើលចំនួនដាច់សរសៃឈាមខួរក្បាលសមហេតុផល (10-50 ក្នុង 25m)
const avgStrokesPer25m = (workout.totalStrokes / workout.totalDistance) * 25;
ប្រសិនបើ (avgStrokesPer25m < 10 || avgStrokesPer25m > 50) {
issues.push(`ការរាប់ការដាច់សរសៃឈាមខួរក្បាលមិនធម្មតា៖ ${Math.round(avgStrokesPer25m)} ក្នុង 25m`);
}
// ពិនិត្យមើលអត្រាដាច់សរសៃឈាមខួរក្បាលដែលសមហេតុផល (30-150 SPM)
const avgSR = គណនាStrokeRate(workout.totalStrokes, workout.totalTime);
ប្រសិនបើ (avgSR < 30 || avgSR > 150) {
issue.push(`អត្រាដាច់សរសៃឈាមខួរក្បាលមិនធម្មតា៖ ${Math.round(avgSR)} SPM`);
}
// ពិនិត្យមើលការខកខាន (ចន្លោះពេល)
ប្រសិនបើ (workout.laps && workout.laps.length > 1) {
សម្រាប់ (អនុញ្ញាតឱ្យ i = 1; i < workout.laps.length; i++) {
const gap = workout.laps[i].startTime -
(workout.laps[i-1].startTime + workout.laps[i-1].duration);
ប្រសិនបើ (គម្លាត> 300) { // គម្លាត 5 នាទី។
issue.push(`គម្លាតធំត្រូវបានរកឃើញរវាង laps ${i} និង ${i+1}`);
}
}
}
ត្រឡប់ {
isValid: issues.length === 0,
បញ្ហា
};
}
// ឧទាហរណ៍៖
const workout = {
ចម្ងាយសរុប៖ ២០០០,
ពេលវេលាសរុប: 1800, // 30 នាទី។
សរុប៖ ៨០០,
laps: [/* laps data */]
};
const validation = validateWorkoutData(ការហាត់ប្រាណ);
// ត្រឡប់៖ { ត្រឹមត្រូវ៖ ពិត បញ្ហា៖ [] }
មុខងារជំនួយ
ឧបករណ៍បំប្លែងពេលវេលា
ការអនុវត្ត JavaScript៖
// បំប្លែង mm:ss ទៅជាវិនាទី
មុខងារ timeToSeconds(timeString) {
ផ្នែក const = timeString.split(':');
ត្រឡប់ parseInt(parts[0]) * 60 + parseInt(parts[1]);
}
// បំប្លែងវិនាទីទៅជា mm:ss
មុខងារ secondsToTime(វិនាទី) {
នាទី const = Math.floor(វិនាទី / 60);
const secs = Math.round(វិនាទី % 60);
ត្រឡប់ `${minutes}:${secs.toString().padStart(2, '0')}`;
}
// បំប្លែងវិនាទីទៅជា hh:mm:ss
មុខងារ secondsToTimeDetailed(វិនាទី) {
const ម៉ោង = Math.floor(វិនាទី / 3600);
const នាទី = Math.floor((វិនាទី % 3600) / 60);
const secs = Math.round(វិនាទី % 60);
ត្រឡប់ `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}
// ឧទាហរណ៍៖
timeToSeconds("1:33"); // ត្រឡប់៖ ៩៣
secondsToTime(93); // ត្រឡប់: "1:33"
secondsToTimeDetailed(៣៦៦៥); // ត្រឡប់៖ "1:01:05"
ធនធានអនុវត្ត
រូបមន្តទាំងអស់នៅលើទំព័រនេះគឺត្រៀមខ្លួនជាស្រេចក្នុងការផលិត និងមានសុពលភាពប្រឆាំងនឹងអក្សរសិល្ប៍វិទ្យាសាស្រ្ត។ ប្រើពួកវាសម្រាប់ឧបករណ៍វិភាគផ្ទាល់ខ្លួន ការផ្ទៀងផ្ទាត់ ឬការយល់ដឹងកាន់តែស៊ីជម្រៅអំពីការគណនាការហែលទឹក។
💡 ការអនុវត្តល្អបំផុត
- ធ្វើឱ្យធាតុចូលមានសុពលភាព៖ពិនិត្យរកជួរសមហេតុផល មុននឹងគណនា
- ដោះស្រាយករណីគែម៖ការបែងចែកដោយសូន្យ តម្លៃអវិជ្ជមាន ទិន្នន័យទទេ
- មូលសមគួរ៖CTL/ATL/TSB ទៅ 1 ទសភាគ sTSS ទៅចំនួនគត់
- ភាពជាក់លាក់នៃហាង៖រក្សាភាពជាក់លាក់ពេញលេញនៅក្នុងមូលដ្ឋានទិន្នន័យ ជុំសម្រាប់ការបង្ហាញ
- សាកល្បងហ្មត់ចត់៖ប្រើទិន្នន័យល្អដែលគេស្គាល់ ដើម្បីផ្ទៀងផ្ទាត់ការគណនា