[RESOLU] Calcul de moyenne à chaque ligne

Eléphant du PHP | 50 Messages

28 août 2017, 23:07

Bonsoir,
Dernière ligne droite avant de mettre l'extension* sur le Google Chrome Store.
* Extension créée par Wolan et modifiée - petites modifs - par moi même et un autre gars de Virtual Regatta (VR).

Voici ce que son extension donne :
Image

A partir du site zezo.org :
Image

On ( le gars de VR et moi même ) a tenté d'implémenter une valeur TWA moyenne à chaque ligne, idem pour BTW
Ce qui permet de "lisser" la trajectoire ( utile pour la nuit et surtout pour le taf )
On les a donc appelé TWAm et BTWm puis on a commencé l'intégration


Ça donne ceci :
Image


Les subtilités du calcul de TWAm doit prendre 2 paramètres en compte :
- un est l'amure Bâbord (Valeurs Rouges) ou Tribord (Valeurs Vertes).
En réalité les valeurs bâbord sont négatives et les valeurs tribord sont positives et non colorées mais sont gérées par ce bout de code
function twaStyling(value, cell) {
    var rep = value.replace('\u00B0', '');
    if (rep >= 0) {
        cell.style.color = "green";
    } else {
        cell.style.color = "red";
    }
    cell.innerHTML = Math.abs(rep) + '\u00B0';
}

- l'autre est les itérations.
Sur le jeu on avance par de petits Waypoint toutes les 10 min ( 00:10 )


Si je prend cet exemple :
Image

On remarque que les itérations se font à 22:10, 22:20, 22:30 et ... 23:40 ce qu'il veut dire qu'il manque 22:40, 22:50, 23:00, 23:10, 23:20 et 23:30


Comme ceci :
Image

J'en ai donc besoin pour calculer mes moyennes ...


Le gars de VR à écrit un bout de code pour calculer ces valeurs ce qui donne ceci :
C'est tout ce qui est commenté sauf // sails et // pro sails
var background = chrome.extension.getBackgroundPage();

/*
var nb_ite = 0;
var nb_ite_prec = 0;
var nb_ite_deb = 0;

var twam = 0;
var twa_prec = 0;
var tot_twa = 0;

var btwm = 0;
var tot_btw = 0;
var btw_prec = 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 twaStyling(value, cell) {
    var rep = value.replace('\u00B0', '');
    if (rep >= 0) {
        cell.style.color = "green";
    } else {
        cell.style.color = "red";
    }
    cell.innerHTML = Math.abs(rep) + '\u00B0';
}

function btwStyling(value, cell) {
    cell.style.color = "blue";
    cell.innerHTML = value;
}

function sailStyling(value, cell) {
    switch (value.trim()) {
	// sails
    case 'Jib':
        cell.style.backgroundColor = "#FCF400";
        break;
    case 'Spi':
        cell.style.backgroundColor = "#3BEA7C";
        break;
	// pro sails
    case 'Jib2':
        cell.style.backgroundColor = "#B680FD";
        break;
    case 'Gen':
        cell.style.backgroundColor = "#EB3B3A";
        break;
    case 'Sol':
        cell.style.backgroundColor = "#EB3B3A";
        break;
    case 'C0':
        cell.style.backgroundColor = "#F49800";
        break;
    case 'HG':
        cell.style.backgroundColor = "#ED75EA";
        break;
    case 'LG':
        cell.style.backgroundColor = "#4FA0D1";
        break;
    }
    cell.innerHTML = value;
}

/*
function twamStyling(value, cell) {
    if (value >= 0) {
        cell.style.color = "green";
    } else {
        cell.style.color = "red";
    }
    cell.innerHTML = Math.abs(value) + '\u00B0';
}

function btwmStyling(value, cell) {
    cell.style.color = "blue";
    cell.innerHTML = value + '\u00B0';
}
*/

function createCellWithCustomStyling(value, row, customStyling) {
    var cell = document.createElement("td");
    customStyling(value, cell);
    row.appendChild(cell);
}

/*
function calc_nb_ite(value) {
    var delta_t = value.match(/.*?([0-9]{1,}):([0-9]{2})/);
	nb_ite_deb = delta_t[1] * 6 + delta_t[2] / 10;
	nb_ite = nb_ite_deb - nb_ite_prec;
	nb_ite_prec = nb_ite_deb;
	console.log(nb_ite_deb, nb_ite, nb_ite_prec);
}

function calc_twam(value) {
	ss_tot = value.replace('\u00B0', '');
	if (ss_tot >= 0) {
		if (twa_prec < 0) {
			nb_ite=0;
			twa_prec=0;
		}	
	} else {
		if (twa_prec >= 0) {
			nb_ite=0;
			twa_prec=0;
		}	
	}
	tot_twa = (twam * nb_ite_prec) + (twa_prec * (nb_ite_deb - nb_ite_prec));
	twam = (tot_twa + parseFloat(ss_tot)) / (nb_ite_prec + 1);
	twam = Math.round(twam * 100) / 100;
	twa_prec = ss_tot;
	console.log(value, ss_tot, tot_twa, nb_ite_prec, twa_prec, nb_ite, twam);
}

function calc_btwm(value) {
    ss_tot = value.replace('\u00B0', '');
	tot_btw = (btwm * nb_ite_prec) + (btw_prec * (nb_ite_deb - nb_ite_prec));
	btwm = (tot_btw + parseFloat(ss_tot)) / (nb_ite_prec + 1);
	btwm = Math.round(btwm * 100) / 100;
	btw_prec = ss_tot;
	console.log(value, ss_tot, btwm);
}
*/

