ឯកសារយោង និងរូបមន្ត

ការអនុវត្តន៍គណិតវិទ្យាពេញលេញ

ការណែនាំអំពីការអនុវត្ត

ទំព័រនេះផ្តល់នូវរូបមន្តចម្លងបិទភ្ជាប់ និងវិធីសាស្ត្រគណនាមួយជំហានម្តងៗសម្រាប់រង្វាស់ 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

ការអនុវត្ត 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

ការអនុវត្ត 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

ការអនុវត្ត 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

ការអនុវត្ត 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 ទៅចំនួនគត់
  • ភាពជាក់លាក់នៃហាង៖រក្សាភាពជាក់លាក់ពេញលេញនៅក្នុងមូលដ្ឋានទិន្នន័យ ជុំសម្រាប់ការបង្ហាញ
  • សាកល្បងហ្មត់ចត់៖ប្រើទិន្នន័យល្អដែលគេស្គាល់ ដើម្បីផ្ទៀងផ្ទាត់ការគណនា