<script>
document.addEventListener("DOMContentLoaded", function () {

  var nomDiametre = "cf[diametre]";
  var nomVitesse  = "cf[vitesse]";
  var nomRPM      = "cf[rmp]";

  var PI = Math.PI;

  function getEl(nom) {
    return document.querySelector("[name=\"" + nom + "\"]");
  }

  function calculer(nomModifie) {
    var elDiametre = getEl(nomDiametre);
    var elVitesse  = getEl(nomVitesse);
    var elRPM      = getEl(nomRPM);
    if (!elDiametre || !elVitesse || !elRPM) return;

    var diametre = parseFloat(elDiametre.value);
    var vitesse  = parseFloat(elVitesse.value);
    var rpm      = parseFloat(elRPM.value);

    if (!isNaN(diametre) && diametre !== 0) {
      // Diamètre connu : il sert de référence fixe.
      if (nomModifie === nomRPM) {
        // On a modifié RPM -> on recalcule Vitesse.
        if (!isNaN(rpm)) {
          elVitesse.value = ((PI * diametre * rpm) / 60000).toFixed(2);
        }
      } else {
        // On a modifié Vitesse (ou Diamètre lui-même) -> on recalcule RPM.
        if (!isNaN(vitesse)) {
          elRPM.value = ((vitesse * 60000) / (PI * diametre)).toFixed(2);
        }
      }
    } else if (nomModifie !== nomDiametre) {
      // Diamètre vide, et c est Vitesse ou RPM qu on modifie : on calcule en direct.
      if (!isNaN(vitesse) && !isNaN(rpm) && rpm !== 0) {
        elDiametre.value = ((vitesse * 60000) / (PI * rpm)).toFixed(2);
      }
    }
    // Si c est le champ Diamètre lui-même qu on est en train de vider/éditer,
    // on ne fait rien ici : voir gererBlurDiametre() ci-dessous.
  }

  function gererBlurDiametre() {
    var elDiametre = getEl(nomDiametre);
    var elVitesse  = getEl(nomVitesse);
    var elRPM      = getEl(nomRPM);
    if (!elDiametre || !elVitesse || !elRPM) return;

    var diametre = parseFloat(elDiametre.value);
    var vitesse  = parseFloat(elVitesse.value);
    var rpm      = parseFloat(elRPM.value);

    // Seulement si on a laissé le champ Diamètre vide en le quittant.
    if (isNaN(diametre) && !isNaN(vitesse) && !isNaN(rpm) && rpm !== 0) {
      elDiametre.value = ((vitesse * 60000) / (PI * rpm)).toFixed(2);
    }
  }

  [nomDiametre, nomVitesse, nomRPM].forEach(function (nom) {
    var el = getEl(nom);
    if (el) {
      el.addEventListener("input", function () { calculer(nom); });
    } else {
      console.warn("Champ non trouvé pour name=" + nom);
    }
  });

  var elDiametreFinal = getEl(nomDiametre);
  if (elDiametreFinal) {
    elDiametreFinal.addEventListener("blur", gererBlurDiametre);
  }
});
</script><script>
document.addEventListener("DOMContentLoaded", function () {

  var nomInch = "cf[valeur_inch]";
  var nomMM   = "cf[valeur_mm]";
  var FACTEUR = 25.4;

  function getEl(nom) {
    return document.querySelector("[name=\"" + nom + "\"]");
  }

  function convertir(nomModifie) {
    var elInch = getEl(nomInch);
    var elMM   = getEl(nomMM);
    if (!elInch || !elMM) return;

    var elSource = (nomModifie === nomInch) ? elInch : elMM;
    var elCible  = (nomModifie === nomInch) ? elMM : elInch;
    var valeur = parseFloat(elSource.value);

    // Champ vide ou saisie en cours (ex. "-" ou ",") : on vide l autre champ
    // pour ne pas laisser une valeur qui ne correspond plus a rien.
    if (isNaN(valeur)) {
      elCible.value = "";
      return;
    }

    // Resolution : 5 decimales pour les mm (0.00001 mm), 8 pour les inch
    // (0.0001 mm = 0.0000039 inch). On retire les zeros inutiles sans passer
    // par la notation scientifique (1e-7).
    if (nomModifie === nomInch) {
      elCible.value = formater(valeur * FACTEUR, 5);
    } else {
      elCible.value = formater(valeur / FACTEUR, 8);
    }
  }

  function formater(nombre, decimales) {
    var s = nombre.toFixed(decimales);
    if (s.indexOf(".") !== -1) {
      s = s.replace(/0+$/, "").replace(/\.$/, "");
    }
    return parseFloat(s) === 0 ? "0" : s;
  }

  [nomInch, nomMM].forEach(function (nom) {
    var el = getEl(nom);
    if (el) {
      el.addEventListener("input", function () { convertir(nom); });
    } else {
      console.warn("Champ non trouvé pour name=" + nom);
    }
  });
});
</script><script>
document.addEventListener("DOMContentLoaded", function () {

  // f = avance par tour (mm/tr), F = avance (mm/min), n = rotation (RPM)
  // Règle : les 2 derniers champs saisis restent fixes, le 3e est recalculé.
  var nomF_tour = "cf[avance_par_tour]";
  var nomF_min  = "cf[avance_mm]";
  var nomN      = "cf[avance_rotation]";

  var noms = [nomF_tour, nomF_min, nomN];
  var historique = []; // champs saisis (valeur valable), le plus récent en dernier

  function getEl(nom) {
    return document.querySelector("[name=\"" + nom + "\"]");
  }

  function lire(nom) {
    var el = getEl(nom);
    return el ? parseFloat(el.value) : NaN;
  }

  function ecrire(nom, valeur, decimales) {
    var el = getEl(nom);
    if (el && isFinite(valeur)) {
      el.value = String(parseFloat(valeur.toFixed(decimales)));
    }
  }

  function calculer(nomModifie) {
    // Le champ édité sort de l historique ; il n y revient que s il contient un nombre.
    historique = historique.filter(function (n) { return n !== nomModifie; });

    // Champ vidé ou saisie en cours : on ne touche à rien (évite de remplir
    // automatiquement un champ qu on est en train d effacer).
    if (isNaN(lire(nomModifie))) return;

    historique.push(nomModifie);
    if (historique.length > 2) historique.shift();
    if (historique.length < 2) return;

    var cible = noms.filter(function (n) { return historique.indexOf(n) === -1; })[0];
    var f = lire(nomF_tour);
    var F = lire(nomF_min);
    var n = lire(nomN);

    if (cible === nomF_min) {
      ecrire(nomF_min, f * n, 2);
    } else if (cible === nomF_tour && n !== 0) {
      ecrire(nomF_tour, F / n, 4);
    } else if (cible === nomN && f !== 0) {
      ecrire(nomN, F / f, 2);
    }
  }

  noms.forEach(function (nom) {
    var el = getEl(nom);
    if (el) {
      el.addEventListener("input", function () { calculer(nom); });
    } else {
      console.warn("Champ non trouvé pour name=" + nom);
    }
  });
});
</script><script>
document.addEventListener("DOMContentLoaded", function () {

  var nomDegres    = "cf[degres]";
  var nomMinutes   = "cf[minutes]";
  var nomSecondes  = "cf[secondes]";
  var nomDegDec    = "cf[degres_decimaux]";

  function getEl(nom) {
    return document.querySelector("[name=\"" + nom + "\"]");
  }

  function versDecimal() {
    var elDeg = getEl(nomDegres);
    var elMin = getEl(nomMinutes);
    var elSec = getEl(nomSecondes);
    var elDD  = getEl(nomDegDec);
    if (!elDeg || !elMin || !elSec || !elDD) return;

    var deg = parseFloat(elDeg.value); if (isNaN(deg)) deg = 0;
    var min = parseFloat(elMin.value); if (isNaN(min)) min = 0;
    var sec = parseFloat(elSec.value); if (isNaN(sec)) sec = 0;

    var dd = deg + (min / 60) + (sec / 3600);
    elDD.value = dd.toFixed(5);
  }

  function versDMS() {
    var elDeg = getEl(nomDegres);
    var elMin = getEl(nomMinutes);
    var elSec = getEl(nomSecondes);
    var elDD  = getEl(nomDegDec);
    if (!elDeg || !elMin || !elSec || !elDD) return;

    var dd = parseFloat(elDD.value);
    if (isNaN(dd)) return;

    // On passe par un total de secondes arrondi une seule fois,
    // pour éviter que les erreurs d arrondi flottant ne s accumulent
    // à travers plusieurs floor()/soustractions successifs.
    var totalSecondes = Math.round(dd * 3600 * 100) / 100;

    var deg = Math.floor(totalSecondes / 3600);
    var resteSecondes = totalSecondes - (deg * 3600);
    var min = Math.floor(resteSecondes / 60);
    var sec = resteSecondes - (min * 60);

    elDeg.value = deg;
    elMin.value = min;
    elSec.value = sec.toFixed(2);
  }

  [nomDegres, nomMinutes, nomSecondes].forEach(function (nom) {
    var el = getEl(nom);
    if (el) {
      el.addEventListener("input", versDecimal);
    } else {
      console.warn("Champ non trouvé pour name=" + nom);
    }
  });

  var elDD = getEl(nomDegDec);
  if (elDD) {
    elDD.addEventListener("input", versDMS);
  } else {
    console.warn("Champ non trouvé pour name=" + nomDegDec);
  }
});
</script><script>
document.addEventListener("DOMContentLoaded", function () {

  // Triangle rectangle, selon le schéma de la page :
  // A = hypoténuse (côté oblique), B = côté horizontal (adjacent à l angle),
  // C = côté vertical (opposé à l angle), resultat = angle alpha (en degrés).
  // Règle : les 2 derniers champs saisis restent fixes, les 2 autres sont recalculés.
  var nomA     = "cf[trigonometrie_A]";
  var nomB     = "cf[trigonometrie_B]";
  var nomC     = "cf[trigonometrie_C]";
  var nomAlpha = "cf[trigonometrie_resultat]";

  var noms = [nomAlpha, nomA, nomB, nomC];
  var RAD = Math.PI / 180;
  var historique = []; // champs saisis (valeur valable), le plus récent en dernier

  function getEl(nom) {
    return document.querySelector("[name=\"" + nom + "\"]");
  }

  function lire(nom) {
    var el = getEl(nom);
    return el ? parseFloat(el.value) : NaN;
  }

  function ecrire(nom, valeur) {
    var el = getEl(nom);
    if (el) el.value = String(parseFloat(valeur.toFixed(4)));
  }

  function vider(nom) {
    var el = getEl(nom);
    if (el) el.value = "";
  }

  // Retourne les 2 valeurs à calculer, ou null si les données sont incohérentes.
  function resoudre(connus, v) {
    var al = v[nomAlpha], A = v[nomA], B = v[nomB], C = v[nomC];
    var r = {};

    function has(nom) { return connus.indexOf(nom) !== -1; }

    // Valeurs saisies : strictement positives, angle strictement entre 0 et 90.
    for (var i = 0; i < connus.length; i++) {
      var x = v[connus[i]];
      if (!(x > 0)) return null;
      if (connus[i] === nomAlpha && !(x < 90)) return null;
    }

    if (has(nomAlpha) && has(nomA)) {
      r[nomB] = A * Math.cos(al * RAD);
      r[nomC] = A * Math.sin(al * RAD);
    } else if (has(nomAlpha) && has(nomB)) {
      r[nomA] = B / Math.cos(al * RAD);
      r[nomC] = B * Math.tan(al * RAD);
    } else if (has(nomAlpha) && has(nomC)) {
      r[nomA] = C / Math.sin(al * RAD);
      r[nomB] = C / Math.tan(al * RAD);
    } else if (has(nomA) && has(nomB)) {
      r[nomAlpha] = Math.acos(B / A) / RAD;
      r[nomC] = Math.sqrt(A * A - B * B);
    } else if (has(nomA) && has(nomC)) {
      r[nomAlpha] = Math.asin(C / A) / RAD;
      r[nomB] = Math.sqrt(A * A - C * C);
    } else {
      r[nomAlpha] = Math.atan(C / B) / RAD;
      r[nomA] = Math.sqrt(B * B + C * C);
    }

    for (var k in r) {
      if (!isFinite(r[k]) || !(r[k] > 0)) return null;
    }
    return r;
  }

  function calculer(nomModifie) {
    // Le champ édité sort de l historique ; il n y revient que s il contient un nombre.
    historique = historique.filter(function (n) { return n !== nomModifie; });

    // Champ vidé ou saisie en cours : on ne touche à rien (évite de remplir
    // automatiquement un champ qu on est en train d effacer).
    if (isNaN(lire(nomModifie))) return;

    historique.push(nomModifie);
    if (historique.length > 2) historique.shift();
    if (historique.length < 2) return;

    var valeurs = {};
    noms.forEach(function (n) { valeurs[n] = lire(n); });

    var cibles = noms.filter(function (n) { return historique.indexOf(n) === -1; });
    var res = resoudre(historique, valeurs);

    if (res) {
      cibles.forEach(function (n) { ecrire(n, res[n]); });
    } else {
      // Données incohérentes (ex. B plus grand que A) : on vide les champs calculés.
      cibles.forEach(vider);
    }
  }

  noms.forEach(function (nom) {
    var el = getEl(nom);
    if (el) {
      el.addEventListener("input", function () { calculer(nom); });
    } else {
      console.warn("Champ non trouvé pour name=" + nom);
    }
  });
});
</script>#  ActionCalc

## Les calculs essentiels de la rectification, toujours à portée de main. ActionCalc regroupe les formules les plus utiles au quotidien pour vous permettre de trouver rapidement la bonne valeur.

Compatible pour les smartphones.

### Calculateur de vitesse

  Diamètre (mm)

  Vitesse (m/s)

  RPM (tr/min)

 Website

### Conversion inch / mm

  Valeur en inch

  Valeur en millimètres (mm)

 Name

### Avance par tour

  Avance (mm/min)

  Rotation par minute (RPM)

  Avance par tour (mm/tr)

 First Name

### Calculateur d'angle

  Degrés

  Minutes

  Secondes

  Degrés décimaux

 Name

### Calculateur de trigonométrie

  A

  B

  C

  a

![](https://actionsuper.ch/images/Photos/schema-trigonometrie/schema-trigonometrie-v2.webp)

 Phone
