Petit programme de java qui bug.

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. Modérateur

    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
    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