step-sequence-generator
Version:
A step sequence generator for figure skating programs
100 lines (99 loc) • 4.11 kB
JavaScript
"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;