document.getElementById("pointsTable").innerHTML = "";

background.points.forEach(function (element) {
    var row = document.createElement("tr");
    document.getElementById("pointsTable").appendChild(row);
    createCell(element.date, row);
    createCell(element.time, 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);
    createCell(element.tws, row);
    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);
    console.log(element);
});

Ce code donne ceci :
Image


On voit que les valeurs obtenues sur excel ne sont pas identique à celles du code ...
Quelqu'un voit où se trouve l'erreur ? :priere:
Nous on tourne en rond ... #-o
Merci ;)

Les fichiers sont disponibles au DL ici :
https://www.catupload.com/download/9b78 ... 57833.html

Eléphant du PHP | 50 Messages

29 août 2017, 23:01

Le soucis de calcul des moyennes est maintenant réglé ;)

Reste à gérer le changement d'amure pour arrêter le calcul d'un bord pour commencer le calcul sur l'autre ...
Une idée pour m'aiguiller ?

C'est le code commenté qui me pose soucis
var background = chrome.extension.getBackgroundPage();

var nb_ite = 0;
var nb_ite_prec = 0;
var nb_ite_deb = 0;

var heur_actu = 0;
var heur_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;


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 twaStyling(value, cell) {
    var rep = value.replace('\u00B0', '');
    if (rep >= 0) {
        cell.style.color = "green";
    } else {
        cell.style.color = "red";
    }
    cell.innerHTML = Math.abs(rep) + '\u00B0';
}

function btwStyling(value, cell) {
    cell.style.color = "blue";
    cell.innerHTML = value;
}

function sailStyling(value, cell) {
    switch (value.trim()) {
    // sails
    case 'Jib':
        cell.style.backgroundColor = "#FCF400";
        break;
    case 'Spi':
        cell.style.backgroundColor = "#3BEA7C";
        break;
    // pro sails
    case 'Jib2':
        cell.style.backgroundColor = "#B680FD";
        break;
    case 'Gen':
        cell.style.backgroundColor = "#EB3B3A";
        break;
    case 'Sol':
        cell.style.backgroundColor = "#EB3B3A";
        break;
    case 'C0':
        cell.style.backgroundColor = "#F49800";
        break;
    case 'HG':
        cell.style.backgroundColor = "#ED75EA";
        break;
    case 'LG':
        cell.style.backgroundColor = "#4FA0D1";
        break;
    }
    cell.innerHTML = value;
}

function twamStyling(value, cell) {
    if (value >= 0) {
        cell.style.color = "green";
    } else {
        cell.style.color = "red";
    }
    cell.innerHTML = Math.abs(value) + '\u00B0';
}

function btwmStyling(value, cell) {
    cell.style.color = "blue";
    cell.innerHTML = value + '\u00B0';
}

function createCellWithCustomStyling(value, row, customStyling) {
    var cell = document.createElement("td");
    customStyling(value, cell);
    row.appendChild(cell);
}

function calc_nb_ite(value) {
	var delta_t = value.match(/.*?([0-9]{1,}):([0-9]{2})/);
	nb_ite_deb = delta_t[1] * 6 + delta_t[2] / 10;
	nb_ite = nb_ite_deb - nb_ite_prec + 1;
	nb_ite_prec = nb_ite_deb;
	heur_prec = heur_actu;
	heur_actu = delta_t[1] * 6 + delta_t[2] / 10;
	nb_step = heur_actu - heur_prec;
	console.log(nb_ite_deb, nb_ite, nb_ite_prec);
	console.log(heur_actu, nb_step, heur_prec);
}

function calc_twam(value) {
	ss_tot = value.replace('\u00B0', '');
	/*
	if (ss_tot >= 0) {
		if (twa_prec < 0) {
			nb_ite = 0;
			twa_prec = 0;
		}
	} else {
		if (twa_prec >= 0) {
			nb_ite = 0;
			twa_prec = 0;
		}
	}
	*/
	tot_twa = tot_twa_prec - twa_prec + (twa_prec * nb_step) + parseFloat(ss_tot);
	twam = tot_twa / (heur_actu + 1);
	twam = Math.round(twam);
	tot_twa_prec = tot_twa;
	twa_prec = parseFloat(ss_tot);
	console.log(value, ss_tot, tot_twa, heur_prec, heur_actu, nb_step, twam, twa_prec);
}

function calc_btwm(value) {
	ss_tot = value.replace('\u00B0', '');
	tot_btw = tot_btw_prec - btw_prec + (btw_prec * nb_step) + parseFloat(ss_tot);
	btwm = tot_btw / (heur_actu + 1);
	btwm = Math.round(btwm);
	tot_btw_prec = tot_btw;
	btw_prec = parseFloat(ss_tot);
	console.log(value, ss_tot, tot_btw, heur_prec, heur_actu, nb_step, btwm, btw_prec);
}

document.getElementById("pointsTable").innerHTML = "";

background.points.forEach(function (element) {
    var row = document.createElement("tr");
    document.getElementById("pointsTable").appendChild(row);
    createCell(element.date, row);
    createCell(element.time, 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);
    createCell(element.tws, row);
    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);
    console.log(element);
});