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.
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°
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 = 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 ;)