Finish up weight generation
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { type Metrics } from "$lib/services/calculator/main";
|
||||
import avgWeightDataRaw from "$lib/data/avg-weights.json"
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
// DATA MODELS
|
||||
@@ -47,8 +48,9 @@ export const minToMs = (min: number) => min * 60000;
|
||||
export const secToMs = (sec: number) => sec * 1000;
|
||||
export const msToMin = (ms: number) => ms / 60000;
|
||||
|
||||
export const feetToCm = (feet: number) => feet * 30.48;
|
||||
export const inchesToCm = (inches: number) => inches * 2.54;
|
||||
export const ftToCm = (ft: number) => ft * 30.48;
|
||||
export const inToCm = (inches: number) => inches * 2.54;
|
||||
export const cmToIn = (cm: number) => cm / 2.54;
|
||||
|
||||
export const msToTime = (ms: number, includeMs = false): string => {
|
||||
const minutes = Math.floor(ms / 60000);
|
||||
@@ -64,4 +66,65 @@ export const msToTime = (ms: number, includeMs = false): string => {
|
||||
|
||||
export const range = (length: number) => Array.from({ length: length }, (_, i) => i + 1);
|
||||
|
||||
// export const getAvgWeight = (gender: Gender, age: number) => {
|
||||
// type AvgWeightData = {
|
||||
// metadata: {
|
||||
// unit: StandardUnit
|
||||
// },
|
||||
// weights: Metrics[]
|
||||
// }
|
||||
// let avgWeightData = avgWeightDataRaw as AvgWeightData;
|
||||
//
|
||||
// const avgWeights = avgWeightData.weights.filter(a => a.gender === gender);
|
||||
//
|
||||
// let lower = avgWeights[0]; // best <= target
|
||||
// let upper = avgWeights[0]; // best >= target
|
||||
// let hasLower = false, hasUpper = false;
|
||||
//
|
||||
// for (const avg of avgWeights) {
|
||||
// if (avg.age <= age) {
|
||||
// if (!hasLower || avg.age > lower.age) { lower = avg; hasLower = true; }
|
||||
// }
|
||||
// if (avg.age >= age) {
|
||||
// if (!hasUpper || avg.age < upper.age) { upper = avg; hasUpper = true; }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // clamp to ends if one side missing
|
||||
// if (!hasLower) lower = avgWeights[0];
|
||||
// if (!hasUpper) upper = avgWeights[avgWeights.length - 1];
|
||||
//
|
||||
// // lerp
|
||||
// let ageRatio = upper === lower ? 1 : (age - lower.age) / (upper.age - lower.age);
|
||||
// ageRatio = Math.max(0, Math.min(1, ageRatio));
|
||||
// const interpolatedAvg = lower.weight + (upper.weight - lower.weight) * ageRatio;
|
||||
//
|
||||
// return interpolatedAvg;
|
||||
// }
|
||||
|
||||
export const getAvgWeight = (gender: Gender, age: number) => {
|
||||
type AvgWeightData = {
|
||||
metadata: {
|
||||
unit: StandardUnit
|
||||
},
|
||||
weights: Metrics[]
|
||||
}
|
||||
let avgWeightData = avgWeightDataRaw as AvgWeightData;
|
||||
|
||||
const avgWeights = avgWeightData.weights.filter(a => a.gender === gender);
|
||||
if (!avgWeights.length) throw new Error("No average weights");
|
||||
|
||||
const closest = {
|
||||
diff: Math.abs(avgWeights[0].age - age),
|
||||
avg: avgWeights[0]
|
||||
};
|
||||
for (const avg of avgWeights) {
|
||||
const diff = Math.abs(avg.age - age);
|
||||
if (diff < closest.diff) {
|
||||
closest.diff = diff;
|
||||
closest.avg = avg;
|
||||
}
|
||||
}
|
||||
|
||||
return closest.avg.weight;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user