UNPKG

step-sequence-generator

Version:

A step sequence generator for figure skating programs

100 lines (99 loc) 4.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VectorKeyChanceRatioMapGenerator = void 0; const vector_angles_1 = require("../../shared/constants/vector-angles"); class VectorKeyChanceRatioMapGenerator { constructor() { this._rbPercentage = null; } getChanceRatioMap(data) { const { currentAcrVectorIndex, currentVectorKey, vectorKeys, rbPercentage } = data; this.rbPercentage = rbPercentage; if (currentVectorKey === null) return this.getFlatChanceRatioMap(vectorKeys); return this.getVariedChanceRatioMap({ currentVectorKey, currentAcrVectorIndex, vectorKeys, }); } getFlatChanceRatioMap(vectorKeys) { const flatChanceRatio = this.rbPercentage.total / vectorKeys.length; const chanceRatioMap = new Map(); vectorKeys.forEach((vectorKey) => chanceRatioMap.set(vectorKey, flatChanceRatio)); return chanceRatioMap; } getVariedChanceRatioMap(data) { const { currentVectorKey, currentAcrVectorIndex, vectorKeys } = data; const vectorKeysWithNormalizeAngles = this.getVectorKeysWithNormalizeAngles(currentVectorKey, vectorKeys); const baseChanceRatio = this.calcBaseChanceRatio(vectorKeysWithNormalizeAngles, currentAcrVectorIndex); return this.createVariedChanceRatioMap(vectorKeysWithNormalizeAngles, currentAcrVectorIndex, baseChanceRatio); } getVectorKeysWithNormalizeAngles(currentVectorKey, vectorKeys) { const map = new Map(); vectorKeys.forEach((vectorKey) => { const angleDiff = vector_angles_1.VECTOR_ANGLES[vectorKey] - vector_angles_1.VECTOR_ANGLES[currentVectorKey]; const normalizeAngleDiff = ((angleDiff + 180) % 360) - 180; map.set(vectorKey, normalizeAngleDiff); }); return map; } calcBaseChanceRatio(vectorKeysWithAngles, vectorFactor) { const counter = { preferred: 0, same: 0, opposite: 0, get total() { return this.preferred + this.same + this.opposite; }, }; for (let angle of vectorKeysWithAngles.values()) { if (this.preferredVectorCondition(angle, vectorFactor)) { counter.preferred++; } else if (this.sameVectorCondition(angle, vectorFactor)) { counter.same++; } else { counter.opposite++; } } return ((this.rbPercentage.total - counter.same * this.rbPercentage.additionalPercentage - counter.preferred * this.rbPercentage.specialPercentage) / counter.total); } createVariedChanceRatioMap(vectorKeysWithAngles, vectorFactor, baseChanceRation) { const chanceRatioMap = new Map(); let chanceRatio = baseChanceRation; for (let [key, angle] of vectorKeysWithAngles.entries()) { if (this.preferredVectorCondition(angle, vectorFactor)) { chanceRatio = baseChanceRation + this.rbPercentage.specialPercentage; } else if (this.sameVectorCondition(angle, vectorFactor)) { chanceRatio = baseChanceRation + this.rbPercentage.additionalPercentage; } chanceRatioMap.set(key, chanceRatio); } return chanceRatioMap; } preferredVectorCondition(angle, vectorFactor) { const PREFERRED_ANGLE = 45 * vectorFactor; return angle === PREFERRED_ANGLE; } sameVectorCondition(angle, vectorFactor) { return angle * vectorFactor >= 0; } oppositeVectorCondition(angle, vectorFactor) { return angle * vectorFactor < 0; } get rbPercentage() { if (this._rbPercentage === null) throw new Error('rbPercentage must be defined'); return this._rbPercentage; } set rbPercentage(value) { this._rbPercentage = value; } } exports.VectorKeyChanceRatioMapGenerator = VectorKeyChanceRatioMapGenerator;