diff --git a/src/lib/services/calculator/main.ts b/src/lib/services/calculator/main.ts index 3b2f359..e516109 100644 --- a/src/lib/services/calculator/main.ts +++ b/src/lib/services/calculator/main.ts @@ -183,7 +183,10 @@ export class LevelCalculator { } export type StandardsConfig = { - maxLevel: number + maxLevel: number, + weightModifier: number, + weightSkew: number, + ageModifier: number, } export class Standards { @@ -192,7 +195,10 @@ export class Standards { constructor(activityStandards: ActivityStandards, cfg?: Partial) { this.cfg = { - maxLevel: cfg?.maxLevel ?? 100 + maxLevel: cfg?.maxLevel ?? 100, + weightModifier: cfg?.weightModifier ?? .1, + weightSkew: cfg?.weightSkew ?? .1, + ageModifier: cfg?.ageModifier ?? .1, }; // prepare data @@ -213,9 +219,8 @@ export class Standards { for (const gender of Object.values(Gender)) { const referenceAge = 50; - const skewRatio = 0; // 0 = normal, 1 = max skew - const minAge = referenceAge - (ageGenerator.step * ageGenerator.spread * (1 - skewRatio)); - const maxAge = referenceAge + (ageGenerator.step * ageGenerator.spread * (1 + skewRatio)); + const minAge = referenceAge - (ageGenerator.step * ageGenerator.spread); + const maxAge = referenceAge + (ageGenerator.step * ageGenerator.spread); const referenceStandard = this .byActivity(activity) @@ -237,7 +242,7 @@ export class Standards { for (const lvl in referenceStandard.levels) { if (!referenceStandard.levels[lvl]) continue; - const scalingExponent = .1; + const scalingExponent = this.cfg.ageModifier; const coefficient = ageGenerator.ratio === "inverse" ? referenceAge / currAge : currAge / referenceAge; @@ -267,7 +272,7 @@ export class Standards { for (const age of this.agesFor(activity, gender)) { const referenceWeight = getAvgWeight(gender, age); - const skewRatio = 0.4; // 0 = normal, 1 = max skew + const skewRatio = this.cfg.weightSkew; // 0 = normal, 1 = max skew const minWeight = referenceWeight - (weightGenerator.step * weightGenerator.spread * (1 - skewRatio)); const maxWeight = referenceWeight + (weightGenerator.step * weightGenerator.spread * (1 + skewRatio)); @@ -291,7 +296,7 @@ export class Standards { for (const lvl in referenceStandard.levels) { if (!referenceStandard.levels[lvl]) continue; - const scalingExponent = .1; + const scalingExponent = this.cfg.weightModifier; const coefficient = weightGenerator.ratio === "inverse" ? referenceWeight / currWeight : currWeight / referenceWeight; @@ -383,7 +388,6 @@ export class Standards { }; const interpolateByAgeAndWeight = (metrics: Metrics): Standard => { - console.log(metrics); const interpolateByWeight = (targetAge: number): Levels => { const { lower: lowerAgeWeightStandard, upper: upperAgeWeightStandard } = this .byActivity(activity) @@ -504,7 +508,6 @@ export class Standards { .byAge(closestAge) .getAll().map((s) => s.metrics.weight); - console.log({ age, closestAge, weights }); return weights; } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 49ea9be..2799f75 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -26,6 +26,9 @@ }, cfg: { maxLevel: "5", + weightModfier: ".1", + weightSkew: ".4", + ageModifier: ".1", }, }); @@ -38,6 +41,9 @@ } as Metrics, cfg: { maxLevel: +input.cfg.maxLevel, + weightModifier: +input.cfg.weightModfier, + weightSkew: +input.cfg.weightSkew, + ageModifier: +input.cfg.ageModifier, } as StandardsConfig, }); @@ -135,20 +141,74 @@
Parameters - +
+ General + +
+ +
+ Data generation + + + +

{allStandards.byActivity(selected.activity).getMetadata().name}

+ {#if allStandards + .byActivity(selected.activity) + .getMetadata().generators.length} +

+ (Generated data: {allStandards + .byActivity(selected.activity) + .getMetadata() + .generators.map((g) => g.metric) + .join(", ")}) +

+ {:else} +

(Generated data: NONE)

+ {/if} +

{selected.metrics.gender}

{#if !selected.metrics.age} @@ -246,6 +306,11 @@ font-weight: 600; } + p { + font-size: 0.8rem; + color: var(--muted); + } + /* Toolbar container */ .toolbar { display: grid; @@ -288,6 +353,11 @@ min-width: 160px; } + .parameter { + min-width: 100px; + max-width: 100px; + } + /* Label text */ .field > span { font-size: 12px;