Calcul angle moyen avec itérations non listés [Résolu] - Forum Javascript

Calcul angle moyen avec itérations non listés Calculer une moyenne sur 20 avec Excel [Résolu] (Résolu) » Forum - Excel Calculer la moyenne mensuelle de données par jour sur excel [Résolu] (Résolu) » Forum - Excel Calculer une moyenne avec open office calc ? [Résolu] (Résolu) » Forum - LibreOffice / OpenOffice Calculer une moyenne toute les 3 lignes. (Résolu) » Forum - Excel Calculer une moyenne SI plusieurs conditions (Résolu) » Forum - Excel

Bonjour,

J'ai une extension Google Chrome qui m'extrait les valeurs d'une page web et qui me liste les instructions sous forme de tableau

Le rendu du popup.html me donne ceci :



La dessus tout va bien pas de soucis ;)

Petite précision qui à son importance, dans la colonne TWA, les valeurs en vert sont positives et les valeurs en rouge sont négatives

Je ne parlerais que de TWA et TWAm ( BTW et BTWm c'est la même chose sauf que cela se passe sur 360° et je possède déjà le minuscule bout de code me permettant de faire la conversion)

[COURS RELOU ... ] En navigation maritime, le vert c'est à droite et on l'appelle tribord ; le rouge c'est à gauche et on l'appelle bâbord. Tribord et Bâbord sont donc 2 "cotés" différents que l'on appelle "bords" [/ COURS RELOU ...]

TWAm ne fait pas parti des valeurs extraites puis listées, c'est une valeur calculée.

# Pour les 2 premières lignes les valeurs sont rouges donc c'est le même bord ( cf COURS RELOU ... ; valeurs négatives)
de T+0:00 pour aller à T+0:10: je dois faire du -45°

de T+0:00 pour aller à T +0:30: (-45 + -50) / 2 ? , ben nan ... il y a une itération non listée ( T +0:20 = -50° ) donc le calcul sera donc (-45 + - 50 + -50) / 3 = -48,3°

# Pour la ligne suivante, les valeurs sont vertes donc changement de bord ( je remet pas le cf et ce qui va avec )
donc la valeur TWA de T +0:30 devient la valeur de réference comme si elle était T +0:00 et la logique de calcul est identique à l'exemple des 2 premieres lignes décrite ci dessus.

Oui MAIS cette logique de calcul est fausse ..., il faut passer par la trigonométrie si on travail avec des angles.

On m'a donné ce code : (Qui fait parfaitement le travail quand on lui rentre les valeurs à la main)

{      const         anglesMesuré = [ 276, 271, 270, 273, 274, 277 ],         converDegEnRadian = Math.PI / 180.0,         converRadianEnDeg = 180.0 / Math.PI;      let         arX = [],         arY = [],         sommeX = 0.0,         sommeY = 0.0,         moyenneX = 0.0,         moyenneY = 0.0,         angleMoyen = 0.0;      for ( const [ i, angle ] of anglesMesuré.entries() ){         arX[ i ] = Math.cos( angle * converDegEnRadian );         arY[ i ] = Math.sin( angle * converDegEnRadian );     }      for ( const value of arX ){         sommeX += value;     }      moyenneX = sommeX / arX.length;      for ( const value of arY ){         sommeY += value;     }      moyenneY = sommeY / arY.length;      angleMoyen = Math.round ( ( Math.atan2( moyenneY, moyenneX ) * converRadianEnDeg ) * 10 ) / 10;      console.log( `L'angle moyen du vent est de ${angleMoyen}°` ); }


Je souhaiterais mettre en place une fonction qui s'appellerais twam et qui aurait pour argument time ou ttw et twa ( il en faut peut être d'autres ... ) - function twam (time ou ttw, twa) {un code similaire à celui du dessus}
et la est mon soucis ( d'ou le post ) avec prise en compte des itérations manquantes ...

Je vous transmet le popup.js actuelle, tout ce qui concerne TWAm et BTWm est commenté dans le code.

Je suis preneur de toutes infos pouvant m'aider à réaliser cette fonction twam qui automatiserait de façon valide, ce coup ci, le calcul de moyenne limité au bord et qui recommencerait pour le bord suivant et ainsi de suite.

popus.js :

var background = [/download/telecharger-34056452-google-chrome chrome].extension.getBackgroundPage();  /* var hour_actu = 0; var hour_change = 0; var hour_prec = 0; var nb_step = 0;  var twam = 0; var twa_prec = 0; var tot_twa_prec = 0; var tot_twa = 0;  var btwm = 0; var btw_prec = 0; var tot_btw_prec = 0; var tot_btw = 0;  var twa_btw_change = 0; */  function createCell(value, row) {     var cell = document.createElement("td");     cell.innerHTML = value;     row.appendChild(cell); }  function ttwStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function dtwStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function dtgStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function twsStyling(value1, value2, cell) {     var tws_foil = value1.replace(" kt", "");     var twa_bd = value2.replace("\u00B0", "");     if (tws_foil >= 11.1 && tws_foil <= 39.9 && Math.abs(twa_bd) >= 71 && Math.abs(twa_bd) <= 169) {         cell.style.backgroundColor = "black";         cell.style.color = "white";     } else {         cell.style.backgroundColor = "white";         cell.style.color = "black";     }     cell.innerHTML = tws_foil + " kt"; }  function twaStyling(value, cell) {     var twa_bd = value.replace("\u00B0", "");     if (twa_bd >= 0) {         cell.style.color = "green";     } else {         cell.style.color = "red";     }     cell.innerHTML = Math.abs(twa_bd) + "\u00B0"; }  function btwStyling(value, cell) {     cell.style.color = "blue";     cell.innerHTML = value; }  function sailStyling(value, cell) {     switch (value.trim()) {         // Upwind sail         case "Jib":             cell.style.backgroundColor = "#FFD479";             break;         case "LJ":             cell.style.backgroundColor = "#FFFC79";             break;         case "Stay":             cell.style.backgroundColor = "#D4FB79";             break;         // Downwind sail         case "Spi":             cell.style.backgroundColor = "#76D6FF";             break;         case "LG":             cell.style.backgroundColor = "#7A81FF";             break;         case "HG":             cell.style.backgroundColor = "#D783FF";             break;         // Reaching sail         case "C0":             cell.style.backgroundColor = "#FF7E79";             break;     }     cell.innerHTML = value; }  function twamStyling(value, cell) {     if (value >= 0) {         cell.style.color = "green";     } else {         cell.style.color = "red";     }     if (value != "-") {         cell.innerHTML = Math.abs(value) + "\u00B0";     } else {         cell.style.color = "black";         cell.innerHTML = value;     } }  function btwmStyling(value, cell) {     cell.style.color = "blue";     if (value != "-") {         cell.innerHTML = value + "\u00B0";     } else {         cell.style.color = "black";         cell.innerHTML = value;     } }  function createCellWithCustomStyling(value, row, customStyling) {     var cell = document.createElement("td");     customStyling(value, cell);     row.appendChild(cell); }  function createCellWithCustomStyling2(value1, value2, row, customStyling) {     var cell = document.createElement("td");     customStyling(value1, value2, cell);     row.appendChild(cell); }  /* function calc_nb_ite(value) {     var delta_t = value.match(/.*?([0-9]{1,}):([0-9]{2})/);     hour_prec = hour_actu;     hour_actu = delta_t[1] * 6 + delta_t[2] / 10;     nb_step = hour_actu - hour_prec; }  function calc_twam(value) {     ss_tot = parseFloat(value.replace("\u00B0", ""));     tot_twa = tot_twa_prec + (twa_prec * nb_step);     if (hour_actu == hour_change) {         twam = "-";     } else {         twam = tot_twa / (hour_actu - hour_change);         twam = Math.round(twam);     }     tot_twa_prec = tot_twa;     twa_btw_change = 0;     if ((twa_prec * ss_tot) <= 0) {         tot_twa_prec = 0;         twa_btw_change = 1;     }     twa_prec = ss_tot; }  function calc_btwm(value) {     ss_tot = parseFloat(value.replace("\u00B0", ""));     // N1     if (btwm >= 270 && btw_prec <= 90) {         btw_prec = btw_prec + 360;     } else {         if (btwm <= 90 && btw_prec >= 270) {             btw_prec = btw_prec - 360;         }     }     // End N1     tot_btw = tot_btw_prec + (btw_prec * nb_step);     if (hour_actu == hour_change) {         btwm = "-";     } else {         btwm = tot_btw / (hour_actu - hour_change);         // N2         if (btwm >= 360) {             btwm = btwm - 360;         } else {             if (btwm < 0) {                 btwm = btwm + 360;             }         }         // End N2         btwm = Math.round(btwm);     }     tot_btw_prec = tot_btw;     if (twa_btw_change == 1) {         tot_btw_prec = 0;         nb_step = 0;         hour_prec = hour_actu;         hour_change = hour_actu;     }     btw_prec = ss_tot; } */  function reinitializeDisplay() {     document.getElementById("pointsTable").innerHTML = ""; }  function UtcToLocal(date, time, timezone) {     var utcYear = date.split("-")[0];     var utcMonth = (date.split("-")[1])-1;     var utcDay = date.split("-")[2];      var utcHour = time.split(":")[0];     var utcMinutes = time.split(":")[1];      var utcTimeZone = timezone[1];      var dateUtc = Date.UTC(utcYear, utcMonth, utcDay, utcHour, utcMinutes, 0, 0);     var localDate = new Date(dateUtc);      var year = localDate.getFullYear();     var month = ("0"+(localDate.getMonth()+1)).slice(-2);     var day = ("0"+localDate.getDate()).slice(-2);      var hours = ("0" + localDate.getHours()).slice(-2);     var minutes = ("0" + localDate.getMinutes()).slice(-2);      var offset = -localDate.getTimezoneOffset();     var absOffset = Math.abs(offset);     var sign = (offset > 0) ? "+" : "-";     var hoursOffset = Math.trunc(absOffset) / 60;     var MinutesHoursOffset = (hoursOffset === 0) ? "\u00b1" + "0" : sign + hoursOffset;     var minutesOffset = absOffset % 60;     var HoursMinutesOffset = (minutesOffset === 0) ? MinutesHoursOffset : sign + hoursOffset + ":" + minutesOffset;      var formattedDate = year + "-" + month + "-" + day;     var formattedTime = hours + ":" + minutes;     var formattedTimeZone = "UTC" + HoursMinutesOffset;     return [formattedDate,formattedTime,formattedTimeZone]; }  function getTimeZone(timezone) {     if (timezone === "CET") {         return "UTC+1";     } else if (timezone === "CEST") {         return "UTC+2";     } }  function displayTable(localTime) {     points.forEach(function (element) {         var row = document.createElement("tr");         document.getElementById("pointsTable").appendChild(row);         if (localTime && element.timezone === "CET" | "CEST") {             var ceTZ = getTimeZone(element.timezone);             createCell(element.date, row);             createCell(element.time, row);             createCell(ceTZ, row)         } else if (localTime && element.timezone === "UTC") {             var localDTZ = UtcToLocal(element.date,element.time,element.timezone);             createCell(localDTZ[0], row);             createCell(localDTZ[1], row);             createCell(localDTZ[2], row);         } else {             createCell(element.date, row);             createCell(element.time, row);             createCell(element.timezone, row)         }         createCellWithCustomStyling(element.ttw, row, ttwStyling);         //calc_nb_ite(element.ttw);         createCellWithCustomStyling(element.dtw, row, dtwStyling);         createCellWithCustomStyling(element.dtg, row, dtgStyling);         createCell(element.twd, row);         createCellWithCustomStyling2(element.tws, element.twa, row, twsStyling);         createCellWithCustomStyling(element.twa, row, twaStyling);         //calc_twam(element.twa);         createCellWithCustomStyling(element.btw, row, btwStyling);         //calc_btwm(element.btw);         createCellWithCustomStyling(element.sail, row, sailStyling);         createCell(element.stw, row);         createCellWithCustomStyling(twam, row, twamStyling);         createCellWithCustomStyling(btwm, row, btwmStyling);         var manifest = chrome.runtime.getManifest();         document.getElementById("version").innerHTML = manifest.version;     }); }  var displayLocal = function () {     reinitializeDisplay();     if (document.getElementById("localtime").checked) {         chrome.storage.local.set({"localTime" : true});         displayTable(true);     } else {         chrome.storage.local.set({"localTime" : false});         displayTable(false);     } };  document.getElementById("localtime").addEventListener("change", displayLocal);  chrome.storage.local.get("localTime",function (result) {     if(result.localTime === true){         document.getElementById("localtime").checked = true;         displayLocal();     } else {         document.getElementById("localtime").checked = false;     } }); reinitializeDisplay(); var points = background.points[background.currentTab]; displayTable(false);

S'il vous faut autre chose ( popup.html ou autre fichier composant l'extension je vous les fournirais avec grand plaisir )

Merci d'avoir pris le temps de me lire et au plaisir de vous lire ;)


Forum

Calcul angle moyen avec itérations non listés Calculer une moyenne sur 20 avec Excel [Résolu] (Résolu) » Forum - Excel Calculer la moyenne mensuelle de données par jour sur excel [Résolu] (Résolu) » Forum - Excel Calculer une moyenne avec open office calc ? [Résolu] (Résolu) » Forum - LibreOffice / OpenOffice Calculer une moyenne toute les 3 lignes. (Résolu) » Forum - Excel Calculer une moyenne SI plusieurs conditions (Résolu) » Forum - Excel

Web: www.shapebootstrap.net

127 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Dans un premier temps, créé une fonction qui renvoie sous la forme d'une liste l'ensemble des valeurs qu'il te faut. Elle sera chargée de l'extraction des données.

Pour chaque element de

var points = background.points[background.currentTab];
, il faut utiliser les fonctions suivantes :
 calc_nb_ite(element.ttw); calc_twam(element.twa); 


et récupérer la valeur de la variable globale twam et la stocker dans une liste.

Reply
réponses:
  • auteur

  • GeGaX

    Merci de ta réponse
    Je sais pas si je comprends mal mais bon tu vas me le dire ...

    L'extraction des valeurs de chaque instructions est faite avec un autre script nommé myscript.js ( ci dessous )

    myscript.js

    "use strict";

    const pattern = /updi\(event,'([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}) ([A-Z]{3,4}).*(T[+-]{1}.*?[0-9]{1,}:[0-9]{2}).*<br>Distances:.*?([0-9]{1,}\.[0-9]{1,}nm)\/([0-9]{1,}\.[0-9]{1,}nm)<br><b>Wind:<\/b> ([0-9]*?.*) (.*? kt).*\(<b>TWA(.*?)<\/b>\)<br><b>Heading:<\/b>(.*?)<b>Sail:<\/b>(.*?)<br><b>Boat Speed:<\/b>(.*?)'/g
    const points = [];
    try {
    Array.prototype.slice.call(document.getElementsByTagName("img")).forEach(function (element) {
    var event = element.getAttribute("onmouseover");
    if (event !== null) {
    var match = pattern.exec(event);

    const date = match[1];
    const time = match[2];
    const timezone = match[3];
    const ttw = match[4];
    const dtw = match[5];
    const dtg = match[6];
    const twd = match[7];
    const tws = match[8];
    const twa = match[9];
    const btw = match[10];
    const sail = match[11];
    const stw = match[12];

    points.push({
    date : date,
    time : time,
    timezone : timezone,
    ttw : ttw,
    dtw : dtw,
    dtg : dtg,
    twd : twd,
    tws : tws,
    twa : twa,
    btw : btw,
    sail : sail,
    stw : stw
    });
    pattern.lastIndex = 0;
    }
    });

    chrome.runtime.sendMessage(points);
    } catch (e) {
    console.error(e);
    chrome.runtime.sendMessage([]);
    }


    Est ce suffisant ou pas du tout, pour pouvoir traiter ?

    Hésite pas à détailler au max stp, mes connaissances sont limités mais j'abandonne jamais ;)

  • auteur

    Oui, il faut que tu parcours tous les éléments de points et pour chaque élément tu fasses les instructions que j'ai mis dans mon message (appel aux fonctions et récupération valeur)

  • GeGaX

    je vois pas ou tu veux en venir ...

    j'ai rien codé juste fais un console.log(element.ttw, element.twa, nb_step) twam je le squiz puisque la fonction actuelle n'est pas un calcul trigo et j'obtiens ceci

    http://img1.imagilive.com/0218/Capture_decran_2018-02-21_a_222548.png

    Ce que je comprends de mon coté c'est que les valeurs dont j'ai besoin ( twa et itérations ) sont déjà listés donc je peux m'en servir pour créer ma fonction ( avec calcul trigo ) twam.

    C'est vers là que tu veux en venir ?

  • auteur

    Il faut que tu prennes le code qu'on t'a donné initialement mais que tu remplaces les valeurs de "anglesMesuré" par celles que tu as dans ton console.log en les ajoutant une à une dans un tableau vide initialement.

  • GeGaX

    Ok j'avais donc bien compris, je m'en occupe demain et te tiens au jus
    Merci Help-Jason ;)

  • GeGaX

    Je veux bien un coup de pouce stp ...

    Ma problématique c'est que je suppose qu'il faille une boucle pour verifier et incrémenter les itérations manquantes

    - Créer le tableau ça, ça va.
    - Mettre les valeurs listés, avec push je pense que ça doit le faire
    - Pour les itérations manquantes, une boucle pourrait vérifier que la valeur ttw + 10 min existe si oui elle met la valeur listée sinon elle met la valeur précédente je me passe du calcul d'itération

    C'est possible ce genre de chose ?

    Je te demande ça car le code actuel de twam ( hormis qu'il soit pas un calcul trigo ) se modifie avec activation de la checkbox LocalTime si twam est sous forme de fonction sans valeurs stockée je ne sais où je n'aurais plus de bug

  • auteur

    Ou alors tu crées une map qui associe le temps de l'itération avec sa valeurs. Tu remplis la map avec les valeurs dont tu disposes. Tu fais ensuite une boucle qui va chercher dans la map chaque itération de temps. Si ça existe, ça ajoute le résultat dans une liste. Sinon, ça veut dire que l'itération est manquante.

    D'ailleurs que fais-tu dans ce cas ? Tu appelles un algo qui extrapole la valeur à ce temps donné ?

  • GeGaX

    Heu là tu m'as perdu va falloir que je fasse quelques recherches ...

    Par map tu entends un tableau ?
    Si l'itération est manquante, twa est égal à la valeur de l'itération précédente.

  • GeGaX

    Si tu as un exemple je veux bien ça me permettrait de comprendre comment il faut aborder ça de la manière la moins complexe possible

  • auteur

    Voici la documentation officielle Javascript décrivant le fonctionnement de l'objet Map avec un exemple : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Map

    Il faut que tu parcours l'ensemble des incrémentations de temps possibles. Quand ça existe, tu l'ajoute à la map et tu mets à jour une variable qui stocke le dernier incrément possible. Quand ça existe pas, tu ajoutes à la map à l'incrément courant la valeur de l'incrément stockée dans ta variable (qui correspond à la dernière valeur possible).

  • GeGaX

    Ok je regarde ça merci

  • GeGaX

    Visiblement c'est la méthode à utiliser, créer un combo de valeurs ttw : twa.
    C'est pas super évident à mettre en oeuvre ...
    Prenons cet exemple "simple" mais qui regroupe toutes mes contraintes.
    http://img1.imagilive.com/0218/Capture_decran_2018-02-24_a_193138.png

    Peux tu me montrer comment tu coderais ça ( avec un lien jsbin ) histoire que je manipule le truc pour comprendre
    Merci

  • auteur

     var myMap = new Map(); for(var index=0; index<points[0].ttw.length; index++){     myMap.set(points[0].ttw[index], points[0].twa[index]); } console.log(myMap); 

  • GeGaX

    Merci Help-Jason
    Je crois comprendre ce que tu fais avec ce code, je l'ai inséré dans popup.js mais il y a un truc qui lui plait pas dans la condition ...

    http://img1.imagilive.com/0218/Capture_decran_2018-02-26_a_231306.png

    Je peux te fournir les sources de l'extension ainsi qu'une adresse où tester (J'ai dans l'idée que si tu as tout ça serait plus facile)

  • auteur

    C'est un problème avec la porté de la variable points. Elle est définie à la fin du fichier et donc tu dois mettre ce code après les lignes suivantes :

     reinitializeDisplay(); var points = background.points[background.currentTab]; displayTable(false); 

  • GeGaX

    Ok merci pour l'info je test ça ce soir dès que je rentre du taf

  • GeGaX

    J'ai mis le code comme tu me l'as indiqué et dans la console j'obtiens ceci

    http://img1.imagilive.com/0218/Capture_decran_2018-02-27_a_192444.png

    le résultat n'a pas l'air celui souhaité ?

    Tu veux pas que je te file les sources et le lien pour tester ? Moi je suis incapable de faire ce que tu codes ...

  • auteur

    J'ai dû faire une erreur dans la structure du tableau points. Essaye avec ce code :

     var myMap = new Map(); for(var index=0; index<points.length; index++){     myMap.set(points[index].ttw, points[index].twa); } console.log(myMap); 

  • GeGaX

    Chapeau l'artiste !

    http://img1.imagilive.com/0218/Capture_decran_2018-02-27_a_200138.png

    1 ère étape valider ! ;)

    La seconde étape c'est les itérations manquantes ?

  • auteur

    Oui et là je te laisse faire. Tu as la base de code sur laquelle démarrer tes recherches. Je suis là pour te guider en terme de fonctionnalités élémentaires à développer.

    Pour les itérations manquantes, il faut que tu fasses plusieurs choses.
    1. Créer une fonction, que l'on appellera "genIterationSuivante", qui prend en entrée une itération et qui génère en sortie l'itération suivante
    2. Pour chaque itération parcourue, conserver la dernière itération parcourue dans une variable que l'on appellera "derniereIteration"
    3. TANT QUE

    genIterationSuivante(derniereIteration)
    est différent de itération courante ALORS :
    3.1 Ajouter dans la map
    (genIterationSuivante(derniereIteration), points[index].twa)

    3.2
    derniereIteration = genIterationSuivante(derniereIteration)

  • GeGaX

    Ok j'm'y colle
    je mettrais le code ici
    Merci Help-Jason

    PS: on dirait que tu as le code tout fait devant les yeux ;)

  • GeGaX

    Bon j'ai le cerveau qui est en ébullition ...
    Questions:
    Est ce que le but est de créer une nouvelle Map ?
    Y'a t'il une notion d'iterationActuel + 10min = IterationSuivante ?
    Si oui dois je construire l'itération suivante sous la forme T+ xx:xx ?
    Merci

  • auteur

    Non, le but est de modifier le contenu de la Map

    myMap
    que nous avons créé précédemment.

    Oui, la fonction que je te demande de développer prend en entrée une itération et ressort en sortie l'itération + 10 min.

    Dans la mesure du possible, garde le même formalisme que les autres formes d'itération donc oui sous la forme T+ xx:xx.

  • GeGaX

    Ok j'm'y remet et te tiens au jus
    Merci ;)

  • GeGaX

    Bon je pense être dans le vrai pour les points 1 et 2 ci dessus

    ttw = "T+ 0:00";

    function genIterationSuivante () {
    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);
    itérationSuivante = parseFloat(iterationActuelle[2]) + 10;
    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {
    return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);
    } else {
    return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);
    }
    derniereIteration = iterationSuivante;
    }
    console.log(genIterationSuivante());


    Ça doit être un code affreux ... mais je ça fonctionne correctement il me semble
    je l'ai testé sur JSBin
    Dis moi ce que tu en penses ...

  • auteur

    J'ai testé aussi la fonction grossièrement, ça semble avoir le comportement souhaité. Plutôt que d'appeler une variable globale dans ta fonction, utilise un paramètre :

     ttw = "T+ 0:00";  function genIterationSuivante (ttw) {    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } } console.log(genIterationSuivante(ttw)); 

  • auteur

    Ok merci.
    Ce soir je m’occupe des points 3.
    Je te mettrais le code ici

    Je suppose que ttw dans la fonction est à remplacer par « points[index].ttw » ?

  • auteur

    Il faut que tu appelles la fonction :

    genIterationSuivante(points[index].ttw);

  • GeGaX

    Sans grande conviction et en essayant d'être logique je te propose ça :

    function genIterationSuivante (points[index].ttw) {
    iterationActuelle = points[index].ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);
    itérationSuivante = parseFloat(iterationActuelle[2]) + 10;
    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {
    return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);
    } else {
    return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);
    }
    }

    var derniereIteration = genIterationSuivante(points[index].ttw);
    for ( var index = 0, genIterationSuivante(derniereIteration) < iterationActuelle[0], index++ ) {
    myMap.set(genIterationSuivante(points[index].ttw), points[index].twa);
    }
    var derniereIteration = genIterationSuivante(derniereIteration);


    Désolé j'arrive pas à formater le code ...

  • auteur

    Il faut que tu partes de cette base :

     function genIterationSuivante (ttw) {    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } }  var myMap = new Map(); for(var index=0; index<points.length; index++){     myMap.set(points[index].ttw, points[index].twa); } 


    La boucle actuellement fait le travail suivant :
    POUR index VARIANT de 0 à
    points.length
    (taille du tableau de mesure) avec un incrément de 1 (
    index++
    ) :
    1. Ajoute dans la Map
    myMap
    la paire
    points[index].ttw
    (la valeur de ttw pour la mesure pointée par index dans points),
    points[index].twa
    (la valeur de twa pour la mesure pointée par index dans points)

    Quand tu as affiché la Map myMap après ce traitement, tu as vu que les twa sont associés aux ttw mais qu'il manque tout de même des itérations.
    En modifiant le code ci-dessus :
    1. Créer une variable qui contiendra la valeur de ttw pour chaque valeur parcourue par la boucle
    2. Afficher pour chaque modification de cette variable son contenu

    Quand tu aura fait ça, poste le code ci-dessus modifié. Pour respecter indentation, utilise les bannières de code js prévues (dans édition de message, clique sur <> et choisis js)

  • GeGaX

    Ok je crois que j'avais pas bien compris le truc ...

    C'est ce code existant qui doit être modifié, on ajoute pas une fonction à celle existante, le but étant d'obtenir une seule fonction qui créer la Map mais qui en même temps liste les itérations manquantes ?
    Au finale

    console.log(MyMap)
    affichera T+ 0:00 avec une valeur twa; T+ 0:10 avec valeur twa; T+ 0:20 avec ... et ainsi de suite jusqu'a
    points.length
    ( qui détermine la 'longueur' du tableau.

    C'est bien ça ?

  • auteur

    Oui, ce sera à toi de détecter quand des itérations sont manquantes et compléter la map avec la dernière valeur possible

  • GeGaX

    je suis dessus là et sincèrement je sais pu comment m'y prendre je vais tenter de l'écrire pour pouvoir le coder par la suite ...

  • GeGaX

    Purée c'est pas évident ...
    Je suppose que tu as déjà tout le code d'écrit ? ( je veux pas que tu me le donnes je veux juste savoir )
    En supposant que oui, dans ma réflexion ..., la fonction genIterationSuivante prend ttw ET twa

    function genIterationSuivante (ttw, twa)

    Je garde le code pour ttw et je stock la valeur de twa dans une variable.
    En partant de T+ 0:00, je peux calculer T+ 0:10 et vérifier si il existe
    - si non la fonction génère T+ 0:10 et attribut la valeur stockée dans la variable.
    - si oui il liste T+ 0:10 ainsi que la valeur twa et la stock dans la variable.
    Est ce que tu as fais un truc comme ça ou je me complique grave la vie en cherchant 12h à 14h ? ...

    Je t'avouerais que je suis même plus sur de rien quand je tente de coder les choses, déjà que j'avais peu de connaissances ..., c'est frustrant ...

  • auteur

    Non, j'imaginais plutôt quelque chose comme ça :

    J'initialise une variable "var" à "T+ 0:00"
    Pour chaque élément du tableau "points" :
    ..J'initialise une variable "dernier_twa" à la valeur twa courante
    ..Tant que la valeur courante de ttw est différente de celle de "var" :
    ....J'ajoute le couple ("var", "dernier_twa") dans "myMap"
    ...."var" vaut genIterationSuivante(var)
    ..J'ajoute le couple (ttw, twa) dans "myMap"

    J'affiche "myMap"

  • GeGaX

    Ok maintenant que j'ai ton "cahier des charges", je vais tenter de mettre ça en oeuvre.
    Merci Help-Jason ( t'es bien patient ... Chapeau !)

  • GeGaX

    Bon j'y arrive pas ..., je songe même à abandonner ce calcul de twam et btwm ...

  • auteur

     var dernierTTW = "T+ 0:00"; for(var i=0; i<points.length; i++){    var dernierTWA = points[i].twa;    while(points[i].ttw != dernierTTW){       myMap.put(dernierTTW, dernierTWA);       dernierTTW = genIterationSuivante(dernierTTW);    }   myMap.put(points[i].ttw, points[i).twa); } console.log(myMap); 

  • GeGaX

    Merci Help-Jason !

    Ça parait tellement simple quand je vois ton code ... c'est loin de ce que je tentais de faire avec mes IF en pagailles ...
    Donc si je comprends bien
    J'ai besoin de cette fonction qui génère le TTW +10 min:

    function genIterationSuivante (ttw) {    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } }


    Je n'ai plus besoin de ça :
    var myMap = new Map(); for(var index=0; index<points.length; index++){     myMap.set(points[index].ttw, points[index].twa); }

    Je garde juste la déclaration de la variable
    var myMap = new Map();

    et j'ajoute
    var dernierTTW = "T+ 0:00"; for(var i = 0; i < points.length; i++){    var dernierTWA = points[i].twa;    while(points[i].ttw != dernierTTW){       myMap.set(dernierTTW, dernierTWA); // put n'est pas reconnu       dernierTTW = genIterationSuivante(dernierTTW);    }   myMap.set(points[i].ttw, points[i).twa); // idem  } console.log(myMap);

  • GeGaX

    Ce qui me donne :

    function genIterationSuivante (ttw) {     iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } } console.log(genIterationSuivante(ttw));  var myMap = new Map(); var dernierTTW = "T+ 0:00"; for (var i = 0; i < points.length; i++) {    var dernierTWA = points[i].twa;    while (points[i].ttw != dernierTTW) {       myMap.set(dernierTTW, dernierTWA);       dernierTTW = genIterationSuivante(ttw);    }   myMap.set(points[i].ttw, points[i].twa); } console.log(myMap);


    Mais et oui il y a un mais ...
    function genIterationSuivante (ttw) iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/); // ttw is not defined

    function genIterationSuivante (points.ttw) iterationActuelle = points.ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/); // Unexpected token .

    function genIterationSuivante (points[i].ttw) iterationActuelle = points[i].ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/); // Unexpected token [


    Si je fais un
    console.log(points);
    j'ai bien tout les points dans la console, si je veux sortir que les ttw, je fais un
    console.log(points.ttw); // undefined
    , c'est à tourner fou cette histoire ...

  • auteur

    A mon avis, il faut que tu apprennes les bases du Javascript. Une fonction est définie par trois éléments :
    1. le mot "function" : toujours présent, ne change pas
    2. le nom de ta fonction : défini par l'utilisateur
    3. des paramètres : défini(s) par l'utilisateur si nécessaire

    Prenons une fonction "afficher" :

     // Définition de la fonction function afficher(){    console.log("message"); } // Appel de la fonction afficher(); // Résultat : affiche "message" 


    Améliorons cette fonction "afficher" avec un paramètre :
     // Définition de la fonction function afficher(param){    console.log(param); } // Appel de la fonction afficher("un autre message"); // Résultat : affiche "un autre message" 


    Conclusion, quand tu définis une fonction, il n'y a aucun intérêt à modifier le nom des paramètres quand tu veux l'appeler ! Donc ne modifie pas le paramètre de la fonction "iterationSuivante" mais appelle là avec ton paramètre !
     function iterationSuivante(ttw){    // BLA BLA BLA } // Appel de la fonction iterationSuivante(points[i].ttw); 


    Enfin, si tu regardes le code que j'ai écrit, ça n'est qu'une amélioration du code précédent
     var myMap = new Map(); //var dernierTTW = "T+ 0:00"; for (var i = 0; i < points.length; i++) {    //var dernierTWA = points[i].twa;   // while (points[i].ttw != dernierTTW) {    //   myMap.set(dernierTTW, dernierTWA);   //    dernierTTW = genIterationSuivante(ttw);    //}   myMap.set(points[i].ttw, points[i].twa); } 


    Les commentaires correspondent aux ajouts.

  • GeGaX

    Oui je suis conscient que je n'ai pas toutes les bases ...

    Merci pour l'explication sur les fonctions, ce qui m'amène à une réflexion que je vais te détailler.

    Quand j'ai codé la fonction

    genIterationSuivante (ttw);
    , je l'ai fais sur JSBin ...
    La première chose que j'ai écris c'est :
    var ttw = "T+ 0:00";
    je l'ai pas fais sur mon fichier popup.js.

    Maintenant que cette fonction retourne le résultat attendu, il me faut la rendre 'compatible' avec le code existant.

    Si je met un
    console.log(points);
    à la fin du code existant comme sur le screen ci dessous


    j'obtiens bien le résultat voulu dans la console de Chrome


    Sans parler de la fonction
    genIterationSuivante (ttw);
    ainsi que du code concernant la Map, si je souhaite afficher dans la console tous les points ttw comment je dois faire ? ( je vais y répondre )
    J'arrive, parce que j'ai essayé plusieurs choses, à extraire un ttw précis avec ce code
    console.log(points[1].ttw); // T+ 0:10
    mais
    console.log(points.ttw); // undefined
    me retourne pas ce que je souhaite ( ça aurait été trop facile ... )
    Je commence à comprendre ( un peu ) la boucle for, du coup j'ai codé ceci:
    for (var i = 0; i < points.length; i++) { console.log(points[i].ttw); }



    et là ça me retourne ce que je souhaite


    Donc j'ai dans l'idée que le paramètre
    (ttw)
    de la fonction doit être remplacer par
    (points[i].ttw)
    mais ça sous entend que la boucle doit être déclarée

    Je suis dans le vrai ou je me craque complet encore une fois ? Parce que du coup le code de la Map va surement être modifié, nan ?

    Merci encore une fois de ta patience Help-Jason, pas facile pour moi de comprendre la logique et la méthode, c'est pas mon métier ...

  • auteur

    Encore une fois, il est hors de question de remplacer le paramètre ttw de la fonction par points[i].ttw. Tu ne touche pas à la fonction, tu ne touche qu'à son appel :

     // NE PAS TOUCHER function iterationSuivante(ttw){    // BLA BLA } // APPEL DE LA FONCTION iterationSuivante(points[i].ttw); 


    Pour compléter ta pensée, points est en fait un tableau d'objets. Pour accéder aux éléments d'un tableau, on utilise un index (points[i]) donc points.ttw n'existe pas car points est un tableau et non un objet qui contient la propriété ttw. Par contre chaque élément de points est un objet qui contient ttw d'où points[i].ttw.

    Le code de la Map (appelle-là myMap) évoluera si tu as des besoins supplémentaires. Tu éditera le code que l'on a déjà fait MAIS PAS LA FONCTION iterationSuivante. Elle fait son boulot, on touche plus !

  • GeGaX

    J'ai compris, la fonction c'est touche pas à ça ptit con ! (c'est ancré)

    Par contre je dois être abruti c'est pas possible, je suis à la lettre ce que tu me dis et nan j'ai toujours des erreurs dans la console ... :(

    Voici les sources de l'extension google chrome :
    https://expirebox.com/download/15a16f4c270e7000841fd0db5fa52873.html



    Et l'adresse où tester : http://zezo.org/happy/chart.pl

    Je sais pas où je me craque ... y'a un truc qui m'échappe ou quelque chose qui n'est pas compatible avec chrome ( ça j'y crois moyen ) ...

  • auteur

    Il me faut les erreurs de la console pour pouvoir trouver le problème

  • GeGaX

    Avec ce code en fin de fichier popup.js

    function genIterationSuivante (ttw) {    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } } //console.log(genIterationSuivante (points[i].ttw));  var myMap = new Map(); var dernierTTW = "T+ 0:00"; for (var i = 0; i < points.length; i++) {     var dernierTWA = points[i].twa;     while (points[i].ttw != dernierTTW) {         myMap.set(dernierTTW, dernierTWA);         dernierTTW = genIterationSuivante(dernierTTW);     }   myMap.set(points[i].ttw, points[i].twa); } console.log(myMap);


    Ne m'ouvre même pas de popup ( du coup je peux pas l'inspecter )

    celui ci :
    function genIterationSuivante (ttw) {    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } } console.log(genIterationSuivante (points[i].ttw));  var myMap = new Map(); var dernierTTW = "T+ 0:00"; for (var i = 0; i < points.length; i++) {     var dernierTWA = points[i].twa;     while (points[i].ttw != dernierTTW) {         myMap.set(dernierTTW, dernierTWA);         dernierTTW = genIterationSuivante(dernierTTW);     }   myMap.set(points[i].ttw, points[i].twa); } //console.log(myMap);


    me génére ça:

  • GeGaX

    et celui ci

    function genIterationSuivante (ttw) {    iterationActuelle = ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);    iterationSuivante = parseFloat(iterationActuelle[2]) + 10;    if ((parseFloat(iterationActuelle[2]) + 10) < 59) {       return "T+" + iterationActuelle[1] + ":" + (parseFloat(iterationActuelle[2]) + 10);    } else {       return "T+" + (parseFloat(iterationActuelle[1]) + 1) + ":" + ("0" +(parseFloat(iterationActuelle[2]) + 10) % 60);    } }  var myMap = new Map(); var dernierTTW = "T+ 0:00"; for (var i = 0; i < points.length; i++) {     var dernierTWA = points[i].twa;     while (points[i].ttw != dernierTTW) {         myMap.set(dernierTTW, dernierTWA);         dernierTTW = genIterationSuivante(dernierTTW);     }   myMap.set(points[i].ttw, points[i].twa); } //console.log(myMap); console.log(genIterationSuivante (points[i].ttw));


    Idem celui la ne m'ouvre pas de popup donc je ne peux l'inspecter également ...

  • GeGaX

    Tu peux télécharger les sources, tu as tout les fichiers il y a peut être une subtilité sur un des autres fichier, je ne sais pas ...

  • auteur

    Pour le deuxième c'est normal parce que la variable "i" n'est pas définie là où tu l'appelle pour le console.log. Le premier est juste, je ne comprend pas pourquoi ça marche pas. Essaye de changer le

    displayTable(false)
    en
    displayTable(true)

  • auteur

    Ok je test ça ce soir en rentrant du taf et te tiens au jus

  • GeGaX

    En modifiant le

    displayTable(false)
    en
    displayTable(true)
    c'est exactement pareil, la popup ne s'ouvre pas

  • GeGaX

    D'après ce que je crois comprendre,

    displayTable
    concerne l'affichage Date, Time et TimeZone locale

  • GeGaX

    Après toute la soirée de recherches diverses et de nombreux tests / modifications j'arrive à obtenir une map ( pas celle que j'espérais mais au moins j'ai quelque chose qui s'affiche ... et pas d'erreur dans la console )

    var myMap = new Map(); var ttwLast = "T+ 0:00";  for (var i = 0; i < points.length; i++) {     function genIteNext (ttwCurr) {         var ttwCurr = points[i].ttw.match(/.*?([0-9]{1,3}):([0-9]{2})/);         var ttwNext = [];         if ((parseFloat(ttwCurr[2]) + 10) < 60) {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]))).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);         } else {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]) + 1)).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);         }         return ttwNext; }     var twaLast = points[i].twa;     if (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast)     } else {         myMap.set(points[i].ttw, points[i].twa);     } } console.log(myMap);





    Reste à comprendre les erreurs d'incrémentation et les corriger mais c'est déjà un bon début ...

    Plusieurs choses ont été modifiées :
    - La fonction, j'ai remarque un espace entre "T+" et les heures de 0 à 9 et je l'ai mise dans la boucle For
    - C'est en remplaçant la boucle While par un If ... Else que j'ai réussi à obtenir la map ( qui est fausse j'en conviens ).

  • auteur

    Et ce code :

     var myMap = new Map(); var ttwLast = "T+ 0:00";  function genIteNext (ttwCurr) {         var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);         var ttwNext = [];         if ((parseFloat(ttwCurr[2]) + 10) < 60) {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]))).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);         } else {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]) + 1)).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);         }         return ttwNext; }  for (var i = 0; i < points.length; i++) {         var twaLast = points[i].twa;     if (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast);     } else {         myMap.set(points[i].ttw, points[i].twa);     } } console.log(myMap); 


    Si c'est OK, tester celui-ci :
     var myMap = new Map(); var ttwLast = "T+ 0:00";  function genIteNext (ttwCurr) {         var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);         var ttwNext = [];         if ((parseFloat(ttwCurr[2]) + 10) < 60) {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]))).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);         } else {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]) + 1)).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);         }         return ttwNext; }  for (var i = 0; i < points.length; i++) {         var twaLast = points[i].twa;     while(points[i].ttw !== ttwLast){         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast);     }     myMap.set(points[i].ttw, points[i].twa); } console.log(myMap); 

  • GeGaX

    Pour la première version du code ( sans while ), ça "fonctionne"




    L'incrémentation de "T+ XX:XX" fonctionne en revanche les valeurs twa associées c'est pas bon ça craque des la seconde ligne, et l'incrémentation s'arrête à T+14:20 ( 87 combo de valeurs dans la map)

    Pour la seconde version du code ( avec while ), ça fonctionne pas du tout, la popup s'ouvre pas.

  • GeGaX

    il manquerait pas un

    i++;
    dans la boucle while ?

  • auteur

    Ah ! J'ai trouvé ! C'est pas possible, quelle cruche ! Le second cas ça fait boucle infinie, pour ça tu n'a pas de popup. J'ai trouvé pourquoi ça fait boucle infinie. Test ça :

     var myMap = new Map(); var ttwLast = "T+ 0:00";  function genIteNext (ttwCurr) {         var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);         var ttwNext = [];         if ((parseFloat(ttwCurr[2]) + 10) < 60) {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]))).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);         } else {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]) + 1)).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);         }         return ttwNext; }  for (var i = 0; i < points.length; i++) {         var twaLast = points[i].twa;     while(points[i].ttw !== ttwLast){         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast);     }     // Il manquait juste la ligne suivante !     ttwLast = points[i].ttw;     myMap.set(points[i].ttw, points[i].twa); } console.log(myMap); 

  • GeGaX

    J'ai toujours pas de popup :/
    par contre si j'ajoute

    i++;
    j'obtiens la popup mais j'ai une erreur dans la console

  • auteur

    A la place de

    i++
    , ajoute
    console.log(i + " " + points[i].ttw + " " + ttwLast);
    et vérifie la console.

    A noter, que cette procédure est appelée : débug. Utilise des console.log pour vérifier les différentes étapes de ton programme

  • GeGaX

    Ok j'test ça ce soir après le taf et te tiens au jus.

  • GeGaX

    J'ai testé et ça fonctionne pas, la popup ne s'ouvre pas donc je ne peux pas la débugger :/

  • auteur

    J'ai installé l'extension mais je ne trouve pas les sources (popup.js et popup.html). C'est où ?

  • GeGaX

    tu as installé la version officielle ? (v2.9.1)
    Si oui dans cette version la checkbox Local Time n'est pas implémentée ... je peux te fournir les sources de la v3 ( local time implémentée )

  • auteur

    Je cherche juste comment éditer les sources de popup pour les tester

  • GeGaX

    https://expirebox.com/download/50773c59bca323dd8c751c3a6f7f0f4a.html

    Ce sont les sources v3

  • auteur

    OK j'ai trouvé. Ta fonction genIteNext ne fonctionne pas pour ttw = T+99:50 (ça renvoie T+0:00). J'ai trouvé ce bug avec ce petit bout de code :

     ttwLast = "T+ 0:00"; for(var i=0; i<4000; i++){    console.log(ttwLast);    ttwLast = genIteNext(ttwLast); } 


    Corrige ta fonction et utilise ce code :
     var myMap = new Map(); var ttwLast = "T+ 0:00";  function genIteNext (ttwCurr) {         var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);         var ttwNext = [];         if ((parseFloat(ttwCurr[2]) + 10) < 60) {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]))).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);         } else {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]) + 1)).slice(-2) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);         }         return ttwNext; }  for (var i = 0; i < points.length; i++) {         var twaLast = points[i].twa;     // GESTION BOUCLE INFINIE 	var infiniteLoop = 0;     while(points[i].ttw !== ttwLast){ 		infiniteLoop++;         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast); 		if(infiniteLoop > 1700){ 			console.error("INFINITE LOOP : "); 			console.log(i+ " " + points[i].ttw + " " + ttwLast); 			break; 		}     }     // Il manquait juste la ligne suivante !     ttwLast = points[i].ttw;     myMap.set(points[i].ttw, points[i].twa); } console.log(myMap); 

  • GeGaX

    Ok je corrige la fonction et test ton code puis te dis, merci Help-Jason

  • GeGaX

    J'obtiens bien la popup, ça c'est cool ;)

    Tu peux m'expliquer à quoi correspond

    infiniteLoop > 1700
    stp ? je comprends pas la valeur 1700, à quoi correspond-elle ?

    Autre chose, je viens de m'apercevoir que les valeurs twa sont décalées d'une ligne dans la map
    T+ 0:00 obtient la valeur twa de T+ 0:10

  • auteur

    Chaque fois que le programme rentre dans la boucle while cela veut dire que l'itération courante de points n'est pas l'itération directement après celle d'avant (itération manquante). Donc la boucle while va compléter la map myMap avec des valeurs intermédiaires jusqu'à atteindre cette valeur courant du tableau points.

    En particulier, chaque fois que la boucle while est parcourue, il y a 0:10 d'écart. Donc 1700 * 0:10 = 283:00 environ. Je suppose donc s'il y a un espace de plus de 283:00 entre deux itérations, il y a boucle infinie.

  • GeGaX

    Ok merci pour l'explication, l'écart maximum qu'il peut exister entre 2 itérations listés est de 6h soit 36 itérations de 10 min donc on pourrait baisser la valeur 1700 , nan ?

    Concernant le "décalage" des valeurs twa, j'ai lu, relu et rerelu le code je capte pas pourquoi il est présent ... j'ai testé sur une autre course et idem, la valeur twa de T+ 0:00 correspond à la valeur twa de T+ 0:10

    Pour la fonction, j'ai corrigé le

    slice(-2)
    par
    slice(-3)
    ce qui donne
    function genIteNext (ttwCurr) {         var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);         var ttwNext = [];         if ((parseFloat(ttwCurr[2]) + 10) < 60) {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]))).slice(-3) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);         } else {             ttwNext = "T+" + (" " + (parseFloat(ttwCurr[1]) + 1)).slice(-3) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);         }         return ttwNext; }

  • GeGaX

    J'ai encore une "mer*e" avec la fonction il faut donc que je corrige a nouveau
    J'ai détecté ça avec un

    console.log()
    très pratique ce petit truc

  • GeGaX

    var myMap = new Map(); var ttwLast = "T+ 0:00";  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwNext = [];     if ((parseFloat(ttwCurr[2]) + 10) < 60) {         ttwNext = "T+" + space (parseFloat(ttwCurr[1])) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);     } else {         ttwNext = "T+" + space (parseFloat(ttwCurr[1]) + 1) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     var twaLast = points[i].twa;     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast);     }     ttwLast = points[i].ttw;     myMap.set(points[i].ttw, points[i].twa); } console.log(myMap);


    Plus besoin de
    infiniteLoop
    mais j'ai toujours un décalage dans l'attribution des valeurs ...



    Je devrais avoir 80° jusque T+ 3:00 et à T+ 3:10 => 71°

    J'vais devenir chèvre avec ce truc ...

  • auteur

    ça fera l'affaire :

     var myMap = new Map(); var ttwLast = "T+ 0:00"; var twaLast = null;  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwNext = [];     if ((parseFloat(ttwCurr[2]) + 10) < 60) {         ttwNext = "T+" + space (parseFloat(ttwCurr[1])) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);     } else {         ttwNext = "T+" + space (parseFloat(ttwCurr[1]) + 1) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast);     }  twaLast = points[i].twa;     ttwLast = points[i].ttw;     myMap.set(points[i].ttw, points[i].twa); } console.log(myMap); 


    C'est bien que ça te rende chèvre, tu vas devenir meilleur dans ce domaine.

    Cependant, ça devrait avoir un mauvais comportement si les valeurs ne commencent pas à T+ 0:00

  • GeGaX

    YES ! Purée t'imagines même pas comme je suis content de voir cette map au complet sans bug et autres dans la console ...

    Dernière étape, tu me lâches pas ? On va jusqu'au bout de ce fichu calcul ?

    Il me faut "nourrir" la fonction pour le calcul trigo de TWAm ( Angle de Vent Vrai moyen ), la fonction je l'ai déjà et elle fait son travail à merveille ( quand je lui rendre les paramètres à la mano )

    La voici :

    var twaList = [];  function twamCalc() {     const     twaData = twaList;     Math.radians = function (degrees) {         return degrees * Math.PI / 180.0;     },     Math.degrees = function (radians) {         return radians * 180.0 / Math.PI;     };       let     arX = [],     arY = [],     somX = 0.0,     somY = 0.0,     moyX = 0.0,     moyY = 0.0,     twam = 0.0;          for (const [i, angle] of twaData.entries()) {         arX[i] = Math.cos(Math.radians(angle));         arY[i] = Math.sin(Math.radians(angle));     }       for (const value of arX) { 	   somX += value;     }     moyX = somX / arX.length;       for (const value of arY) { 	   somY += value;     }     moyY = somY / arY.length;       twam = Math.round((Math.degrees(Math.atan2(moyY, moyX)) * 10)) / 10;       return twam; }


    Cette fonction est exécutée pour chaque ligne, en fonction de T+xx:xx, il me faut attribuer les valeurs twa de la map.

    Je veux bien cogiter le truc si tu me donnes un 'cahier des charges' pour réaliser ça.
    Ou si tu vois une autre manière d'aborder ça j'veux bien le savoir.

    Merci encore Help-Jason, de ta patience et de ta pédagogie ( si t'es pas prof tu devrais y songer ;) )

  • GeGaX

    Je reviens sur un point que j'avais pas vu lors de ta réponse, il n'y aura pas de mauvais comportement T+ 0:00 est toujours présent dans le tableau généré par l'extension ;)

  • GeGaX

    Ce genre de chose pourrait correspondre ?

    http://jsbin.com/rucede/1/edit?js%2Cconsole=

  • GeGaX

    J'ai avancé mais pas sur la façon d'attribuer les valeurs pour la fonction de calcul ... je cherchais une façon d'avoir 2 valeurs pour la même clé une valeur twa et une autre btw dans la map.

    Ça donne :

    var myMap = new Map(); var ttwLast = "T+ 0:00"; var twaLast = null; var btwLast = null;  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwNext = [];     if ((parseFloat(ttwCurr[2]) + 10) < 60) {         ttwNext = "T+" + space (parseFloat(ttwCurr[1])) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10)).slice(-2);     } else {         ttwNext = "T+" + space (parseFloat(ttwCurr[1]) + 1) + ":" + ("0" + (parseFloat(ttwCurr[2]) + 10) % 60).slice(-2);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, {twaVal : twaLast, btwVal : btwLast} );         ttwLast = genIteNext(ttwLast);     }     ttwLast = points[i].ttw;     twaLast = points[i].twa;     btwLast = points[i].btw;     myMap.set(points[i].ttw, {twaVal : points[i].twa, btwVal : points[i].btw} ); } console.log(myMap);


    Et me retourne :



    Il me reste donc l'étape d'attribution des valeurs

  • auteur

    C'est quoi cette étape d'attribution des valeurs ?

  • GeGaX

    Si je prends le fonctionnement actuel de l'extension, à chaque ligne (sauf pour T+ 0:00) il y a un calcul de moyenne ( non trigonométrique et du coup faux )
    ça ressemble à ça :



    Ceux qui veux dire :
    Je suis à T+ 0:00 et je veux aller à T+12:00, en suivant les instructions listés, colonne TWA, j'ai 3 changements obligatoire, a T+ 0:00 je dois être à -65° (65° bâbord donc couleur rouge) puis à T+ 3:00 je dois être à -55° ( même explication qu'au dessus ) ensuite à T+ 6:00 je dois encore changé pour être à -70°

    Avec la colonne TWAm, je lisse ces instructions, ce qui se traduit par:
    Je suis à T+ 0:00 et je souhaite aller à T+12:00, donc je dois être à -65° et j'attends 12h
    Si je souhaite aller à T+ 6:00, je dois être à -60°.
    Tu me suis ?

    Maintenant que j'ai une map 100% fonctionnelle (grâce à toi) il va falloir que je calcul ces valeurs moyennes pour chaque ligne.
    la fonction de calcul je l'ai et comme dis plus haut dans un post elle fonctionne à merveille si je lui rentre les twa obtenus dans la Map à la main
    Cette fonction la voici ( je la remet )
    var twaList = [];  function twamCalc() {     const     twaData = twaList;     Math.radians = function (degrees) {         return degrees * Math.PI / 180.0;     },     Math.degrees = function (radians) {         return radians * 180.0 / Math.PI;     };       let     arX = [],     arY = [],     somX = 0.0,     somY = 0.0,     moyX = 0.0,     moyY = 0.0,     twam = 0.0;          for (const [i, angle] of twaData.entries()) {         arX[i] = Math.cos(Math.radians(angle));         arY[i] = Math.sin(Math.radians(angle));     }       for (const value of arX) { 	   somX += value;     }     moyX = somX / arX.length;       for (const value of arY) { 	   somY += value;     }     moyY = somY / arY.length;       twam = Math.round((Math.degrees(Math.atan2(moyY, moyX)) * 10)) / 10;       return twam; }


    var twaList
    doit contenir les valeurs twa de la map
    si je prends l'exemple de la ligne T+ 6:00, twaList doit comprendre toutes les valeurs twa de T+ 0:00 jusque T+ 5:50
    Tu me suis toujours ?

  • auteur

    OK donc on va créer une fonction qui va prendre en entrée :
    1. La Map myMap que l'on a généré
    2. Un ttw > T+ 0:00
    En sortie, cette fonction renvoie un tableau de twa (twaList) qui correspond à tous les ttw inférieur strict au ttw en entrée.

    Commence à réfléchir comment encore mieux découper ce "cahier des charges" en code fonctionnel.

  • GeGaX

    c'est ce que j'avais en tête, une fonction
    J'm'y colle ce soir ;)

  • GeGaX

    Salut Help-Jason ;)
    Bon j'ai lâché le truc 4 jours (petite vacances avec madame), j'ai remis le nez dedans hier soir et je suis complètement paumé ... :/

    Il me faut définir le 'cahier des charges' précisément sinon j'm'en sortirais pas
    Je reviens ici quand ça sera fait j'm'y colle de suite

  • GeGaX

    Je suis pas sur de la nécessité d'une fonction ( j'aimerais que tu m'expliques la méthode que tu as en tête stp)

    Après avoir retourné le problème dans tous les sens, je partirais sur une boucle qui va passer sur toutes les valeurs twa de la map en comparant les clés ttw

    Si je déclare un tableau vide

    var twaList = [];
    la boucle peut le remplir à chaque itération
    - La 1ère valeur détermine le signe de la 'suite' de valeurs, tant que les valeurs sont du même signe que la 1ère valeur et que le ttw de la ligne -10 min n'est pas atteint on ajoute les twa
    Dès que ttw ligne est strictement égal a ttw ligne -10min dans la boucle, elle s'arrête et le calcul à lieu
    La boucle redémarre et ainsi de suite

    - Lorsque le signe twa change (de + à - ou l'inverse) le tableau se vide et la boucle recommence avec ce nouveau signe

    Avec cette façon de faire twam de T+ 0:00 sera en erreur ( undefined je pense ) puisque T+ 0:00 - 10min ça sera pas possible donc on affiche " - ".

    Penses tu que ça soit la bonne méthode ?
    Est ce que c'est réalisable ?

  • auteur

    C'est quoi la 1ère valeur dont tu parles ? C'est quoi cette histoire de signe ? Pourquoi ne pas faire une fonction quand c'est possible ?

  • GeGaX

    J'vais te faire un exemple concret ça sera plus parlant
    Je suis pas contre une fonction si c'est la méthode adéquate on fera une fonction ;)
    Tu m'as demandé de mieux définir le cahier des charges, c'est ce que j'ai tenté de faire avec ma tête de serin ...

  • GeGaX

    Je pars du principe que cette map (myMap) est le résultat du travail fait précédemment.
    Cette map exprime toutes les contraintes.


    Quand les instructions sont négatives, c'est que le vent vient de la gauche (Bâbord) et quand elles sont positives, il vient de la droite (Tribord)
    TWAm se limite au bord (Bâbord ou Tribord) pour calculer un TWAm moyen

    Dans l'exemple ci dessus, on voit que la valeur TWA de T+ 0:00 est négative.
    La valeur TWAm de T+ 0:00 n'existe pas puisque la valeur TWAm générée par la fonction twamCalc prends en compte la valeur T+ 0:00 - 10 min et cette valeur n'est ni listée, ni générée donc on affiche " - "

    La prochaine instruction listée est T+ 0:20, j'ai donc une itération manquante (T+ 0:10), pas de problème elle se trouve dans myMap donc les valeurs TWA dont j'ai besoin pour calculer TWAm sont les valeurs de T+ 0:00 et T+ 0:10 soit :
    var twaList = [-50, -50];
    ce qui me donne -50 pour la ligne T+ 0:20.

    Je continue, la prochaine ligne listée est T+ 0:50, donc même chose qu'au dessus, j'ai 2 itérations manquantes mais dispo dans la map donc je dois prendre les valeurs twa de T+ 0:40 à T+ 0:00 soit :
    var twaList = [-50, -50, -35, -35, -35];
    ce qui me donne -41 pour la ligne T+ 0:50.

    Je continue, la prochaine ligne listée est T+ 1:00
    Mais le vent vient de la droite j'ai donc changé de bord (tribord).
    Je vide twaList et prends la valeur TWA de T+0:50 qui est 25 soit
    var twaList = [25];
    ce qui me donne 25 ...

    La prochaine ligne listée est T+ 1:30, je dois donc prendre les valeur TWA de T+ 1:20 à T+ 0:50 soit
    var twaList = [25, 40, 40, 40];
    soit 36,3 pour la ligne T+ 1:30


    Et ainsi de suite jusqu'à la fin du tableau

    Tu remarqueras que j'ai mis également les valeurs BTWm, le fonctionnement est identique à TWAm avec la particularité que quand on vide le tableau twaList il faut également vider celui de btwList ce qui me permet de gérer le cap fixe moyen (BTWm) que sur un bord également

    Voila j'espère qu'avec ces explications détaillées au max ça sera plus clair ...

  • auteur

    Effectivement, pas besoin d'une fonction.

    Voici le code actuellement :

     for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         // La ligne est générée         myMap.set (ttwLast, twaLast);         ttwLast = genIteNext(ttwLast);     }     twaLast = points[i].twa;     ttwLast = points[i].ttw;     // La ligne est listée     myMap.set(points[i].ttw, points[i].twa); } 


    Dans un premier temps, nous allons générer une liste twaList qui se remplit et se vide selon le comportement que tu as énoncé.

    Pour chaque valeur de points :
    Si la taille de twaList est différente de 0 :
    Vérifier si le premier élément multiplié par le twa courant est positif (cf. note) :
    Si oui alors vider liste twaList
    Si non alors ajoute le twa dans twaList
    Si la taille de twaList est égale à 0 :
    Ajoute le twa dans twaList

    Note : deux nombres multipliés entre eux positifs indique que les deux nombres sont de même signe. En effet, deux positifs multipliés donnent un positif et deux négatifs multipliés donnent un positif.

    Tu peux afficher la liste twaList à chaque itération pour vérifier son contenu

  • GeGaX

    - On garde la map ou pas du tout ?

    - On créer pas de nouvelle boucle on modifie l'existante ?

    - D'après ce que je comprends, plutôt que de tester si la valeur est > ou < à 0 qui te retournerait un true ou false, tu préfères les multiplier. Pourquoi préférer cette méthode ?

    -

    var twaList = 0;
    si je comprends bien ( plutôt que
    var twaList = [];
    ) ?

    Je t'avouerais que je suis un peu perdu là, j'vois pas trop comment attaquer le truc

  • auteur

    Oui, on garde la map. Il faut créer un nouveau tableau twaList.

    Modifier la boucle existante.

    Il faudrait tester le signe d'un élément du tableau ET le signe de la valeur courante. En terme de syntaxe, c'est assez lourd. Je trouve plus clair de mettre une multiplication des deux et un commentaire pour indiquer que c'est une manière de trouver un changement de signe.

    var twaList = [];

  • GeGaX

    Ok, maintenant que j'ai ces infos je vais cogiter à comment mettre tout ça en place
    Merci Help-Jason ;)

  • GeGaX

    - Créer le tableau ça c'est facile, il suffit de déclarer

    var twaList = [];
    en dessous de
    var myMap = new Map(); var ttwLast = "T+ 0:00"; var twaLast = null; var btwLast = null;


    Pour vider un tableau, il suffit de le redéclarer ( vu sur le net, y'a pas tout dans mon bouquin "le JS pour les nuls" ...) soit
    twaList = [];
    .

    Dans l'esprit c'est quelque chose qui ressemble à ça ?
    "?" est le twa que j'ai du mal à déterminer entre
    twaLast
    et
    points[i].twa
    là je m'y perd ...
    if (twaList === 0){   twaList.push("?"); } else if (twaList !== 0) {     if ("?" * "?" < 0) {       twaList = [];     } else {       twaList.push("?");   } }

  • auteur

    C'est vraiment pas mal ! Juste pour chipoter, pourquoi tu initialises twaList à null et pas à une liste vide ?

    Globalement, utilise tout le temps twaLast. ça représente la dernière valeur twa existantes dans le tableau points (les autres étant générées et égales à twaLast).

  • auteur

    Cool je m'améliore ;)
    Nan relis, je déclare bien un tableau vide

    var twaList = [];
    pas
    var twaList = null;
    .

    Ok pour twaLast en remplacement de
    ´´?´´
    mais pour la multiplication ça va pas le faire :/

    et je le place où ce code dans la boucle ?

  • auteur

    Pardon, j'ai confondu twaLast et twaList (à modifier sans doute)

    Pour la multiplication, il faut prendre twaLast et n'importe quel élément du tableau twaList (qui sont de même signe normalement).

    Ensuite, pour le placement, je dirais à la fin de la boucle while pour que chaque itération créée soit ajoutée dans twaList.

  • GeGaX

    Je reviens sur un truc qui m'échappe :
    Y'a t'il une notion de 0 si

    twaList = [];
    ? Si oui, je comprends le cheminement.

    if (twaList === 0){   twaList.push(twaLast); } else if (twaList !== 0) {     if (twaLast * "dernier élement du tableau" < 0) {       twaList = [];       twalist.push("?"); // ici il me faut remplir avec le nouveau twa de signe opposé     } else {       twaList.push(twaLast);   } }


    ce fonctionnement me parait logique ... t'en penses quoi ?

  • auteur

    Si

    twaList = []
    alors
    twaList.length == 0
    vaut VRAI.

    Ce fonctionnement est logique mais optimisable. En effet,

     if (twaLast * "dernier élement du tableau" < 0) {       twaList = [];       twalist.push("?"); // ici il me faut remplir avec le nouveau twa de signe opposé } else {       twaList.push(twaLast); } 


    devient

     if (twaLast * "dernier élement du tableau" < 0) {       twaList = []; } twaList.push(twaLast); 


    car dans les deux conditions, on ajoute twaLast dans twaList (le nouveau twa de signe opposé est twaLast)

    Le code devient :

     if (twaList === 0){   twaList.push(twaLast); } else if (twaList !== 0) {    if (twaLast * "dernier élement du tableau" < 0) {       twaList = [];    }    twaList.push(twaLast); } 


    Il peut devenir à son tour :

     // twaList est tout le temps différent de 0 car c'est un tableau // Cependant, twaList.length peut valoir 0 (longueur nulle) if (twaList.length !== 0) {    if (twaLast * "dernier élement du tableau" < 0) {       twaList = [];    } } twaList.push(twaLast); 


    car, de même, dans les deux conditions, on ajoute twaLast dans twaList.

    Le dernier élément du tableau peut être trouvé de cette manière :
    twaList[twaList.length - 1]


    Cependant, tu peux faire le test avec le premier élément du tableau aussi (de même signe normalement)
    twaList[0]

  • GeGaX

    Merci pour toutes ces infos ;)
    donc si je résume, le code initial (complet et correctement nommé)

    if (twaList === 0){   twaList.push(twaLast); } else if (twaList !== 0) {     if (twaLast * twaList[twaList.length - 1] < 0) { // ou twaList[0]       twaList = [];       twalist.push(twaLast);     } else {       twaList.push(twaLast);   } }


    peut être remplacer par
    if (twaList.length !== 0) {    if (twaLast * twaList[twaList.length - 1] < 0) {       twaList = [];    } } twaList.push(twaLast);

    OU

    if (twaList.length !== 0) {    if (twaLast * twaList[0] < 0) {       twaList = [];    } } twaList.push(twaLast);


    Si oui, j'ai une question ... Que se passe t'il lorsque
    twaList.length === 0; // twaList = []
    ce qui est le cas pour le démarrage à T+ 0:00 ...
    Le comportement est qu'il ne trouve pas ses petits dans les 2 if donc il ajoute simplement twaLast à twaList ?

    PS: c'est épatant de résumer le code initial par 6 lignes ... ;)

  • GeGaX

    J'viens de tester ce code et ça me donne ceci :


    j'ai l'impression d'avoir qu'une seule valeur dans le tableau à chaque fois pas une série de valeur doit il y a voir un truc qui cloche

    popup.js ressemble à ça:
    var myMap = new Map(); var ttwLast = "T+ 0:00"; var twaLast = null; var btwLast = null; var twaList = []; //var btwList = [];  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function zero(val) {     if (val < 10) {         val = "0" + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwHours = parseInt(ttwCurr[1]);     var ttwMinutes = parseInt(ttwCurr[2]);     var ttwNext = [];     if (ttwMinutes + 10 < 60) {         ttwNext = "T+" + space (ttwHours) + ":" + zero (ttwMinutes + 10);     } else {         ttwNext = "T+" + space (ttwHours + 1) + ":" + zero (ttwMinutes - 50);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, {twaVal : twaLast, btwVal : btwLast} );         ttwLast = genIteNext(ttwLast);         if (twaList.length !== 0) {         if (twaLast * twaList[0] < 0) {             twaList = [];         }     }     twaList.push(twaLast);     }     ttwLast = points[i].ttw;     twaLast = points[i].twa;     btwLast = points[i].btw;     myMap.set(points[i].ttw, {twaVal : points[i].twa, btwVal : points[i].btw} ); } console.log(twaList);

  • GeGaX

    Je crois que j'ai compris ... les valeurs twa ne sont pas "brutes", il y a le degrés ( ° ) ce qui empêche la multiplication du coup c'est toujours faux et je n'ai qu'une valeur dans twaList ...
    faut que je vire le degrés ( ° )

  • GeGaX

    .replace("\u00B0", "");
    faut que je place ce code quelque part pour supprimer le " ° ", tu confirmes ?

  • auteur

    Oui, tu auras surement besoin de convertir le résultat en entier aussi pour être sûr de ne pas manipuler des chaines de caractères

  • GeGaX

    Salut Help-Jason ;)
    J'ai réussi à virer le " ° " et fait la conversion avec

    parseInt
    le code donne
    for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, {twaVal : twaLast, btwVal : btwLast} );         ttwLast = genIteNext(ttwLast);         if (twaList.length !== 0) {             if (parseInt(twaLast.replace("\u00B0", "")) * parseInt(twaList[0]) < 0) {                 twaList = [];             }         }         twaList.push(twaLast.replace("\u00B0", ""));     }     ttwLast = points[i].ttw;     twaLast = points[i].twa.replace("\u00B0", "");     btwLast = points[i].btw;     myMap.set(points[i].ttw, {twaVal : points[i].twa, btwVal : points[i].btw} ); }


    En revanche, si je n'ai plus le " ° ", les tableaux ne fonctionne toujours pas j'ai qu'une valeur à chaque fois ... comme le screen du 21/03 ci dessus
    J'vais tourner fou je pense ...

    Au passage, si tu as une meilleure méthode pour virer le degré fais le moi savoir stp

  • GeGaX

    J'ai corrigé à nouveau,

    parseInt
    suffit pour virer " ° " et convertir la chaine.
    var myMap = new Map(); var ttwLast = "T+ 0:00"; var twaLast = null; var btwLast = null; var twaList = []; var btwList = [];  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function zero(val) {     if (val < 10) {         val = "0" + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwHours = parseInt(ttwCurr[1], 10);     var ttwMinutes = parseInt(ttwCurr[2], 10);     var ttwNext = [];     if (ttwMinutes + 10 < 60) {         ttwNext = "T+" + space (ttwHours) + ":" + zero (ttwMinutes + 10);     } else {         ttwNext = "T+" + space (ttwHours + 1) + ":" + zero (ttwMinutes - 50);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, {twa : twaLast, btw : btwLast} );         ttwLast = genIteNext(ttwLast);         if (twaList.length !== 0) {             if (parseInt(twaLast, 10) * parseInt(twaList[0], 10) < 0) {                 twaList = [];             }         }         twaList.push(twaLast);     }     ttwLast = points[i].ttw;     twaLast = parseInt(points[i].twa, 10);     btwLast = parseInt(points[i].btw, 10);     myMap.set(points[i].ttw, {twa : points[i].twa, btw : points[i].btw} ); } console.log(twaList); console.log(myMap);

  • auteur

     /**   * function average(arrayValue) :   * @param arrayValue :   * Tableau de valeur de même signe.   * @return    * Moyenne de ce tableau   * Rappel :    * moyenne = somme des valeurs / nombre de valeurs   */ function average(arrayValue){  // RENVOIE LE DERNIER ELEMENT DE arrayValue  // A MODIFIER !  return arrayValue[arrayValue.length - 1]; }  for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {       /*        * Génère les itérations manquantes.        * En particulier, les itérations manquantes        * valent la même chose que twaLast.        * Donc elles sont de même signe que twaLast.        * Il suffit de les ajouter dans twaList sans filtre.        */         twaList.push(twaLast);         myMap.set (ttwLast, {twa : twaLast, btw : btwLast, twam: average(twaList)} );         ttwLast = genIteNext(ttwLast);       }     ttwLast = points[i].ttw;     twaLast = parseInt(points[i].twa, 10);     btwLast = parseInt(points[i].btw, 10);     /*      * La valeur de twaLast change ici.      * En particulier, le signe aussi.      * Le filtre doit être appliqué à ce niveau-là.      * Note : twaLast est déjà converti en entier      * et les éléments de twaList sont donc des entiers.      */      if (twaList.length !== 0) {         if (twaLast * twaList[0] < 0) {             twaList = [];         }       }       twaList.push(twaLast);       myMap.set(points[i].ttw, {twa : points[i].twa, btw : points[i].btw, twam: average(twaList)} ); } console.log(twaList); console.log(myMap); 


    Je te laisse analyser mes modifications.

  • GeGaX

    Salut Help-Jason,
    Bon là j'ai le cerveau en ébullition ...

    1- Je capte pas pourquoi tu mets dans le tableau de myMap une entrée twam, qui est systématiquement la même valeur que twa...

    2- la fonction average(arrayValue) je capte pas non plus je dois être complètement idiot c'est pas possible... je dois remplir quelque chose ou la laisser telle qu'elle ?

    3- Je mélange tout et j'ai du mal à définir ( avec des mots ) ce que je souhaite obtenir ... concrétement ça donne ceci
    En partant de cette map:



    Je cherche à obtenir au final (avec console.log) ça :
    0: undefined ou NaN // je sais pas trop ça correspond à twaList - 10 min sur la ligne T+ 0:00 1: [-120°] 2: [-120°, -125°] 3: [-120°, -125°, -128°] 4: [-120°, -125°, -128°, -128°] 5: [-120°, -125°, -128°, -128°, -128°] 6: [-120°, -125°, -128°, -128°, -128°, -132°] 7: [-120°, -125°, -128°, -128°, -128°, -132°, -135°] 8: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°] 9: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°] 10: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°] 11: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141] 12: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141, -140°] 13: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141, -140°, -143°]


    Je suis incapable de générer à chaque itération le tableau twaList adéquate... j'vais devenir fou avec ce #@!/& de calcul ...

  • GeGaX

    Je reviens sur le résultat de console.log ci dessus.
    C'est pour obtenir la " base ", bien entendu après j'implémenterais le

    parseInt()
    et ensuite les
    if
    .
    J'essaye de découper pour y arriver ...

    Je comprends pas pourquoi ce code ne me met pas la valeur
    twa
    dans
    twaList
    ?!
    for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         myMap.set (ttwLast, {twa : twaLast, btw : btwLast} );         ttwLast = genIteNext(ttwLast);         twaList.push(parseInt(twaLast, 10)); // mettre la valeur twa dans twaList a chaque tour de la boucle              }     ttwLast = points[i].ttw;     twaLast = points[i].twa;     btwLast = points[i].btw;     myMap.set(points[i].ttw, {twa : points[i].twa, btw : points[i].btw} ); }

  • GeGaX

    Je me suis mal exprimé ...
    Il me met bien la valeur dans twaList mais une valeur à chaque fois il incrémente pas le tableau.
    je me retrouve avec, en terme de valeurs, map -1 ... si la map à 800 entrées Array équivaut à 799 (déjà je pige pas pourquoi il y a une valeur en moins) au lieu de Array à 1 (ce que je souhaite obtenir pour " démarrer " le code de base concernant twaList)

  • auteur

    twam est la valeur moyenne de twaList. c'est bien ce que tu voulais ?
    average signifie moyenne en anglais. la fonction est à compléter, comme indiqué dans les commentaires. pour l'instant elle renvoie le dernier élément de twaList passé en paramètre.
    si tu veux le console.log dont tu peux me parle, il suffit d'ajouter un console.log de twaList à chaque fois que l'on ajoute un élément (il y a deux console.log à ajouter : un dans while et à la fin du for)

  • GeGaX

    Salut Help-Jason
    Oui twam est bien la valeur moyenne des twa du tableau twaList.
    C'est l'histoire d'ajout des valeurs twam à la map que je saisi pas.

    Je me demande même la nécessité de la map, car je l'utilise pas... J'ai besoin de ttw listé et généré de twa listé et généré de btw listé et généré et des 2 tableaux twaList et btwList
    La map, elle à servi à contrôler les itérations complète de 10 min avec les valeurs associées mais maintenant ?

    twaList est un paramètre de la fonction twamCalc (déja présente dans popup.js)

    Concernant les console.log soit c'est moi qui comprends pas les tableaux dans la console (ça c'est fort possible) soit ça fonctionne pas comme l'idée que j'en ai ...
    Si je reprends "l'idée que j'en ai"

    Array 0: undefined // pas de valeur sur la ligne T+ 0:00 Array 1: [-120°] // 1 valeur pour T+ 0:10 Array 2: [-120°, -125°] // 2 valeurs pour T+ 0:20 Array 3: [-120°, -125°, -128°] // 3 valeurs pour T+ 0:30 Array 4: [-120°, -125°, -128°, -128°] // etc ... Array 5: [-120°, -125°, -128°, -128°, -128°] Array 6: [-120°, -125°, -128°, -128°, -128°, -132°] Array 7: [-120°, -125°, -128°, -128°, -128°, -132°, -135°] Array 8: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°] Array 9: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°] Array 10: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°] Array 11: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141] Array 12: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141, -140°] Array 13: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141, -140°, -143°]

    Ce qui correspond à un tableau à chaque itération de 10min

  • auteur

     var all_ttw = []; var all_twa = []; var all_btw = [];  var ttwLast = "T +0:00"; var twaLast = undefined; var btwLast = undefined;  for (let i = 0; i < points.length; i++) {     // Cette boucle ne peut pas s'exécuter pour i = 0 car valeur toujours existante     while (points[i].ttw !== ttwLast) {         // La boucle se lance quand le ttw espéré n'est pas celui de l'itération courante         all_ttw.push(ttwLast);         all_twa.push(parseInt(twaLast,10));         all_btw.push(btwLast);         ttwLast = genIteNext(ttwLast);        }     // Mise à jour des "last"     ttwLast = genIteNext(ttwLast); // Ceci est la valeur esperée dans l'itération prochaine     twaLast = points[i].twa;     btwLast = points[i].btw;     // Traitements sur tableaux sous conditions     if(all_twa.length === 0){         // i=0 donc les tableaux sont vides donc ajouter undefined         all_btw.push(undefined);         all_twa.push(undefined);     } else if(all_twa[0] * twaLast < 0){         // Changement de signe : reset tableau                 all_btw = [btwLast];         all_twa = [twaLast];         all_ttw = [ttwLast];     } else{         // Cas normal : compléter les listes car signe égaux         all_ttw.push(ttwLast);         all_twa.push(twaLast);         all_btw.push(btwLast);     }     } 

  • GeGaX

    Merci Help-Jason, je test ça ce soir en rentrant du taf ( il sera tard c'est SPI Ouest France, du coup je galope partout ...)

  • GeGaX

    Bonsoir Help-Jason,
    Je viens de tester le code ci dessus et ... il ne m'ouvre pas la popup donc pas possible de voir ce qu'il colle pas j'vais tester quelques console.log pour voir mais je suis pas sur de savoir correctement les placer ...

  • auteur

    Les console.log ne changeront rien. C'est possible que ça soit la boucle while qui est infinie. Commente toute la boucle et vérifie. Sinon, c'est sans doute une erreur Javascript que j'ai pas repéré. Commente du code plutôt que d'ajouter des console.log car ici tu ne peux pas accéder à la console de popup quand il y a une erreur.

  • auteur

     var all_twa = []; var all_btw = []; var myMap = new Map(); var cpt = 0;  var ttwLast = "T+ 0:00"; var twaLast = undefined; var btwLast = undefined;  for (var i = 0; i < points.length; i++) {     // Cette boucle ne peut pas s'exécuter pour i = 0 car valeur toujours existante     //if(i<10){ console.log(points[i].ttw + " " + ttwLast); console.log(points[i].ttw !== ttwLast)};     while (points[i].ttw !== ttwLast) {         // La boucle se lance quand le ttw espéré n'est pas celui de l'itération courante         all_twa.push(parseInt(twaLast,10));         all_btw.push(btwLast);         ttwLast = genIteNext(ttwLast);            myMap.set(cpt, copyArray(all_twa));         cpt++;         //console.log("while loop : " + points[i].ttw + " !== " + ttwLast);         //console.log("while loop : " + ttwLast + ", " +parseInt(twaLast, 10));     }     // Mise à jour des "last"     twaLast = parseInt(points[i].twa, 10);     btwLast = points[i].btw;     // Traitements sur tableaux sous conditions     if(all_twa.length === 0){         // i=0 donc les tableaux sont vides donc ajouter undefined         all_btw.push(undefined);         all_twa.push(undefined);        //if(i<10)console.log("undefined");     } else if(all_twa[1] * twaLast < 0){         // Changement de signe : reset tableau                 all_btw = [btwLast];         all_twa = [twaLast];         //if(i<10)console.log("signe");     } else{         // Cas normal : compléter les listes car signe égaux et ttwLast n'est pas le dernier élément de all_ttw         all_twa.push(twaLast);         all_btw.push(btwLast);         //if(i<10)console.log("normal");     }  ttwLast = genIteNext(ttwLast);  myMap.set(cpt, copyArray(all_twa));  cpt++;  }  function copyArray(array){  var newArray = [];  for(var j=0; j<array.length; j++){   newArray.push(array[j]);  }  return newArray; }  console.log(myMap); 

  • GeGaX

    Salut Help-Jason ;)
    J'ai testé ce dernier code et j'ai plusieurs questions
    - Pourquoi on repart sur une map plutôt que 2 tableaux ( twaList ou all_twa et btwList ou all_btw ) ?
    - Je capte pas ce qu'est la variable cpt ...

    Si je comprends les grandes lignes la fonction copyArray est une boucle qui repasse sur toutes les valeurs pour les mettre dans un tableau ?

    Y'a une erreur de décalage mais je verrais ça après je pense que ça se passe en déclarant la boucle il ne faut pas que ça commence à 0 mais à 1, je creuserais ce point une fois que j'aurais tout capté

  • auteur

    La map permet d'avoir l'affichage que tu souhaites :

     Array 0: undefined // pas de valeur sur la ligne T+ 0:00 Array 1: [-120°] // 1 valeur pour T+ 0:10 Array 2: [-120°, -125°] // 2 valeurs pour T+ 0:20 Array 3: [-120°, -125°, -128°] // 3 valeurs pour T+ 0:30 Array 4: [-120°, -125°, -128°, -128°] // etc ... Array 5: [-120°, -125°, -128°, -128°, -128°] Array 6: [-120°, -125°, -128°, -128°, -128°, -132°] Array 7: [-120°, -125°, -128°, -128°, -128°, -132°, -135°] Array 8: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°] Array 9: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°] Array 10: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°] Array 11: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141] Array 12: [-120°, -125°, -128°, -128°, -128°, -132°, -135°, -137°, -141°, -141°, -141, -140°] 


    La map n'est pas nécessaire mais c'est pour l'affichage du résultat que j'ai décidé de la créer.

    Le tableau points contient des données qui sont complétées par celles que nous créons quand il en manque. La variable cpt s'incrémente à chaque fois que le tableau all_twa grandit. Elle permet notamment d'avoir l'affichage sous forme de map comme indiqué précédemment (encore une fois, peut être supprimée si pas besoin d'un affichage par map).

    J'ai remarqué un comportement étrange en Javascript concernant les tableaux dans une boucle. En effet, quand on affiche le tableau all_twa à chaque fois qu'il grandit, all_twa est affiché uniquement pour sa valeur finale à chaque itération. Cependant, quand on affiche sa taille, on voit bien qu'elle est différente de ce qui est affiché (sa taille varie bien comme il faut). La fonction copyArray copie ... un tableau dans un autre. Bizarrement, cela permet d'afficher le tableau à chaque incrémentation de la boucle (ici, le tableau est stocké dans map pour pouvoir tous les afficher à la fin).

  • GeGaX

    Après avoir étudié ton code sous toutes les coutures, je commence à le comprendre...


    j'ai modifié ceci :
    // Traitements sur tableaux sous conditions     if (twaList.length === 0) { // les tableaux sont vides donc on attribut les premières valeurs twa et btw          btwList.push(btwLast); // undefined avant         twaList.push(twaLast);// idem

    Les tableaux générés sont ceux qui m'intéressent.

    - twaList/btwList ( all_twa/all_btw comme tu les as nommés ci dessus) sont dans la map donc j'peux pas les exploiter, j'veux bien que tu m'aiguilles la dessus stp.

    - Autre point, les valeurs calculées twam et btwm :
    est t'il possible d'écrire quelque chose de ce genre,
    points[i].twam = twamCalc(twaList)
    ?
    Ce qui permettrait de "lier" points[1].ttw à point[0].twam ( T+ 0:10 à pour valeur twam, le point[0].twam)

    - Si je dois garder la map myMap, peut on remplacer cpt qui s'incrémente de 1 à chaque tour par la "vraie" clé ttw ? j'ai dans l'idée qu'il sera facile de remplacer le twam et btwm de T+ 0:00 par " - ".

  • auteur

     var all_twa = []; var all_btw = []; //var myMap = new Map(); //var cpt = 0;  var ttwLast = "T+ 0:00"; var twaLast = undefined; var btwLast = undefined;  for (var i = 0; i < points.length; i++) {     // Cette boucle ne peut pas s'exécuter pour i = 0 car valeur toujours existante     while (points[i].ttw !== ttwLast) {         // La boucle se lance quand le ttw espéré n'est pas celui de l'itération courante         all_twa.push(parseInt(twaLast,10));         all_btw.push(btwLast);         ttwLast = genIteNext(ttwLast);            //myMap.set(cpt, copyArray(all_twa));         //cpt++;         console.log(copyArray(all_twa));     }     // Mise à jour des "last"     twaLast = parseInt(points[i].twa, 10);     btwLast = points[i].btw;     // Traitements sur tableaux sous conditions     if(all_twa.length === 0){         // i=0 donc les tableaux sont vides donc ajouter undefined         all_btw.push(undefined);         all_twa.push(undefined);     } else if(all_twa[1] * twaLast < 0){         // Changement de signe : reset tableau                 all_btw = [btwLast];         all_twa = [twaLast];     } else{         // Cas normal : compléter les listes car signe égaux et ttwLast n'est pas le dernier élément de all_ttw         all_twa.push(twaLast);         all_btw.push(btwLast);     }  ttwLast = genIteNext(ttwLast);  //myMap.set(cpt, copyArray(all_twa));  //cpt++;   console.log(copyArray(all_twa)); }  function copyArray(array){  var newArray = [];  for(var j=0; j<array.length; j++){   newArray.push(array[j]);  }  return newArray; } 

  • GeGaX

    Pour expliquer mon histoire de ttw vs cpt surtout pour T+ 0:00 qui donne un twam à

    "-"
    .
    https://jsbin.com/catasaxike/1/edit?js%2Cconsole=

  • GeGaX

    Je viens de faire un bon ENORME en avant ...
    y'a 2 "petits" bugs, je dis "petits" car ça faisait longtemps que j'avais pas vu des valeurs dans mes colonnes TWAm et BTWm ...
    voici le popup.js que j'ai testé

    var background = chrome.extension.getBackgroundPage();  function createCell(value, row) {     var cell = document.createElement("td");     cell.innerHTML = value;     row.appendChild(cell); }  function ttwStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function dtwStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function dtgStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function twsStyling(value1, value2, cell) {     var tws_foil = value1.replace(" kt", "");     var twa_bd = value2.replace("\u00B0", "");     if (tws_foil >= 11.1 && tws_foil <= 39.9 && Math.abs(twa_bd) >= 71 && Math.abs(twa_bd) <= 169) {         cell.style.backgroundColor = "black";         cell.style.color = "white";     } else {         cell.style.backgroundColor = "white";         cell.style.color = "black";     }     cell.innerHTML = tws_foil + " kt"; }  function twaStyling(value, cell) {     var twa_bd = value.replace("\u00B0", "");     if (twa_bd >= 0) {         cell.style.color = "green";     } else {         cell.style.color = "red";     }     cell.innerHTML = Math.abs(twa_bd) + "\u00B0"; }  function btwStyling(value, cell) {     cell.style.color = "blue";     cell.innerHTML = value; }  function sailStyling(value, cell) {     switch (value.trim()) {     // Upwind sail     case "Jib":         cell.style.backgroundColor = "#FFD479";         break;     case "LJ":         cell.style.backgroundColor = "#FFFC79";         break;     case "Stay":         cell.style.backgroundColor = "#D4FB79";         break;     // Downwind sail     case "Spi":         cell.style.backgroundColor = "#76D6FF";         break;     case "LG":         cell.style.backgroundColor = "#7A81FF";         break;     case "HG":         cell.style.backgroundColor = "#D783FF";         break;     // Reaching sail     case "C0":         cell.style.backgroundColor = "#FF7E79";         break;     }     cell.innerHTML = value; }  function twamStyling(value, cell) {     if (value >= 0) {         cell.style.color = "green";     } else {         cell.style.color = "red";     }     if (value !== "-") {         cell.innerHTML = Math.abs(value) + "\u00B0";     } else {         cell.style.color = "black";         cell.innerHTML = value;     } }  function btwmStyling(value, cell) {     cell.style.color = "blue";     if (value !== "-") {         cell.innerHTML = value + "\u00B0";     } else {         cell.style.color = "black";         cell.innerHTML = value;     } }  function createCellWithCustomStyling(value, row, customStyling) {     var cell = document.createElement("td");     customStyling(value, cell);     row.appendChild(cell); }  function createCellWithCustomStyling2(value1, value2, row, customStyling) {     var cell = document.createElement("td");     customStyling(value1, value2, cell);     row.appendChild(cell); }  function twamCalc(twaList) {     const     twaData = twaList;     Math.radians = function (degrees) {         return degrees * Math.PI / 180.0;     },     Math.degrees = function (radians) {         return radians * 180.0 / Math.PI;     };       let     arX = [],     arY = [],     somX = 0.0,     somY = 0.0,     moyX = 0.0,     moyY = 0.0,     twam = 0.0;          for (const [i, angle] of twaData.entries()) {         arX[i] = Math.cos(Math.radians(angle));         arY[i] = Math.sin(Math.radians(angle));     }       for (const value of arX) {     somX += value;     }     moyX = somX / arX.length;       for (const value of arY) {     somY += value;     }     moyY = somY / arY.length;          twam = Math.round(Math.degrees(Math.atan2(moyY, moyX)));          return twam ; }  function btwmCalc(btwList) {     const     btwData = btwList;     Math.radians = function (degrees) {         return degrees * Math.PI / 180.0;     },     Math.degrees = function (radians) {         return radians * 180.0 / Math.PI;     };       let     arX = [],     arY = [],     somX = 0.0,     somY = 0.0,     moyX = 0.0,     moyY = 0.0,     btwm = 0.0;       for (const [i, angle] of btwData.entries()) {         arX[i] = Math.cos(Math.radians(angle));         arY[i] = Math.sin(Math.radians(angle));     }       for (const value of arX) {     somX += value;     }     moyX = somX / arX.length;       for (const value of arY) {     somY += value;     }     moyY = somY / arY.length;          btwm = Math.round(Math.degrees(Math.atan2(moyY, moyX)));     if (btwm < 0) {         btwm += 360;     }     return btwm; }  function reinitializeDisplay() {     document.getElementById("pointsTable").innerHTML = ""; }  function UtcToLocal(date, time) {     var utcYear = date.split("-")[0];     var utcMonth = (date.split("-")[1]) - 1;     var utcDay = date.split("-")[2];     var utcHour = time.split(":")[0];     var utcMinutes = time.split(":")[1];     var dateUtc = Date.UTC(utcYear, utcMonth, utcDay, utcHour, utcMinutes, 0, 0);          var localDate = new Date(dateUtc);     var year = localDate.getFullYear();     var month = ("0" + (localDate.getMonth() + 1)).slice(-2);     var day = ("0" + localDate.getDate()).slice(-2);     var hours = ("0" + localDate.getHours()).slice(-2);     var minutes = ("0" + localDate.getMinutes()).slice(-2);      var offset = -localDate.getTimezoneOffset();     var absOffset = Math.abs(offset);     var sign = (offset > 0) ? "+" : "-";     var hoursOffset = Math.trunc(absOffset) / 60;     var MinutesHoursOffset = (hoursOffset === 0) ? "\u00b1" + "0" : sign + hoursOffset;     var minutesOffset = absOffset % 60;     var HoursMinutesOffset = (minutesOffset === 0) ? MinutesHoursOffset : sign + hoursOffset + ":" + minutesOffset;      var formattedDate = year + "-" + month + "-" + day;     var formattedTime = hours + ":" + minutes;     var formattedTimeZone = "UTC" + HoursMinutesOffset;     return [formattedDate, formattedTime, formattedTimeZone]; }  function getTimeZone(timezone) {     if (timezone === "CET") {         return "UTC+1";     } else if (timezone === "CEST") {         return "UTC+2";     } }  function displayTable(localTime) {     points.forEach(function (element) {         var row = document.createElement("tr");         document.getElementById("pointsTable").appendChild(row);         if ((localTime && element.timezone === "CET") || (localTime && element.timezone === "CEST")) {             var ceZ = getTimeZone(element.timezone);             createCell(element.date, row);             createCell(element.time, row);             createCell(ceZ, row);         } else if (localTime && element.timezone === "UTC") {             var localDTZ = UtcToLocal(element.date, element.time, element.timezone);             createCell(localDTZ[0], row);             createCell(localDTZ[1], row);             createCell(localDTZ[2], row);         } else {             createCell(element.date, row);             createCell(element.time, row);             createCell(element.timezone, row);         }         createCellWithCustomStyling(element.ttw, row, ttwStyling);         createCellWithCustomStyling(element.dtw, row, dtwStyling);         createCellWithCustomStyling(element.dtg, row, dtgStyling);         createCell(element.twd, row);         createCellWithCustomStyling2(element.tws, element.twa, row, twsStyling);         createCellWithCustomStyling(element.twa, row, twaStyling);         createCellWithCustomStyling(element.btw, row, btwStyling);         createCellWithCustomStyling(element.sail, row, sailStyling);         createCell(element.stw, row);         createCellWithCustomStyling(element.twam, row, twamStyling);         createCellWithCustomStyling(element.btwm, row, btwmStyling);         var manifest = chrome.runtime.getManifest();         document.getElementById("version").innerHTML = manifest.version;     }); }  var displayLocal = function () {     reinitializeDisplay();     if (document.getElementById("localtime").checked) {         chrome.storage.local.set({"localTime" : true});         displayTable(true);     } else {         chrome.storage.local.set({"localTime" : false});         displayTable(false);     } };  document.getElementById("localtime").addEventListener("change", displayLocal);  chrome.storage.local.get("localTime", function (result) {     if (result.localTime === true) {         document.getElementById("localtime").checked = true;         displayLocal();     } else {         document.getElementById("localtime").checked = false;     } }); reinitializeDisplay(); var points = background.points[background.currentTab]; displayTable(false);  var twaList = []; var btwList = []; var ttwLast = "T+ 0:00"; var twaLast = undefined; var btwLast = undefined;  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function zero(val) {     if (val < 10) {         val = "0" + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwHours = parseInt(ttwCurr[1], 10);     var ttwMinutes = parseInt(ttwCurr[2], 10);     var ttwNext = [];     if (ttwMinutes + 10 < 60) {         ttwNext = "T+" + space (ttwHours) + ":" + zero (ttwMinutes + 10);     } else {         ttwNext = "T+" + space (ttwHours + 1) + ":" + zero (ttwMinutes - 50);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     while (points[i].ttw !== ttwLast) {         twaList.push(parseInt(twaLast,10));         btwList.push(parseInt(btwLast,10));         ttwLast = genIteNext(ttwLast);         points[i].twam = twamCalc(twaList);         points[i].btwm = btwmCalc(btwList);     }     twaLast = parseInt(points[i].twa, 10);     btwLast = parseInt(points[i].btw, 10);     if (twaList.length === 0) {         twaList.push(twaLast);         btwList.push(btwLast);     } else if (twaList[0] * twaLast < 0) {         twaList = [twaLast];         btwList = [btwLast];     } else {         twaList.push(twaLast);         btwList.push(btwLast);     }     ttwLast = genIteNext(ttwLast);     points[i].twam = twamCalc(twaList);     points[i].btwm = btwmCalc(btwList); }


    Au PREMIER clic sur l'extension (en majuscule car ça à son importance), j'ai que des
    NaN°
    et
    undefined°
    .

    Au SECOND clic, j'obtiens ceci


    #Je pense que l'endroit où se trouve le code à son importance, je me trompe ?
    Si je dis pas de conneries, j'veux l'afficher avant de l'avoir calculé, nan ?

    #Il me faut juste décaler les valeurs twam et btwm d'une ligne.
    Je dois remplir twam et btwm avec des "-" pour la ligne T+ 0:00.
    La ligne suivante doit avoir les valeurs de twam et btwm (calculé) de T+ 0:00 et ainsi de suite

    points[i].ttw
    contient les valeurs de
    points[i].twam
    et
    points[i].btwm
    actuellement.
    il faut que j'arrive à lui faire comprendre que :
    points[i].ttw
    contient les valeurs de
    points[i-1].twam
    et
    points[i-1].btwm
    .
    Tu vois ce que je veux dire ? Même en me relisant j'ai du mal à me comprendre ...
    Une idée ?

    Les valeurs me semble correct (j'vais faire des tests mais à première vue on est dans les clous),

  • GeGaX

    Les valeurs sont fausses ... :,(

  • auteur

    Il faut bien que tu places ce code avant d'avoir afficher le tableau.

    Ensuite :

     while (points[i].ttw !== ttwLast) {         twaList.push(parseInt(twaLast,10));         btwList.push(parseInt(btwLast,10));         ttwLast = genIteNext(ttwLast);         //points[i].twam = twamCalc(twaList);         //points[i].btwm = btwmCalc(btwList);     } 


    Il ne faut pas les deux lignes commentées car la taille de points est inférieur à la taille du tableau qu'on génère. En particulier, ce bout de code est responsable de l'ajout des valeurs intermédiaires.

  • GeGaX

    Sur les 2 points ( 3 au final, décalage de ligne, calcul faussé, et chargement ) j'en ai résolu 2 ( décalage de ligne et calcul faussé) il me reste juste l'histoire du chargement au premier clic pas au second ...
    voici le popup.js complet

    var background = chrome.extension.getBackgroundPage(); var twaList = []; var btwList = []; var ttwLast = "T+ 0:00"; var twaLast = undefined; var btwLast = undefined;  function createCell(value, row) {     var cell = document.createElement("td");     cell.innerHTML = value;     row.appendChild(cell); }  function ttwStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function dtwStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function dtgStyling(value, cell) {     cell.align = "left";     cell.innerHTML = value; }  function twsStyling(value1, value2, cell) {     var tws_foil = value1.replace(" kt", "");     var twa_bd = value2.replace("\u00B0", "");     if (tws_foil >= 11.1 && tws_foil <= 39.9 && Math.abs(twa_bd) >= 71 && Math.abs(twa_bd) <= 169) {         cell.style.backgroundColor = "black";         cell.style.color = "white";     } else {         cell.style.backgroundColor = "white";         cell.style.color = "black";     }     cell.innerHTML = tws_foil + " kt"; }  function twaStyling(value, cell) {     var twa_bd = value.replace("\u00B0", "");     if (twa_bd >= 0) {         cell.style.color = "green";     } else {         cell.style.color = "red";     }     cell.innerHTML = Math.abs(twa_bd) + "\u00B0"; }  function btwStyling(value, cell) {     cell.style.color = "blue";     cell.innerHTML = value; }  function sailStyling(value, cell) {     switch (value.trim()) {     // Upwind sail     case "Jib":         cell.style.backgroundColor = "#FFD479";         break;     case "LJ":         cell.style.backgroundColor = "#FFFC79";         break;     case "Stay":         cell.style.backgroundColor = "#D4FB79";         break;     // Downwind sail     case "Spi":         cell.style.backgroundColor = "#76D6FF";         break;     case "LG":         cell.style.backgroundColor = "#7A81FF";         break;     case "HG":         cell.style.backgroundColor = "#D783FF";         break;     // Reaching sail     case "C0":         cell.style.backgroundColor = "#FF7E79";         break;     }     cell.innerHTML = value; }  function twamStyling(value, cell) {     if (value >= 0) {         cell.style.color = "green";     } else {         cell.style.color = "red";     }     if (value !== "-") {         cell.innerHTML = Math.abs(value) + "\u00B0";     } else {         cell.style.color = "black";         cell.innerHTML = value;     } }  function btwmStyling(value, cell) {     cell.style.color = "blue";     if (value !== "-") {         cell.innerHTML = value + "\u00B0";     } else {         cell.style.color = "black";         cell.innerHTML = value;     } }  function createCellWithCustomStyling(value, row, customStyling) {     var cell = document.createElement("td");     customStyling(value, cell);     row.appendChild(cell); }  function createCellWithCustomStyling2(value1, value2, row, customStyling) {     var cell = document.createElement("td");     customStyling(value1, value2, cell);     row.appendChild(cell); }  function twamCalc(twaList) {     const     twaData = twaList;     Math.radians = function (degrees) {         return degrees * Math.PI / 180.0;     },     Math.degrees = function (radians) {         return radians * 180.0 / Math.PI;     };       let     arX = [],     arY = [],     somX = 0.0,     somY = 0.0,     moyX = 0.0,     moyY = 0.0,     twam = 0.0;          for (const [i, angle] of twaData.entries()) {         arX[i] = Math.cos(Math.radians(angle));         arY[i] = Math.sin(Math.radians(angle));     }       for (const value of arX) { 	   somX += value;     }     moyX = somX / arX.length;       for (const value of arY) { 	   somY += value;     }     moyY = somY / arY.length;          twam = Math.round((Math.degrees(Math.atan2(moyY, moyX)) * 10)) / 10;     if (isNaN (twam)) {         twam = "-";     }     return twam ; }  function btwmCalc(btwList) {     const     btwData = btwList;     Math.radians = function (degrees) {         return degrees * Math.PI / 180.0;     },     Math.degrees = function (radians) {         return radians * 180.0 / Math.PI;     };       let     arX = [],     arY = [],     somX = 0.0,     somY = 0.0,     moyX = 0.0,     moyY = 0.0,     btwm = 0.0;       for (const [i, angle] of btwData.entries()) {         arX[i] = Math.cos(Math.radians(angle));         arY[i] = Math.sin(Math.radians(angle));     }       for (const value of arX) { 	   somX += value;     }     moyX = somX / arX.length;       for (const value of arY) { 	   somY += value;     }     moyY = somY / arY.length;          btwm = Math.round((Math.degrees(Math.atan2(moyY, moyX)) * 10))/ 10;     if (isNaN (btwm)) {         btwm = "-";     } else if (btwm < 0) {         btwm += 360;     }     return btwm; }  function reinitializeDisplay() {     document.getElementById("pointsTable").innerHTML = ""; }  function UtcToLocal(date, time) {     var utcYear = date.split("-")[0];     var utcMonth = (date.split("-")[1]) - 1;     var utcDay = date.split("-")[2];     var utcHour = time.split(":")[0];     var utcMinutes = time.split(":")[1];     var dateUtc = Date.UTC(utcYear, utcMonth, utcDay, utcHour, utcMinutes, 0, 0);          var localDate = new Date(dateUtc);     var year = localDate.getFullYear();     var month = ("0" + (localDate.getMonth() + 1)).slice(-2);     var day = ("0" + localDate.getDate()).slice(-2);     var hours = ("0" + localDate.getHours()).slice(-2);     var minutes = ("0" + localDate.getMinutes()).slice(-2);      var offset = -localDate.getTimezoneOffset();     var absOffset = Math.abs(offset);     var sign = (offset > 0) ? "+" : "-";     var hoursOffset = Math.trunc(absOffset) / 60;     var MinutesHoursOffset = (hoursOffset === 0) ? "\u00b1" + "0" : sign + hoursOffset;     var minutesOffset = absOffset % 60;     var HoursMinutesOffset = (minutesOffset === 0) ? MinutesHoursOffset : sign + hoursOffset + ":" + minutesOffset;      var formattedDate = year + "-" + month + "-" + day;     var formattedTime = hours + ":" + minutes;     var formattedTimeZone = "UTC" + HoursMinutesOffset;     return [formattedDate, formattedTime, formattedTimeZone]; }  function getTimeZone(timezone) {     if (timezone === "CET") {         return "UTC+1";     } else if (timezone === "CEST") {         return "UTC+2";     } }  function displayTable(localTime) {     points.forEach(function (element) {         var row = document.createElement("tr");         document.getElementById("pointsTable").appendChild(row);         if ((localTime && element.timezone === "CET") || (localTime && element.timezone === "CEST")) {             var ceZ = getTimeZone(element.timezone);             createCell(element.date, row);             createCell(element.time, row);             createCell(ceZ, row);         } else if (localTime && element.timezone === "UTC") {             var localDTZ = UtcToLocal(element.date, element.time, element.timezone);             createCell(localDTZ[0], row);             createCell(localDTZ[1], row);             createCell(localDTZ[2], row);         } else {             createCell(element.date, row);             createCell(element.time, row);             createCell(element.timezone, row);         }         createCellWithCustomStyling(element.ttw, row, ttwStyling);         createCellWithCustomStyling(element.dtw, row, dtwStyling);         createCellWithCustomStyling(element.dtg, row, dtgStyling);         createCell(element.twd, row);         createCellWithCustomStyling2(element.tws, element.twa, row, twsStyling);         createCellWithCustomStyling(element.twa, row, twaStyling);         createCellWithCustomStyling(element.btw, row, btwStyling);         createCellWithCustomStyling(element.sail, row, sailStyling);         createCell(element.stw, row);         createCellWithCustomStyling(element.twam, row, twamStyling);         createCellWithCustomStyling(element.btwm, row, btwmStyling);         var manifest = chrome.runtime.getManifest();         document.getElementById("version").innerHTML = manifest.version;     }); }  var displayLocal = function () {     reinitializeDisplay();     if (document.getElementById("localtime").checked) {         chrome.storage.local.set({"localTime" : true});         displayTable(true);     } else {         chrome.storage.local.set({"localTime" : false});         displayTable(false);     } };  document.getElementById("localtime").addEventListener("change", displayLocal);  chrome.storage.local.get("localTime", function (result) {     if (result.localTime === true) {         document.getElementById("localtime").checked = true;         displayLocal();     } else {         document.getElementById("localtime").checked = false;     } }); reinitializeDisplay(); var points = background.points[background.currentTab]; displayTable(false);  function space(val) {     if (val < 10) {         val = " " + val;     }     return val; }  function zero(val) {     if (val < 10) {         val = "0" + val;     }     return val; }  function genIteNext (ttwCurr) {     var ttwCurr = ttwCurr.match(/.*?([0-9]{1,3}):([0-9]{2})/);     var ttwHours = parseInt(ttwCurr[1], 10);     var ttwMinutes = parseInt(ttwCurr[2], 10);     var ttwNext = [];     if (ttwMinutes + 10 < 60) {         ttwNext = "T+" + space (ttwHours) + ":" + zero (ttwMinutes + 10);     } else {         ttwNext = "T+" + space (ttwHours + 1) + ":" + zero (ttwMinutes - 50);     }     return ttwNext; }  for (var i = 0; i < points.length; i++) {     points[i].twam = twamCalc(twaList);     points[i].btwm = btwmCalc(btwList);     while (points[i].ttw !== ttwLast) {         twaList.push(parseInt(twaLast,10));         btwList.push(parseInt(btwLast,10));         ttwLast = genIteNext(ttwLast);     }     twaLast = parseInt(points[i].twa, 10);     btwLast = parseInt(points[i].btw, 10);     if (twaList.length === 0) {         twaList.push(twaLast);         btwList.push(btwLast);     } else if (twaList[0] * twaLast < 0) {         twaList = [twaLast];         btwList = [btwLast];     } else {         twaList.push(twaLast);         btwList.push(btwLast);     }     ttwLast = genIteNext(ttwLast); }


    Concernant le chargement, là je bloque ...dès que je déplace le code qu'on à créé au dessus de la fonction
    displayTable
    il n'est plus capable de comprendre
    points.length
    j'suis vert je croyais dur comme fer que j'allais pouvoir sortir la MAJ ce soir mais nan ... J'veux bien un dernier coup de pouce stp :/

  • GeGaX

    J'viens de m'apercevoir que je t'ai pas indiqué les modifs ...

    points[i].twam et points[i].btwm ont été déplacés avant while

    for (var i = 0; i < points.length; i++) {     points[i].twam = twamCalc(twaList);     points[i].btwm = btwmCalc(btwList);     while (points[i].ttw !== ttwLast) {         twaList.push(parseInt(twaLast,10));         btwList.push(parseInt(btwLast,10));         ttwLast = genIteNext(ttwLast);     }     twaLast = parseInt(points[i].twa, 10);     btwLast = parseInt(points[i].btw, 10);     if (twaList.length === 0) {         twaList.push(twaLast);         btwList.push(btwLast);     } else if (twaList[0] * twaLast < 0) {         twaList = [twaLast];         btwList = [btwLast];     } else {         twaList.push(twaLast);         btwList.push(btwLast);     }     ttwLast = genIteNext(ttwLast); }


    Ce qui pour la ligne T+ 0:00, me renvoyait
    NaN°
    en valeur twam et btwm que je "gère" dans la fonction twamCalc et btwmCalc par
    twam:
    twam = Math.round((Math.degrees(Math.atan2(moyY, moyX)) * 10)) / 10;     if (isNaN (twam)) {         twam = "-";     }     return twam ;

    btwm:
    btwm = Math.round((Math.degrees(Math.atan2(moyY, moyX)) * 10))/ 10;     if (isNaN (btwm)) {         btwm = "-";     } else if (btwm < 0) {         btwm += 360;     }     return btwm;

    Ça fait correctement le job ;)

    Dernière et ultime étape le chargement en un clic ( déplacement du code apparement mais où ça c'est mystère et boules de gomme ... )

  • auteur

    Je placerai le code entre les deux lignes suivantes :

     var points = background.points[background.currentTab]; // CODE ICI displayTable(false); 

  • GeGaX

    Alors là chapeauX l'artiste !
    Chapeau déjà pour ta pédagogie, j'ai appris énormément de choses en JS, chapeau pour ta patience il a du t'en falloir lorsque je galérais et posais des questions en permanence ...
    et un grand MERCI de m'avoir aidé, guidé tout au long du truc.

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed