[RESOLU] Liste / boucle / itérations

Eléphanteau du PHP | 35 Messages

25 févr. 2018, 21:59

Bonjour,



Dernière ligne droite pour corriger erreurs de code et bugs.



Je vais détailler au maximum pour éviter toutes confusions en prenant un exemple concret.



Image



TWAm correspond une moyenne de twa et est calculée avec cette fonction

function twamCalc() {
  const
  twaData = [-28, -38];
  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 + " pour twaData: " + twaData;
}
 
  console.log(twamCalc()); // -33 pour twaData: -28, -38
Dans mon 'cahier des charges' 3 choses :

- Obtenir une valeur pour twam pour chaque ttw listés.

- Le calcul des valeurs twam ( pour ce cas ) doit se limiter aux valeurs négatives puis reprendre pour les valeurs positives (et vice versa tout dépend de la valeur initiale de T+ 0:00)

- le calcul des valeurs twam doit prendre en compte les valeurs twa des itérations de 10min ( ttw ) non listés.



# Si les itérations de 10 min sont prises en compte je dois obtenir:
//T+ 0:00, T+ 0:10, T+ 0:20, T+ 0:30, T+ 0:40, T+ 0:50, T+ 1:00, T+ 1:10, T+ 1:20, T+ 1:30, T+ 1:40, T+ 1:50, T+ 2:00
-45, -45, -45, -45, -50, -50, -45, 50, 50, 35, 35, 35, 45
# Si j'ajoute la condition que je me limite aux valeurs négatives ( pour la première partie puisqu'il y a des valeurs positives après ) je dois obtenir:
//T+ 0:00, T+ 0:10, T+ 0:20, T+ 0:30, T+ 0:40, T+ 0:50, T+ 1:00
-45, -45, -45, -45, -50, -50, -45
# Si je souhaite obtenir une valeur twam pour chaque itération du tableau, twaData doit correspondre pour chaque ttw listé : ( résultat obtenu avec twamCalc() )
- // T+ 0:00 je ne peux pas obtenir une valeur ici car je suis déjà sur ce point
-45 // T+ 0:10 twaData = [-45, -45]
-45 // T+0:40 twaData = [-45, -45, -45, -45]
-46,7// T+ 1:00 twaData = [-45, -45, -45, -45, -50, -50]
-46,4// T + 1:10 twaData = [-45, -45, -45, -45, -50, -50, -45]
##########################################################
#Le calcul stop et recommence pour les valeurs positives #
##########################################################
50// T+ 1:30 twaData = [50, 50]
41// T+ 2:00 twaData = [50, 50, 35, 35, 35]
soit



Image



Ma problématique pour la mise en oeuvre est la suivante:

Il me faut générer twaData, par quelle méthode obtenir le résultat détaillé ici ('cahier des charges') ?



Pour celui ou ceux qui me répondront ( j'espère ) n'hésitez pas à détailler vos conseils ou bouts de code, je souhaite également comprendre la démarche ça fait quelques soirs voir plus que je mets mes neurones en ébullitions alors autant que la méthode pour obtenir ce que je souhaite rentre et soit comprise



Merci d'avance



Cdlt



PS: J'oubliais ... je suis ce qu'on appelle un noob ... mon domaine c'est l'électronique marine pas le javascript 8-|

Eléphanteau du PHP | 35 Messages

26 févr. 2018, 12:17

Bonjour,
Plusieurs vues mais pas de pistes, je me dis qu'il doit manquer quelque chose ...
Après réflexion, je me dis que qu'il est peut être opportun d'indiquer comment ce fait l'extraction des données, elle peut indiquer surement certaines choses qui aiderait à comprendre.
Je met donc le code complet, les commentaires du code concernent uniquement ttw et twa.
"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]; // ici l'extraction de la valeur ttw de chaque ligne d'instruction
            const dtw = match[5];
            const dtg = match[6];
            const twd = match[7];
            const tws = match[8];
            const twa = match[9]; // ici l'extraction de la valeur twa de chaque ligne d'instruction
            const btw = match[10];
            const sail = match[11];
            const stw = match[12];
		   
            points.push({
                date : date,
                time : time,
                timezone : timezone,
                ttw : ttw, // ici on envoie la valeur extraite
                dtw : dtw,
                dtg : dtg,
                twd : twd,
                tws : tws,
                twa : twa, // idem pour twa
                btw : btw,
                sail : sail,
                stw : stw
           });
            pattern.lastIndex = 0;
        }
    });

var background = chrome.extension.getBackgroundPage();

/* Ce code concerne l'ancienne méthode de calcul de twam (et btwm)
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);
}

/* ici c'est juste une modification visuel de la valeur dans le tableau
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";
}

/*  Ici la valeur twa est soit négative ou positive, on prends la valeur absolue et on la colore (rouge : négative, vert : positive)
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;
}

/* Idem que pour valeurs twa
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);
}

/* Ancien code pour déterminer twam (il est faux, il faut passer par un calcul trigo)
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) {
    var 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;
}
*/

var twalist = []; // Raison du topic ( comment alimenter cette variable avec les 3 contraintes du 'cahier des charges' )

/* Nouveau code de calcul twam (trigo)
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;
}
*/

function calc_btwm(value) {
    var 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) {
    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); // creation des cellules ttw avec formatage visuel
        calc_nb_ite(element.ttw); // ancien code pour deteminer twam
        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); // ancien code twam
        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);
Voilà y'a tout je peux pas faire mieux ...
Si il manque encore quelque chose, faites le moi savoir, je le fournirais
Je sais que vous allez pas me donner un code tout fait comme ça ( je suis pas contre ) mais je veux bien des infos / conseils concernant l'approche / la méthode pour y arriver.

Comme dit dans le post précédent, je ne suis pas développeur c'est un métier et pas le miens, mais je cherche (énormément) et j'apprends en même temps, c'est passionnant mais j'ai peu de connaissances d'ou la demande de coup de pouce.

Merci d'avance

Cdlt