Calcul angle moyen avec itérations non listés

Résolu/Fermé
GeGaX Messages postés 83 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 25 décembre 2018 - Modifié le 20 févr. 2018 à 22:35
GeGaX Messages postés 83 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 25 décembre 2018 - 4 avril 2018 à 23:55
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 ;)


A voir également:

1 réponse

Utilisateur anonyme
21 févr. 2018 à 19:15
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.

0
GeGaX Messages postés 83 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 25 décembre 2018
Modifié le 21 févr. 2018 à 20:36
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 ;)
0
Utilisateur anonyme
21 févr. 2018 à 21:05
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)
0
GeGaX Messages postés 83 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 25 décembre 2018
Modifié le 21 févr. 2018 à 22:26
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 ?
0
Utilisateur anonyme
22 févr. 2018 à 12:50
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.
0
GeGaX Messages postés 83 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 25 décembre 2018
22 févr. 2018 à 23:28
Ok j'avais donc bien compris, je m'en occupe demain et te tiens au jus
Merci Help-Jason ;)
0