Petit programme de java qui bug.

onizuka1000 Messages postés 18 Statut Membre -  
onizuka1000 Messages postés 18 Statut Membre -

Bonjour à tous,

Voila je vous explique la situation, j'ai trouvé un petit programme en java pour m'aider à calculer des valeurs.

Le programme fonctionne à la perfection mais il plante systématiquement quand je recherche des valeurs un peu élevés. Je n'y connais absolument rien en JS  )=. Es que quelqu'un aurais l'amabilité d'y jeter un petit coup d'œil rapide pour me dire si c'est rectifiable ou non s.v.p <3.

Je vous met un lien pour le télécharger. Pour le tester ne vous embêtez pas, essayez simplement de rentrer Status Power : 250 et faite directement "drive set" puis "generate hwi" il va directement planter )=.

Si vous rentrez des valeurs comme 150 ou 200 par exemple ca va fonctionner. J'ai l'impression qu'il plante quand il dépasse une certaine valeur à calculer.

https://drive.google.com/file/d/1bFlp6gZxQ6Jru44JFaRsZfMTHeSj93ZV/view?usp=drive_web

Merci.
Windows / Chrome 108.0.0.0

2 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     

    Bonjour

    Pour commencer, merci de partager le code directement sur le forum on utilisant l'icône prévu à cet effet lorsque tu rédige ton message.

    Ensuite, peux-tu nous préciser si il s'agit du langage Java comme le sous-entend ton titre ou bien de code javascript comme tu sembles le dire ensuite...

    Ce sont deux langages différents merci donc de préciser.


    0
  2. onizuka1000 Messages postés 18 Statut Membre 1
     

    Bonjour,

    Voici le code :

    const DESVIO_SCALE_PANGYA_TO_YARD = 0.3125 / 1.5;
    
    
    class Vector3D {
    
        constructor(x, y, z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    
        normalize() {
            return this.divideScalar( this.length() );
        }
    
        multiplyScalar(value) {
    
            this.x *= value;
            this.y *= value;
            this.z *= value;
    
            return this;
        }
    
        add(vector3d) {
    
            this.x += vector3d.x;
            this.y += vector3d.y;
            this.z += vector3d.z;
    
            return this;
        }
    
        add3D(x, y, z) {
    
            this.x += x;
            this.y += y;
            this.z += z;
    
            return this;
        }
    
        sub(vector3d) {
    
            this.x -= vector3d.x;
            this.y -= vector3d.y;
            this.z -= vector3d.z;
    
            return this;
        }
    
        sub3D(x, y, z) {
    
            this.x -= x;
            this.y -= y;
            this.z -= z;
    
            return this;
        }
    
        divideScalar(value) {
    
            if (value != 0) {
    
                let scalar = 1 / value;
    
                this.x *= scalar;
                this.y *= scalar;
                this.z *= scalar;
    
            }else {
    
                this.x = 0.0;
                this.y = 0.0;
                this.z = 0.0;
            }
    
            return this;
        }
    
        cross(vector3d) {
    
            let x = this.x, y = this.y, z = this.z;
        
            this.x = y * vector3d.z - z * vector3d.y;
            this.y = z * vector3d.x - x * vector3d.z;
            this.z = x * vector3d.y - y * vector3d.x;
        
            return this;
        
          }
    
        length() {
            return Math.sqrt((this.x * this.x) + (this.y * this.y) + (this.z * this.z));
        }
    
        clone() {
            return new Vector3D(this.x, this.y, this.z);
        }
    }
    
    const TYPE_DISTANCE = {
        LESS_10: 0,
        LESS_15: 1,
        LESS_28: 2,
        LESS_58: 3,
        BIGGER_OR_EQUAL_58: 4,
    }
    
    function calculeTypeDistance(distance) {
    
        let type = TYPE_DISTANCE.BIGGER_OR_EQUAL_58;
    
        if (distance >= 58.0)
            return TYPE_DISTANCE.BIGGER_OR_EQUAL_58;
        else if (distance < 10.0)
            return TYPE_DISTANCE.LESS_10;
        else if (distance < 15.0)
            return TYPE_DISTANCE.LESS_15;
        else if (distance < 28.0)
            return TYPE_DISTANCE.LESS_28;
        else if (distance < 58.0)
            return TYPE_DISTANCE.LESS_58; // Esse não precisa já que ele passou do primeiro if, mas deixar assim
    
        return type;
    }
    
    function calculeTypeDistanceByPosition(position1, position2) {
        return calculeTypeDistance(Math.sqrt(Math.pow(position1.x - position2.x) + Math.pow(position1.z - position2.z)) * 0.3125);
    }
    
    // JP Base ball Static Object
    class Ball {
    
        position = new Vector3D(0.0, 0.0, 0.0);
    
        slope = new Vector3D(0.0, 1.0, 0.0);
    
        // Ball Flag state process
        state_process = 0;
    
        max_height = 0.0;
        num_max_height = -1;
    
        count = 0;
    
        // Velocity
        velocity = new Vector3D(0.0, 0.0, 0.0);
    
        ball_28 = 0.0;
        ball_2C = 0.0;
        ball_30 = 0.0;
    
        curva = 0.0;
        spin = 0.0; 
    
        rotation_curve = 0.0;
        rotation_spin = 0.0; 
    
        // Flags
        ball_44 = 0;    
        ball_48 = 0;    
        ball_70 = -1; 
        ball_90 = 0;  
    
        ball_BC = 0;
    
        mass = 0.045926999;
        diametro = 0.14698039;
    
        copy(other) {
    
            let cpy = this;
    
            cpy.position = other.position.clone();
            cpy.slope = other.slope.clone();
            cpy.velocity = other.velocity.clone();
            cpy.state_process = other.state_process;
            cpy.max_height = other.max_height;
            cpy.spin = other.spin;
            cpy.curva = other.curva;
            cpy.count = other.count;
            cpy.num_max_height = other.num_max_height;
            cpy.ball_28 = other.ball_28;
            cpy.ball_2C = other.ball_2C;
            cpy.ball_30 = other.ball_30;
            cpy.ball_3C = other.ball_3C;
            cpy.ball_40 = other.ball_40;
            cpy.ball_44 = other.ball_44;
            cpy.ball_48 = other.ball_48;
            cpy.ball_70 = other.ball_70;
            cpy.ball_90 = other.ball_90;
            cpy.ball_BC = other.ball_BC;
            cpy.ball_C4 = other.ball_C4;
            cpy.ball_C8 = other.ball_C8;
        }
    }
    
    const POWER_SHOT_FACTORY = {
        NO_POWER_SHOT: 0,
        ONE_POWER_SHOT: 1,
        TWO_POWER_SHOT: 2,
        ITEM_15_POWER_SHOT: 3
    }
    
    function getPowerShotFactory(ps) {
    
        let power_shot_factory = 0.0;
    
        switch (ps) {
            case POWER_SHOT_FACTORY.ONE_POWER_SHOT:
                power_shot_factory = 10.0;
                break;
            case POWER_SHOT_FACTORY.TWO_POWER_SHOT:
                power_shot_factory = 20.0;
                break;
            case POWER_SHOT_FACTORY.ITEM_15_POWER_SHOT:
                power_shot_factory = 15.0;
                break;
        }
    
        return power_shot_factory
    }
    
    const CLUB_TYPE = {
        WOOD: 0,
        IRON: 1,
        PW: 2,
        PT: 3
    }
    
    class ClubInfo {
    
        constructor(type, rotation_spin, rotation_curve, power_factor, degree, power_base) {
    
            this.type = type;
            this.rotation_spin = rotation_spin;
            this.rotation_curve = rotation_curve;
            this.power_factor = power_factor;
            this.degree = degree;
            this.power_base = power_base;
        }
    }
    
    
    const CLUB_INFO = {
        _1W: new ClubInfo(CLUB_TYPE.WOOD,  0.55, 1.61, 236.0, 10.0, 230.0),
        _2W: new ClubInfo(CLUB_TYPE.WOOD,  0.50, 1.41, 204.0, 13.0, 210.0),
        _3W: new ClubInfo(CLUB_TYPE.WOOD,  0.45, 1.26, 176.0, 16.0, 190.0),
        _2I: new ClubInfo(CLUB_TYPE.IRON,  0.45, 1.07, 161.0, 20.0, 180.0),
        _3I: new ClubInfo(CLUB_TYPE.IRON,  0.45, 0.95, 149.0, 24.0, 170.0),
        _4I: new ClubInfo(CLUB_TYPE.IRON,  0.45, 0.83, 139.0, 28.0, 160.0),
        _5I: new ClubInfo(CLUB_TYPE.IRON,  0.45, 0.73, 131.0, 32.0, 150.0),
        _6I: new ClubInfo(CLUB_TYPE.IRON,  0.41, 0.67, 124.0, 36.0, 140.0),
        _7I: new ClubInfo(CLUB_TYPE.IRON,  0.36, 0.61, 118.0, 40.0, 130.0),
        _8I: new ClubInfo(CLUB_TYPE.IRON,  0.30, 0.57, 114.0, 44.0, 120.0),
        _9I: new ClubInfo(CLUB_TYPE.IRON,  0.25, 0.53, 110.0, 48.0, 110.0),
        PW: new ClubInfo(CLUB_TYPE.PW,     0.18, 0.49, 107.0, 52.0, 100.0),
        SW: new ClubInfo(CLUB_TYPE.PW,     0.17, 0.42, 93.0, 56.0, 80.0),
        PT1: new ClubInfo(CLUB_TYPE.PT,    0.00, 0.00, 30.0, 0.00, 20.0),
        PT2: new ClubInfo(CLUB_TYPE.PT,    0.00, 0.00, 21.0, 0.00, 10.0)
    }
    
    const CLUB_INFO_ENUM = [
        '_1W',
        '_2W',
        '_3W',
        '_2I',
        '_3I',
        '_4I',
        '_5I',
        '_6I',
        '_7I',
        '_8I',
        '_9I',
        'PW',
        'SW',
        'PT1',
        'PT2'
    ]
    
    const POWER_SHOT_FACTORY_ENUM = [
        'NO_POWER_SHOT',
        'ONE_POWER_SHOT',
        'TWO_POWER_SHOT',
        'ITEM_15_POWER_SHOT'
    ]
    
    const SHOT_TYPE_ENUM = [
        'DUNK',
        'TOMAHAWK',
        'SPIKE',
        'COBRA'
    ]
    
    class Club {
    
        type = CLUB_TYPE.WOOD; // 1W
    
        type_distance = TYPE_DISTANCE.BIGGER_OR_EQUAL_58;
    
        // 1W
        rotation_spin =     0.55;      // Rotação spin
        rotation_curve =    1.61;       // Rotação curva
        power_factor =      236;       // Power shot
        degree =            10;        // Angulo
        power_base =        230;       // Base power
    
        init(club_info) {
    
            this.type = club_info.type;
    
            this.rotation_spin  = club_info.rotation_spin;
            this.rotation_curve = club_info.rotation_curve;
            this.power_factor   = club_info.power_factor;
            this.degree         = club_info.degree;
            this.power_base     = club_info.power_base;
        }
    
        getDregRad() {
            return this.degree * Math.PI / 180;
        }
    
        getPower(extraPower, pwrSlot, ps, spin) {
    
            // Get Auxpart
            // Get Card
            // Get Mascot
            let pwrjard = 0.0;
    
            switch(this.type) {
                case CLUB_TYPE.WOOD: {
    
                    pwrjard = extraPower.total(ps) + getPowerShotFactory(ps) + ((pwrSlot - 15) * 2);
    
                    pwrjard *= 1.5;
                    pwrjard /= this.power_base;
                    pwrjard += 1;
                    pwrjard *= this.power_factor;
    
                    break;
                }
                case CLUB_TYPE.IRON: {
    
                    pwrjard = ((getPowerShotFactory(ps) / this.power_base + 1.0) * this.power_factor) + (extraPower.total(ps) * this.power_factor * 1.3) / this.power_base;
    
                    break;
                }
                case CLUB_TYPE.PW: { // SW e PW
    
                    const getPowerByDegree = (degree, spin) => {
                        return 0.5 + ((0.5 * (degree + (spin * _00D19B98))) / (56/*Ang*/ / 180 * Math.PI));
                    }
    
                    switch (this.type_distance) {
                        case TYPE_DISTANCE.LESS_10:
                        case TYPE_DISTANCE.LESS_15:
                        case TYPE_DISTANCE.LESS_28:
                            pwrjard = (getPowerByDegree(this.getDregRad(), spin) * (52.0 + (ps ? 28.0 : 0))) + (extraPower.total(ps) * this.power_factor) / this.power_base;
                            break;
                        case TYPE_DISTANCE.LESS_58:
                            pwrjard = (getPowerByDegree(this.getDregRad(), spin) * (80.0 + (ps ? 18.0 : 0))) + (extraPower.total(ps) * this.power_factor) / this.power_base;
                            break;
                        case TYPE_DISTANCE.BIGGER_OR_EQUAL_58:
                            pwrjard = ((getPowerShotFactory(ps) / this.power_base + 1.0) * this.power_factor) + (extraPower.total(ps) * this.power_factor) / this.power_base;
                            break;
                    }
    
                    break;
                }
                case CLUB_TYPE.PT: {
                    pwrjard = this.power_factor;
                    break;
                }
            }
    
            return pwrjard;
        }
    
        // Rotation
        getPower2(extraPower, pwrSlot, ps) {
    
    
            let pwrjard = (extraPower.auxpart + extraPower.mascot + extraPower.card) / 2 + (pwrSlot - 15);
    
            if (ps)
                pwrjard += (extraPower.ps_card / 2);
    
            pwrjard /= 170;
    
            return pwrjard + 1.5;
        }
    
        getRange(extraPower, pwrSlot, ps) {
            
            let pwr_range = this.power_base + extraPower.total(ps) + getPowerShotFactory(ps);
    
            if (this.type == CLUB_TYPE.WOOD)
                pwr_range += ((pwrSlot - 15) * 2)
    
            if (this.type == CLUB_TYPE.PW) {
    
                switch (this.type_distance) {
                    case TYPE_DISTANCE.LESS_10:
                    case TYPE_DISTANCE.LESS_15:
                    case TYPE_DISTANCE.LESS_28:
                        pwr_range = 30.0 + (ps ? 30.0 : 0.0) + extraPower.total(ps)
                        break;
                    case TYPE_DISTANCE.LESS_58:
                        pwr_range = 60.0 + (ps ? 20.0 : 0.0) + extraPower.total(ps)
                        break;
                    case TYPE_DISTANCE.BIGGER_OR_EQUAL_58:
                        pwr_range = this.power_base + extraPower.total(ps) + getPowerShotFactory(ps);
                        break;
                }
            }
    
            return pwr_range;
        }
    }
    
    class Wind {
    
        wind = 0;
        degree = 0;
    
        getWind() {
            return new Vector3D(this.wind * Math.sin(this.degree * Math.PI / 180) * -1, 0, this.wind * Math.cos(this.degree * Math.PI / 180));
        }
    }
    
    // const Object ball
    const ball = new Ball();
    
    // const club
    const club = new Club();
    
    // const wind
    const wind = new Wind();
    
    // Const values
    const _00D3D008 = 0.00001; // compare with 0 acho
    const _00D046A8 = -1.0; // -1 value constant
    const _00D00190 = 0.75; // const
    const _00D083A0 = 0.02; // Step time, pangya 0.02
    const _00D66CF8 = 3.0;  // Valor 3 que não sei bem o que é
    const _00D3D028 = 0.00008; // Efeito Mangnus acho
    const _00D1A888 = 12.566371;  // Não sei
    const _00D3D210 = 25.132742; // Não sei
    const _00CFF040 = 0.1;
    const _00D66CA0 = 0.5;
    const _00D16928 = 0.002;
    const _00D17908 = 0.349065847694874;
    const _00D19B98 = 0.0698131695389748;
    const _00D16758 = 0.01
    
    const slope_break_to_curve_slope = 0.00875;
    
    const _00E42544_vect_slope = new Vector3D(0.0, 0.0, 1.0);
    
    class QuadTree {
    
        constructor() {
            this.ball = new Ball();
            this.club = new Club();
            this.wind = new Wind();
        }
    
        gravityFactor = 1;
        gravity = 34.295295715332; // gravity in Yards(scale pangya)
    
        _21D8_vect = new Vector3D(0.0, 0.0, 0.0);
    
        getGravity() {
            return this.gravity * this.gravityFactor;
        }
    
        ball = undefined;
    
        club = undefined;
    
        wind = undefined;
    
        // Usa no cobra
        ball_position_init = new Vector3D(0.0, 0.0, 0.0);
        power_range_shot = 0.0;
    
        shot = SHOT_TYPE.DUNK;
        power_factor_shot = 0.0;
        percentShot_sqrt = 0.0;
        spike_init = -1;
        spike_med = -1;
        power_factor = 0.0;
        cobra_init = -1;
    
        // Init Shot
        initShot(ball, club, wind, options) {
    
            this.ball = ball;
            this.club = club;
            this.wind = wind;
    
            this.shot = options.shot;
            this.spike_init = -1;
            this.spike_med = -1;
            this.cobra_init = -1;
    
            this.ball.position = options.position.clone();
    
            // Usa no Cobra
            this.ball_position_init = options.position.clone();
    
            // Type distance
            this.club.type_distance = calculeTypeDistance(options.distance);
    
            // init max_height
            this.ball.max_height = this.ball.position.y;
    
            this.ball.count = 0;
            this.ball.num_max_height = -1;
    
            let pwr = this.club.getPower(options.power.options, options.power.pwr, options.ps, options.spin);
    
            // Guarda para usa no cobra
            this.power_range_shot = this.club.getRange(options.power.options, options.power.pwr, options.ps);
    
            // Guarda para usar no spike
            this.power_factor = pwr;
    
            pwr *= Math.sqrt(options.percentShot);
    
            // Multiplica por 1.0 ou 1.3
            if (options.shot == SHOT_TYPE.TOMAHAWK || options.shot == SHOT_TYPE.SPIKE/*Toma e spike */)
                pwr *= 1.3;
            else
                pwr *= 1.0;
    
            // Percent Erro de pangya e ground
            pwr *= Math.sqrt(options.ground * 0.01);
    
            // Guarda para usar no spike
            this.power_factor_shot = pwr;
            this.percentShot_sqrt = Math.sqrt(options.percentShot);
    
            this.ball.curva = options.curva;
            this.ball.spin = options.spin;
    
            let value1 = this.getValuesDegree(options.mira_rad + (0 - (this.ball.curva * _00D17908)), 1);
            let value2 = this.getValuesDegree((this.club.type_distance == TYPE_DISTANCE.BIGGER_OR_EQUAL_58 ? this.club.getDregRad() : this.club.getDregRad() + (this.ball.spin * _00D19B98)), 0);
    
            this.ball.curva -= this.getSlope(options.mira_rad - options.slope_mira_rad, Math.random()/* Rotation Ball Line */);
    
            pwr *= ((Math.abs(this.ball.curva) * 0.1) + 1);
    
            // tava cos2, neg_rad, neg_sin
            let vectA = new Vector3D(value2.neg_sin, value2.neg_rad, value2.cos2);
    
            vectA.multiplyScalar(pwr);
    
            let v1 = new Vector3D(value1.cos, value1.rad, value1.sin);
            let v2 = new Vector3D(value1._C, value1._10, value1._14);
            let v3 = new Vector3D(value1.neg_sin, value1.neg_rad, value1.cos2);
            let v4 = new Vector3D(value1._24, value1._28, value1._2C);
    
            this.ball.velocity.x = v2.x * vectA.y + vectA.x * v1.x + v3.x * vectA.z + v4.x;
            this.ball.velocity.y = v1.y * vectA.x + v2.y * vectA.y + v3.y * vectA.z + v4.y;
            this.ball.velocity.z = v1.z * vectA.x + v2.z * vectA.y + v3.z * vectA.z + v4.z;
    
            // Rotação eixo X, Z
            this.ball.rotation_curve = this.ball.curva * options.percentShot;
            this.ball.rotation_spin = this.club.type_distance == TYPE_DISTANCE.BIGGER_OR_EQUAL_58 
                ? (this.club.getPower2(options.power.options, options.power.pwr, options.ps) * options.percentShot) * options.percentShot
                : 0.0;
    
            this.ball.ball_48 = this.ball.ball_44; // Flag Power Shot
        }
    
        getSlope(mira, line_ball) {
    
            // values Degree To Matrix
            const valuesDegreeToMatrix = (value) => {
    
                return {
                    v1: new Vector3D(value.cos, value.rad, value.sin),
                    v2: new Vector3D(value._C, value._10, value._14),
                    v3: new Vector3D(value.neg_sin, value.neg_rad, value.cos2),
                    v4: new Vector3D(value._24, value._28, value._2C)
                }
            }
    
            // Matrix cross Matrix
            const applyMatrix = (m1, m2) => {
    
                return {
                    v1: new Vector3D(
                        m1.v1.x * m2.v1.x + m1.v1.y * m2.v2.x + m1.v1.z * m2.v3.x,
                        m1.v1.x * m2.v1.y + m1.v1.y * m2.v2.y + m1.v1.z * m2.v3.y,
                        m1.v1.x * m2.v1.z + m1.v1.y * m2.v2.z + m1.v1.z * m2.v3.z
                    ),
                    v2: new Vector3D(
                        m1.v2.x * m2.v1.x + m1.v2.y * m2.v2.x + m1.v2.z * m2.v3.x,
                        m1.v2.x * m2.v1.y + m1.v2.y * m2.v2.y + m1.v2.z * m2.v3.y,
                        m1.v2.x * m2.v1.z + m1.v2.y * m2.v2.z + m1.v2.z * m2.v3.z
                    ),
                    v3: new Vector3D(
                        m1.v3.x * m2.v1.x + m1.v3.y * m2.v2.x + m1.v3.z * m2.v3.x,
                        m1.v3.x * m2.v1.y + m1.v3.y * m2.v2.y + m1.v3.z * m2.v3.y,
                        m1.v3.x * m2.v1.z + m1.v3.y * m2.v2.z + m1.v3.z * m2.v3.z
                    ),
                    v4: new Vector3D(
                        m1.v4.x * m2.v1.x + m1.v4.y * m2.v2.x + m1.v4.z * m2.v3.x + m2.v4.x,
                        m1.v4.x * m2.v1.y + m1.v4.y * m2.v2.y + m1.v4.z * m2.v3.y + m2.v4.y,
                        m1.v4.x * m2.v1.z + m1.v4.y * m2.v2.z + m1.v4.z * m2.v3.z + m2.v4.z
                    )
                };
            };
    
            // Calc slope
            let ball_slope_cross_const_vect = this.ball.slope.clone().cross(_00E42544_vect_slope);
    
            let slope_matrix = {
                v1: ball_slope_cross_const_vect.clone().normalize(),
                v2: this.ball.slope.clone(),
                v3: ball_slope_cross_const_vect.clone().cross(this.ball.slope).normalize(),
                v4: new Vector3D(0.0, 0.0, 0.0)
            };
    
            let value1 = this.getValuesDegree(mira * -1, 1);
            let value2 = this.getValuesDegree(line_ball * -2.0, 1);
    
            let m1 = applyMatrix(valuesDegreeToMatrix(value2), slope_matrix);
    
            let m2 = applyMatrix(m1, valuesDegreeToMatrix(value1));
    
            return m2.v2.x * _00D66CA0;
        }
    
        getValuesDegree(degree, option = 0) {
    
            let obj = new Object();
    
            if (option == 0) {
    
                obj.cos = 1.0;
                obj.rad = 0.0; // degree
                obj.sin = 0.0;
                obj._C = 0.0;
                obj._10 = Math.cos(degree);
                obj._14 = Math.sin(degree) * -1;
                obj.neg_sin = 0.0;
                obj.neg_rad = Math.sin(degree);
                obj.cos2 = obj._10;
                obj._24 = 0.0;
                obj._28 = 0.0;
                obj._2C = 0.0;
    
            }else if (option == 1) {
            
                obj.cos = Math.cos(degree);
                obj.rad = 0.0; // degree
                obj.sin = Math.sin(degree);
                obj._C = 0.0;
                obj._10 = 1.0;
                obj._14 = 0.0;
                obj.neg_sin = obj.sin * -1;
                obj.neg_rad = 0.0;
                obj.cos2 = obj.cos;
                obj._24 = 0.0;
                obj._28 = 0.0;
                obj._2C = 0.0;
            }
    
            return obj;
        }
    
        ballProcess(steptime, final = undefined) {
    
            this.bounceProcess(steptime, final);
    
            // Cobra
            if (this.shot == SHOT_TYPE.COBRA && this.cobra_init < 0) {
    
                if (this.percentShot_sqrt < Math.sqrt(0.8))
                    this.percentShot_sqrt = Math.sqrt(0.8); // 80%
    
                if (this.ball.count == 0) {
    
                    this.ball.velocity.y = 0.0;
    
                    this.ball.velocity.normalize().multiplyScalar(this.power_factor_shot);
                }
    
                let diff = this.ball.position.clone().sub(this.ball_position_init).length();
                let cobra_init_up = ((this.power_range_shot * this.percentShot_sqrt) - 100.0) * 3.2;
    
                if (diff >= cobra_init_up) {
    
                    // 1W, 2W e 3W
                    let power_multiply = 0.0;
                    
                    if (this.club.type == CLUB_TYPE.WOOD) {
    
                        switch (this.club.power_base) {
                            case 230.0:
                                power_multiply = 74.0;
                                break;
                            case 210.0:
                                power_multiply = 76.0;
                                break;
                            case 190.0:
                                power_multiply = 80.0;
                                break;
                        }
                    }
    
                    this.cobra_init = this.ball.count;
    
                    this.ball.velocity.normalize().multiplyScalar(power_multiply).multiplyScalar(this.percentShot_sqrt);
    
                    this.ball.rotation_spin = 2.5;
                }
    
            }else {
    
                if (this.spike_init < 0 && this.cobra_init < 0 && this.club.type_distance == TYPE_DISTANCE.BIGGER_OR_EQUAL_58) {
    
                    this.ball.rotation_spin -= ((_00D66CA0 - (this.ball.spin * _00CFF040)) * _00D083A0);
    
                }else if ((this.shot == SHOT_TYPE.SPIKE && this.spike_init >= 0) || (this.shot == SHOT_TYPE.COBRA && this.cobra_init >= 0))
                    this.ball.rotation_spin -= _00D083A0;
    
                if (this.shot == SHOT_TYPE.SPIKE && this.ball.count == 0) {
    
                    this.ball.velocity.y = 0.0;
                    this.ball.velocity.normalize().multiplyScalar(this.power_factor_shot);
    
                    // check se a bola andou já
                    this.ball.velocity.normalize().multiplyScalar(72.5).multiplyScalar(this.percentShot_sqrt * 2);
    
                    this.ball.rotation_spin = 3.1;
    
                    this.spike_init = this.ball.count;
    
                }
    
                if (this.shot == SHOT_TYPE.SPIKE && this.ball.num_max_height >= 0 && (this.ball.num_max_height + 0x3C) < this.ball.count && this.spike_med < 0) {
                    
                    this.spike_med = this.ball.count;
    
                    if (this.club.type == CLUB_TYPE.WOOD) {
    
                        let new_power = 0.0;
    
                        switch (this.club.power_base) {
                            case 230.0:
    
                                new_power = 344.0;
    
                                if ((this.power_factor * this.percentShot_sqrt) < 344.0)
                                    new_power -= (this.power_factor * this.percentShot_sqrt);
                                else
                                    new_power = 0.0;
    
                                new_power = new_power / 112.0 * 21.5;
    
                                new_power = -8 - new_power;
    
                                this.ball.velocity.y = new_power;
    
                                break;
                            case 210.0:
    
                                new_power = 306.0;
    
                                if ((this.power_factor * this.percentShot_sqrt) < 306.0)
                                    new_power -= (this.power_factor * this.percentShot_sqrt);
                                else
                                    new_power = 0.0;
    
                                new_power = new_power / 105.0 * 20.5;
    
                                new_power = -10.3 - new_power;
    
                                this.ball.velocity.y = new_power;
    
                                break;
                            case 190.0:
    
                                new_power = 273.0;
    
                                if ((this.power_factor * this.percentShot_sqrt) < 273.0)
                                    new_power -= (this.power_factor * this.percentShot_sqrt);
                                else
                                    new_power = 0.0;
    
                                new_power = new_power / 100 * 20.2;
    
                                new_power = -10.8 - new_power;
    
                                this.ball.velocity.y = new_power;
    
                                break;
                        }
                    }
    
                    this.ball.velocity.multiplyScalar(this.percentShot_sqrt * 7);
    
                    this.ball.rotation_spin = this.ball.spin;
                }
            }
    
            if (this.ball.velocity.y < 0 && this.ball.num_max_height < 0) {
    
                this.ball.max_altura = this.ball.position.y;
                this.ball.num_max_height = this.ball.count;
            }
            
            this.ball.count++;
        }
        
        bounceProcess(steptime, final = undefined) {
    
            if (this.shot == SHOT_TYPE.SPIKE && this.ball.num_max_height >= 0 && (this.ball.num_max_height + 0x3C) > this.ball.count)
                return;
    
            let accellVect = this.applyForce();
    
            let otherVect = accellVect.clone();
    
            otherVect.divideScalar(this.ball.mass).multiplyScalar(steptime);
    
            this.ball.velocity.add(otherVect);
    
            if (this.ball.num_max_height == -1) {
    
                let tmpVect = this._21D8_vect.clone().divideScalar(this.ball.mass).multiplyScalar(steptime);
    
                this.ball.velocity.add(tmpVect);
            }
    
            this.ball.ball_2C += (this.ball.rotation_curve * _00D1A888 * steptime);
    
            this.ball.ball_30 += (this.ball.rotation_spin * _00D3D210 * steptime);
    
            this.ball.position.add(this.ball.velocity.clone().multiplyScalar((final !== undefined ? final : steptime)));
    
        }
    
        applyForce() {
    
            let retVect = new Vector3D(0.0, 0.0, 0.0);
    
            if (this.ball.rotation_curve != 0) {
    
                let vectorb = new Vector3D(this.ball.velocity.z * _00D046A8, 0, this.ball.velocity.x);
    
                vectorb.normalize();
    
                if (this.cobra_init < 0 || this.spike_init < 0)
                    vectorb.multiplyScalar(_00D00190 * this.ball.rotation_curve * this.club.rotation_curve);
    
                retVect.add(vectorb);
            }
    
            if (this.shot == SHOT_TYPE.SPIKE && this.spike_init < 0)
                return new Vector3D(0.0, 0.0, 0.0);
            else if (this.shot == SHOT_TYPE.COBRA && this.cobra_init < 0)
                return retVect;
    
            let windVect = this.wind.getWind();
    
            windVect.multiplyScalar((this.shot == SHOT_TYPE.SPIKE ? _00D16758 : _00D083A0));
    
            retVect.add(windVect);
    
            retVect.y = retVect.y - (this.getGravity() * this.ball.mass);
    
            if (this.ball.rotation_spin != 0)
                retVect.y = retVect.y + (this.club.rotation_spin * _00D66CF8 * this.ball.rotation_spin);
    
            let velVect = this.ball.velocity.clone();
            
            velVect.multiplyScalar(velVect.length() * _00D3D028);
    
            retVect.sub(velVect);
    
            // return
            return retVect;
        }
    }
    
    const diffYZ = function(vect1, vect2) {
        return Math.sqrt(Math.pow(vect1.x - vect2.x, 2) + Math.pow(vect1.z - vect2.z, 2));
    };
    
    const find_power = (power_player, club_info, shot, power_shot, distancia, altura, vento, angulo, terreno, spin, curva, slope, mira = undefined, percent = undefined) => {
    
        const altura_colision = altura * 1.094 * 3.2;
        const distanciaScale = distancia * 3.2;
        var vball = new Ball();
        const vclub = club;
    
        // init Club Info
        if (club != undefined)
            vclub.init(club_info);
    
        // Calcule type distance
        vclub.type_distance = calculeTypeDistance(distancia);
    
        let slope_mira_rad = 0.0;
    
        if (slope instanceof Vector3D) {
            
            slope_mira_rad = slope.y;
            vball.slope = slope.clone();
    
            vball.slope.y = 1.0;
    
        }else if (!isNaN(slope))
            vball.slope = new Vector3D(slope * slope_break_to_curve_slope * -1, 1.0, 0.0);
    
        const margin = 0.05;
        const limit_checking = 1000;
        let count = 0;
        let isFind = false;
        let found = {
            power: -1,
            desvio: 0.0
        }
    
        wind.wind = vento;
        wind.degree = angulo;
    
        const options = {
            distance: distancia,
            percentShot: percent || 1.0,
            ground: terreno,
            mira_rad: mira || 0.0,
            slope_mira_rad: slope_mira_rad,
            spin: spin/30,
            curva: curva/30,
            position: new Vector3D(0.0, 0.0, 0.0),
            shot: shot,
            ps: power_shot,
            power: power_player || {
                pwr: 31,
                options: {
                    auxpart: 0,
                    mascot: 4,
                    card: 4,
                    ps_auxpart: 0,
                    ps_mascot: 0,
                    ps_card: 8,
                    total: function(option) {
                        
                        let pwr = this.auxpart + this.mascot + this.card;
    
                        if (option == 1 || option == 2 || options == 3)
                            pwr += this.ps_auxpart + this.ps_mascot + this.ps_card;
    
                        return pwr;
                    }
                }
            }
        }
    
        const powerRange = vclub.getRange(options.power.options, options.power.pwr, options.ps);
    
        const findAlturaColision = (qt, altura_colision) => {
    
            let count = 0;
    
            let copy_ball = new Ball();
    
            do {
    
                copy_ball.copy(vball);
    
                qt.ballProcess(_00D083A0);
        
            }while((vball.position.y > altura_colision || vball.num_max_height == -1) && (count++) < 3000)
    
            let last_step = Math.abs((altura_colision - copy_ball.position.y) / (vball.position.y - copy_ball.position.y));
    
            vball.copy(copy_ball);
    
            qt.ballProcess(_00D083A0, _00D083A0 * last_step);
            
            if (Math.abs(distanciaScale - vball.position.z) <= margin)
                return 0;
            
            return distanciaScale - vball.position.z;
        }
    
        const qt = new QuadTree();
    
        let ret = 0;
    
        let lado = 0;
        let feed = 0.00006;
    
        do {
    
            // 130% é um limite seguro, para ter a % da tacada mesmo que não chega, só para saber se estava perto e usar no macro de silvia cannon
            if (options.percentShot > 1.3)
                options.percentShot = 1.3;
            else if (options.percentShot < 0.0)
                options.percentShot = 0.1;
    
            qt.initShot(vball, vclub, wind, options);
    
            ret = findAlturaColision(qt, altura_colision);
    
            if (ret == 0)
                isFind = true;
            else {
    
                // Não tem como achar a força por que nem mandando 100% chega
                // 130% é um limite seguro, para ter a % da tacada mesmo que não chega, só para saber se estava perto e usar no macro de silvia cannon
                if (options.percentShot == 1.3 && ret > 0)
                    break;
    
                // Não tem como achar a força por que não pode mandar 0.0 de porcentagem
                if (options.percentShot == 0.1 && ret < 0)
                    break;
    
                if (lado == 0)
                    lado = (ret < 0 ? -1 : 1);
                else if ((ret < 0 && lado == 1) || (ret > 0 && lado == -1))
                    feed *= 0.5;
    
                options.percentShot += ret * feed;
            }
    
        } while (!isFind && (count++) < limit_checking);
    
        if (isFind) {
    
            found.power = options.percentShot;
            found.desvio = (vball.position.x + (options.position.x + (Math.tan(options.mira_rad) * distanciaScale))) * DESVIO_SCALE_PANGYA_TO_YARD
            found.power_range = powerRange;
            found.smartData = { desvio: found.desvio, altura: altura_colision, club: vclub, options: options };
    
        }
    
        return found;
    }
    
    const SHOT_TYPE = {
        DUNK: 0,
        TOMAHAWK: 1,
        SPIKE: 2,
        COBRA: 3,
    }
    
    
    function checkValidInput(value) {
            
        if (value == '' || isNaN(value))
            return 0.0;
    
        return Number(value);
    }
    
    function checkValidInputSlope(value) {
    
        if (value == '')
            return 0.0;
    
        if (isNaN(value)) {
    
            let split = value.split(',');
    
            if (split.length !== 3 || isNaN(split[0]) || isNaN(split[1]) || isNaN(split[2]))
                return 0.0;
    
            return new Vector3D(Number(split[0]) * slope_break_to_curve_slope, Number(split[1]) * Math.PI / 180, Number(split[2]) * slope_break_to_curve_slope);
        }
    
        return Number(value);
    }
    
    function calc(el) {
    	
    	let PB_DIVIDE = checkValidInput(document.getElementById('PB_DIVIDE').value);
    	const W_DIRECT = checkValidInput(document.getElementById('W_DIRECT').value);
    	let degree = 0;
    	if(W_DIRECT==0){
    		degree = checkValidInput(document.getElementById('degree').value);
    	}
    	if(W_DIRECT==1){
    		degree = checkValidInput(document.getElementById('degree').value);
    	}
    	if(W_DIRECT==2){
    		degree = 180 - checkValidInput(document.getElementById('degree').value);
    	}
    	if(W_DIRECT==3){
    		degree = 270 - (90-checkValidInput(document.getElementById('degree').value));
    	}
    	if(W_DIRECT==4){
    		degree = 360 - checkValidInput(document.getElementById('degree').value);
    	}
    	
    	const PB_SIZE_SET = checkValidInput(document.getElementById('PB_Measure_Config').value);
    	
        let power = checkValidInput(document.getElementById('power').value);
        let auxpart_pwr = checkValidInput(document.getElementById('auxpart_pwr').value);
        let card_pwr = checkValidInput(document.getElementById('card_pwr').value);
        let mascot_pwr = checkValidInput(document.getElementById('mascot_pwr').value);
        let card_ps_pwr = checkValidInput(document.getElementById('card_ps_pwr').value);
    
        let club = document.getElementById('club')
    
        club = club.options[club.selectedIndex].value
    
        club = CLUB_INFO[CLUB_INFO_ENUM[club]];
    
        let shot = document.getElementById('shot')
    
        shot = shot.options[shot.selectedIndex].value
    
        shot = SHOT_TYPE[SHOT_TYPE_ENUM[shot]];
    
        let power_shot = document.getElementById('power_shot')
    
        power_shot = power_shot.options[power_shot.selectedIndex].value
    
        power_shot = POWER_SHOT_FACTORY[POWER_SHOT_FACTORY_ENUM[power_shot]];
    
        let distance = checkValidInput(document.getElementById('distance').value);
        let height = checkValidInput(document.getElementById('height').value);
        let wind = checkValidInput(document.getElementById('wind').value);
    	//let	degree = checkValidInput(document.getElementById('degree').value);
        let ground = checkValidInput(document.getElementById('ground').value)
        let spin = checkValidInput(document.getElementById('spin').value);
        let curve = checkValidInput(document.getElementById('curve').value);
        let slope_break = checkValidInputSlope(document.getElementById('slope_break').value);
    
        // 100 % ground
        if (ground == 0.0)
            ground = 100.0;
    
        let result = document.getElementById('result');
    
        // Make options
        const input_values = {
            power_player: {
                pwr: power,
                options: {
                    auxpart: auxpart_pwr,
                    mascot: mascot_pwr,
                    card: card_pwr,
                    ps_auxpart: 0,
                    ps_mascot: 0,
                    ps_card: card_ps_pwr,
                    total: function(option) {
                        
                        let pwr = this.auxpart + this.mascot + this.card;
    
                        if (option == 1 || option == 2 || option == 3)
                            pwr += this.ps_auxpart + this.ps_mascot + this.ps_card;
    
                        return pwr;
                    }
                }
            },
            club_info: club,
            shot: shot,
            power_shot: power_shot,
            distance: distance,
            height: height,
            wind: wind,
            degree: degree,
            ground: ground,
            spin: spin,
            curva: curve,
            slope: slope_break
        };
    
        // Calc
        const found = find_power(   input_values.power_player,
                                    input_values.club_info,
                                    input_values.shot,
                                    input_values.power_shot,
                                    input_values.distance, 
                                    input_values.height, 
                                    input_values.wind, 
                                    input_values.degree, 
                                    input_values.ground, 
                                    input_values.spin, 
                                    input_values.curva,
                                    input_values.slope);
    
        let f = [found];
        let index_f = 0;
    
        if (found.power != -1) {
    
            do {
    
                index_f++;
    
                f.push
                (
                    find_power
                    (   
                        input_values.power_player,
                        input_values.club_info,
                        input_values.shot,
                        input_values.power_shot,
                        input_values.distance, 
                        input_values.height, 
                        input_values.wind, 
                        input_values.degree, 
                        input_values.ground, 
                        input_values.spin, 
                        input_values.curva, 
                        input_values.slope,
                        Math.atan2(f[index_f - 1].desvio * 1.5, input_values.distance), 
                        f[index_f - 1].power
                    )
                );
    
            } while (f[index_f].power != -1 && f[index_f -1].power != -1 && Math.abs(f[index_f - 1].desvio - f[index_f].desvio) >= 0.05);
        }
    
        if (f[index_f].power != -1 && f[index_f].power <= 1.1) {
            result.color = 'Black';
            result.innerHTML = 
    			`	
    				<input style="display:none" type="text" id="power_percent_chk" style="" value="${(f[index_f].power).toFixed(10)}">
    				<input style="display:none" type="text" id="power_percent" style="" value="${(f[index_f].power).toFixed(10)}">
    				<input style="display:none" type="text" id="pin" style="" value="${(distance).toFixed(10)}">
    				<input style="display:none" type="text" id="realhwi" style="" value="${(f[index_f].desvio / 0.2167 * -1 * PB_SIZE_SET).toFixed(10)}">
    			`;
    
        }else {
            result.color = 'Black';
            result.innerHTML = 
    			`	
    				<input style="display:none" type="text" id="power_percent_chk" style="" value="${(f[index_f].power).toFixed(10)}">
    				<input style="display:none" type="text" id="power_percent" style="" value="${(f[index_f].power).toFixed(10)}">
    				<input style="display:none" type="text" id="pin" style="" value="${(distance).toFixed(10)}">
    				<input style="display:none" type="text" id="realhwi" style="" value="${(f[index_f].desvio / 0.2167 * -1 * PB_SIZE_SET).toFixed(10)}">
    			`;
        }
    }
    
    function GenHWI() {
    	document.getElementById('calc_btn').style ="display:none";
    	document.getElementById('RESET').style ="width: 350px; height: 45px;";
    	calc(this)
    	uriContent = "data:application/octet-stream,";
    	uriContent = uriContent + encodeURIComponent("SHOT_PERCENT");
    	uriContent = uriContent + encodeURIComponent(" ");
    	uriContent = uriContent + encodeURIComponent("PIN");
    	uriContent = uriContent + encodeURIComponent(" ");
    	uriContent = uriContent + encodeURIComponent("REAL_HWI");
    	uriContent = uriContent + "\r\n";
    	// data_collector start
    	if(checkValidInput(document.getElementById('power_percent_chk').value)<= 1.1){
    		do{//loop start here
    			//save start
    			uriContent = uriContent + encodeURIComponent(checkValidInput(document.getElementById('power_percent').value));
    			uriContent = uriContent + encodeURIComponent(" ");
    			uriContent = uriContent + encodeURIComponent(checkValidInput(document.getElementById('pin').value));
    			uriContent = uriContent + encodeURIComponent(" ");
    			uriContent = uriContent + encodeURIComponent(checkValidInput(document.getElementById('realhwi').value));
    			uriContent = uriContent + "\r\n";
    			//save end
    			document.getElementById('distance').value = (checkValidInput(document.getElementById('distance').value) - (-1)).toFixed(0);//set next
    			calc(this)//get next result
    		}while(checkValidInput(document.getElementById('power_percent_chk').value)<= 1.1);//repeat loop
    	}
    	// data_collector end.
    	//printf collected data start
    	newWindow = window.open(uriContent, 'Result.html');
    	//printf collected data end.	
    }
    
    function save(){
    	calc(this)
    	uriContent = "data:application/octet-stream,";
    	uriContent = uriContent + encodeURIComponent(checkValidInput(document.getElementById('power_percent').value));
    	uriContent = uriContent + encodeURIComponent(" ");
    	uriContent = uriContent + encodeURIComponent(checkValidInput(document.getElementById('pin').value));
    	uriContent = uriContent + encodeURIComponent(" ");
    	uriContent = uriContent + encodeURIComponent(checkValidInput(document.getElementById('realhwi').value));
    	uriContent = uriContent + encodeURIComponent("<br/>");
    	newWindow = window.open(uriContent,'Result.html');
    }
    
    function drive_checker() {
    
        const power_status = checkValidInput(document.getElementById('power').value);
        const ring_y = checkValidInput(document.getElementById('auxpart_pwr').value);
    	const card_y = checkValidInput(document.getElementById('card_pwr').value);
    	const mascot_y = checkValidInput(document.getElementById('mascot_pwr').value);
        const lolo_y = checkValidInput(document.getElementById('card_ps_pwr').value);
    
        const true_drive = (200+(power_status*2))+card_y+mascot_y+ring_y;
    
        document.getElementById('Drive_Check').value = `${true_drive}+${lolo_y}`;
    	document.getElementById('PB_Measure_Config_Check').value = checkValidInput(document.getElementById('PB_Measure_Config').value);
    
    }
    
    function DRIVE_SET(){
    	drive_checker()
    	document.getElementById('wedegt-config').style = "display:none";
    	document.getElementById('div_calc_club_select').style = "";
    	document.getElementById('div_calc_data_input').style = "";
    	document.getElementById('calc_btn').style = "width: 350px; height: 45px;";
    	/*
    	if(checkValidInput(document.getElementById('Degree_Measure_Config').value)==2){
    		document.getElementById('Label_W_DIRECT').style = "display:none";
    		document.getElementById('W_DIRECT').style = "display:none";
    		document.getElementById('ground').data-index = "5";
    		document.getElementById('spin').data-index = "6";
    		document.getElementById('curve').data-index = "7";
    		document.getElementById('slope_break').data-index = "8";
    	}else {
    		document.getElementById('Label_W_DIRECT').style = "";
    		document.getElementById('W_DIRECT').style = "";
    		document.getElementById('ground').data-index = "6";
    		document.getElementById('spin').data-index = "7";
    		document.getElementById('curve').data-index = "8";
    		document.getElementById('slope_break').data-index = "9";
    		
        }
    	*/ //fail can not use .data-index
    }
    
    
    function SetPreset(){
    	const Drive_Preset = document.getElementById('Drive_Preset').value;
    	if(Drive_Preset == "1"){
    		document.getElementById('power').value = "33";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "0";
    	}
    	if(Drive_Preset == "2"){
    		document.getElementById('power').value = "36";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "0";
    	}
    	if(Drive_Preset == "3"){
    		document.getElementById('power').value = "38";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "6";
    	}
    	if(Drive_Preset == "4"){
    		document.getElementById('power').value = "46";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "0";
    	}
    	if(Drive_Preset == "5"){
    		document.getElementById('power').value = "46";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "2";
    	}
    	if(Drive_Preset == "6"){
    		document.getElementById('power').value = "52";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "2";
    	}
    	if(Drive_Preset == "7"){
    		document.getElementById('power').value = "57";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "8";
    	}
    	if(Drive_Preset == "8"){
    		document.getElementById('power').value = "58";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "6";
    	}
    	if(Drive_Preset == "9"){
    		document.getElementById('power').value = "66";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "0";
    	}
    	if(Drive_Preset == "10"){
    		document.getElementById('power').value = "76";
    		document.getElementById('auxpart_pwr').value = "0";
    		document.getElementById('card_pwr').value = "0";
    		document.getElementById('mascot_pwr').value = "0";
    		document.getElementById('card_ps_pwr').value = "8";
    	}
    	drive_checker()
    	document.getElementById('wedegt-config').style = "display:none";
    	document.getElementById('div_calc_club_select').style = "";
    	document.getElementById('div_calc_data_input').style = "";
    	document.getElementById('calc_btn').style = "width: 350px; height: 45px;";
    	/*
    	if(checkValidInput(document.getElementById('Degree_Measure_Config').value)==2){
    		document.getElementById('Label_W_DIRECT').style = "display:none";
    		document.getElementById('W_DIRECT').style = "display:none";
    		document.getElementById('ground').data-index = "5";
    		document.getElementById('spin').data-index = "6";
    		document.getElementById('curve').data-index = "7";
    		document.getElementById('slope_break').data-index = "8";
    	}else {
    		document.getElementById('Label_W_DIRECT').style = "";
    		document.getElementById('W_DIRECT').style = "";
    		document.getElementById('ground').data-index = "6";
    		document.getElementById('spin').data-index = "7";
    		document.getElementById('curve').data-index = "8";
    		document.getElementById('slope_break').data-index = "9";
    		
        }
    	*/ //fail can not use .data-index
    }
    
    function Back_to_Setting(){
    	document.getElementById('wedegt-config').style = "";
    	document.getElementById('div_calc_club_select').style = "display:none";
    	document.getElementById('div_calc_data_input').style = "display:none";
    	document.getElementById('calc_btn').style = "display:none";
    	document.getElementById('label_Select_Caliper').style = "display:none";
    	document.getElementById('Select_Caliper').style = "display:none";
    	document.getElementById('fit_calip_btn').style = "display:none";
    }
    
    function toggleView(el) {
    
    			let display = 'none';
    			let label = 'Show';
    			let top = el;
    
    			if (el.innerHTML.toUpperCase() == 'SHOW') {
    				display = 'grid';
    				label = 'Hidden';
    			}
    
    			// set label
    			el.innerHTML = label;
    
    			while ((top = top.nextElementSibling)) {
    
    				if (top.nodeName !== 'SCRIPT')
    					top.style.display = display;
    			}
    }
    
    function RESET(){
    	document.getElementById('calc_btn').style ="width: 350px; height: 45px;";
    	document.getElementById('RESET').style ="display:none";
    	
    	document.getElementById('distance').value = "0";
    	document.getElementById('height').value = "";
    	document.getElementById('wind').value = "1";
    	document.getElementById('degree').value = "90";
    	document.getElementById('W_DIRECT').value = "0";
    	document.getElementById('ground').value = "100";
    	document.getElementById('spin').value = "";
    	document.getElementById('curve').value = "";
    	document.getElementById('slope_break').value = "";
    	document.getElementById('club').value = "0";
    	document.getElementById('power_shot').value = "0";
    	document.getElementById('shot').value = "0";
    	document.getElementById('data_input_form').elements[0].focus();
    	result.color = 'White';
        result.innerHTML = ``;
    }
    
    function PressEnter(event) {
    	if(event.key==="Enter"){
    		const form = document.getElementById('data_input_form');
    		const index = [...form].indexOf(event.target);
    		
    		
    		if(index==8){
    			document.getElementById('calc_btn').focus();
    		}else{
    			
    				form.elements[index+1].focus();
    			
    		}
    	}
    }
    
    function PressEnterSelectCalip(event) {
    	if(event.key==="Enter"){
    		document.getElementById('fit_calip_btn').focus();
    	}
    }
    
    function PressEnterpower(event) {
    	if(event.key==="Enter"){
    		document.getElementById('auxpart_pwr').focus();
    	}
    }
    
    function PressEnterauxpart_pwr(event) {
    	if(event.key==="Enter"){
    		document.getElementById('card_pwr').focus();
    	}
    }
    
    function PressEntercard_pwr(event) {
    	if(event.key==="Enter"){
    		document.getElementById('mascot_pwr').focus();
    	}
    }
    
    function PressEntermascot_pwr(event) {
    	if(event.key==="Enter"){
    		document.getElementById('card_ps_pwr').focus();
    	}
    }
    
    function PressEntercard_ps_pwr(event) {
    	if(event.key==="Enter"){
    		document.getElementById('DRIVE_SET_BTN').focus();
    	}
    }
    
    const YARDS_TO_PB = 0.2167;
    const YARDS_TO_PBA = 0.8668;
    const YARDS_TO_PBA_PLUS = 1.032;
    
    function desvioByDegree(yards, distance) {
        return Math.sin(Math.atan2(yards * -1.5, distance)) * distance / 1.5;
    }
    
    function fix(value) {
    
        if (value < 0)
            value = Math.ceil(value);
        else
            value = Math.floor(value);
    
        return value;
    }
    
    function getSlopeByResolution() {
    
        const resolution = {
            width: checkValidInput(document.getElementById('rel-width').value),
            height: checkValidInput(document.getElementById('rel-height').value)
        };
    
        const auto_fit = document.getElementById('auto-fit').checked;
    
        if (resolution.height < 480)
            return 1.0;
    
        let value = resolution.height / 480;
    
        if (!auto_fit)
            value = fix(value);
    
        if (value == 0)
            value = 1.0;
    
        return value;
    }
    
    function getResolutionPBLimit() {
    
        const resolution = {
            width: checkValidInput(document.getElementById('rel-width').value),
            height: checkValidInput(document.getElementById('rel-height').value)
        };
    
        let value = ((480 / resolution.height * 0.006) * (resolution.width / 2)) / YARDS_TO_PB;
    
        if (value <= 0)
            value = 1.0;
    
        return value;
    }
    
    function smartDesvio(smartData) {
    
        let MAX_PB = checkValidInput(document.getElementById('smart-dev-limit').value);
    
        if (MAX_PB <= 0) // no limit
            MAX_PB = Math.floor(getResolutionPBLimit() * 10) / 10;
    
        const yards = desvioByDegree(smartData.desvio, smartData.options.distance);
    
        let pb_sample = yards / YARDS_TO_PB;
    
        if (Math.abs(pb_sample) <= MAX_PB)
            return `${pb_sample.toFixed(2)}pb`;
    
        pb_sample = yards / YARDS_TO_PBA;
    
        if (Math.abs(pb_sample) <= MAX_PB)
            return `${pb_sample.toFixed(2)}pba`;
    
        pb_sample = yards / YARDS_TO_PBA_PLUS;
    
        if (Math.abs(pb_sample) <= MAX_PB)
            return `${pb_sample.toFixed(2)}pba+`;
    
        // key 0 from keybord
        let powerRange = 230;
    
        for (let i = 12; i >= 0; --i) {
            
            smartData.club.init(CLUB_INFO[CLUB_INFO_ENUM[i]]);
            
            powerRange = smartData.club.getRange(smartData.options.power.options, smartData.options.power.pwr, smartData.options.ps);
    
            pb_sample = (yards / YARDS_TO_PB) / ((powerRange * 3.2 * 1.4 - smartData.altura) * 0.0625)
    
            if (Math.abs(pb_sample) <= MAX_PB)
                return `${pb_sample.toFixed(2)}pba${powerRange}`
        }
        
        return `${pb_sample.toFixed(2)}pba${powerRange}`
    }

    Quand à la nature du code je ne saurais le dire malheureusement...

    0