From 724836a639bc0a6420f7ad1e6a4bf851967ca4c7 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Tue, 4 Jun 2024 00:17:51 +0200 Subject: [PATCH 01/12] Strategy : add rotation system --- docs/pages/strategy-2024/sketch.js | 166 +++++++++++++++++++++++------ 1 file changed, 133 insertions(+), 33 deletions(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index f044627..13631eb 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -6,6 +6,8 @@ let cb_POI; let afficherPOI = true; let cb_DeleteOption; let deleteOption = false; +let cb_Rotation; +let rotationOption = false; let etatRobot = 'arrêté'; // Peut être 'lecture', 'pause', ou 'arrêté' let positionRobot = 0; // Indice du point de stratégie actuel let vitesseRobot = 1; // Vitesse de déplacement entre les points (modifiable par un curseur) @@ -18,6 +20,14 @@ let pointsStrategie = []; let numeroPointStrategie = 1; // Commencez à numéroter à partir de 1 let pointSelectionne = null; +// Orientation +let rotationActuelle = null; +let rotationPointActuel = 0; +let rotationSuivante = null; + +// On désactive le menu contextuel pour pouvoir éditer les rotation des points avec +let noMenuArea = document.getElementById('p5-container'); +noMenuArea.addEventListener('contextmenu', event => event.preventDefault()); function calculerEchelle() { // Le canvas vise à représenter une surface de 3m x 2m (3000mm x 2000mm) @@ -32,7 +42,7 @@ function preload() { } function setup() { - + angleMode(DEGREES); // Angle en degrés pour les rotations const container = select('#p5-container'); let height = (windowHeight * ajustement) / 100; let width = (height * 2) / 3; @@ -62,16 +72,21 @@ function draw() { function setupUI() { // Initialisation des checkboxes avec style Bootstrap - cb_POI = createCheckbox("POIs", afficherPOI); + cb_POI = createCheckbox(" POIs", afficherPOI); cb_POI.parent('checkboxContainer'); cb_POI.changed(majPOI); cb_POI.class('form-check-label'); - cb_DeleteOption = createCheckbox("Delete Mode", deleteOption); + cb_DeleteOption = createCheckbox(" Delete Mode", deleteOption); cb_DeleteOption.parent('checkboxContainer'); cb_DeleteOption.changed(majDeleteOption); cb_DeleteOption.class('form-check-label'); + cb_Rotation = createCheckbox(" Rotation", rotationOption); + cb_Rotation.parent('checkboxContainer'); + cb_Rotation.changed(majRotationOption); + cb_Rotation.class('form-check-label'); + // Initialisation des boutons avec style Bootstrap let btnClear = createButton("Clear Stratégie"); btnClear.parent('buttonsContainer'); @@ -124,6 +139,7 @@ function setupUI() { btnStop.mousePressed(() => { etatRobot = 'arrêté'; positionRobot = 0; // Réinitialiser la position du robot + rotationActuelle = null; // Réinitialiser la rotation actuelle }); // Curseur de vitesse @@ -146,11 +162,17 @@ function drawRobot() { let canvasX = lerp(pointActuel.y * echelleY, pointSuivant.y * echelleY, progression); let canvasY = lerp((3000 - pointActuel.x) * echelleX, (3000 - pointSuivant.x) * echelleX, progression); + if (pointActuel.rotation !== null) { + rotationActuelle = pointActuel.rotation; + } + stroke(255); // Couleur du contour strokeWeight(2); // Épaisseur du contour fill('rgba(10, 10, 10, 0.5)'); ellipse(canvasX, canvasY, 50, 50); + line(canvasX, canvasY, canvasX + 25 * cos(rotationActuelle), canvasY + 25 * sin(rotationActuelle)); + if (etatRobot === 'lecture') { if (indexActuel < pointsStrategie.length - 1) { // Empêche l'incrémentation au-delà du dernier point positionRobot += vitesseRobot * 0.01; @@ -171,6 +193,10 @@ function majPOI() { afficherPOI = cb_POI.checked(); } +function majRotationOption() { + rotationOption = cb_Rotation.checked(); +} + function drawPOI() { if (afficherPOI) { drawList(pois); @@ -228,6 +254,16 @@ function drawPoint(point) { // Vérifier si la souris est proche du point pour décider si on affiche un contour let estProche = dist(mouseX, mouseY, canvasX, canvasY) < taillePoint / 2; + // Contour blanc même si la souris se trouve en dehors du canvas + if (pointSelectionne === point && + (Math.round(3000 - (mouseY / echelleY)) > 3000 || + Math.round(mouseX / echelleX) > 2000 || + Math.round(3000 - (mouseY / echelleY)) < 0 || + Math.round(mouseX / echelleX) < 0)) + { + estProche = true; + } + // Si la souris est proche, définir le contour en blanc if (estProche) { stroke(255); // Couleur du contour @@ -265,7 +301,10 @@ function drawPoint(point) { // Appliquer l'alignement et le décalage pour le nom et les coordonnées textAlign((mouseX < width / 2) ? LEFT : RIGHT, (mouseY < height / 2) ? BOTTOM : TOP); text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); - text(`(${point.x}, ${point.y})`, canvasX + offsetX, canvasY + offsetY + 20); + if (point.rotation !== null) + text(`(${point.x}, ${point.y}, ${point.rotation}°)`, canvasX + offsetX, canvasY + offsetY + 20); + else + text(`(${point.x}, ${point.y})`, canvasX + offsetX, canvasY + offsetY + 20); // Réinitialisez le contour pour les autres éléments à dessiner après le texte noStroke(); @@ -309,44 +348,45 @@ function extractPOIs() { } }); } + function mousePressed() { - if (deleteOption && mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) { - // Logique de suppression des points - for (let i = pointsStrategie.length - 1; i >= 0; i--) { - let point = pointsStrategie[i]; - let canvasX = point.y * echelleY; - let canvasY = (3000 - point.x) * echelleX; - if (dist(mouseX, mouseY, canvasX, canvasY) < 15) { - // Supprime le point et met à jour les numéros des points suivants - pointsStrategie.splice(i, 1); - renumeroterPoints(); - return; // Arrêtez la recherche dès qu'un point est trouvé et supprimé + if (mouseButton === LEFT) + { + if (deleteOption && mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) { + // Logique de suppression des points + for (let i = pointsStrategie.length - 1; i >= 0; i--) { + let point = pointsStrategie[i]; + let canvasX = point.y * echelleY; + let canvasY = (3000 - point.x) * echelleX; + if (dist(mouseX, mouseY, canvasX, canvasY) < 15) { + // Supprime le point et met à jour les numéros des points suivants + pointsStrategie.splice(i, 1); + renumeroterPoints(); + return; // Arrêtez la recherche dès qu'un point est trouvé et supprimé + } } - } - } else { - let pointTrouve = false; - // Tentez d'abord de sélectionner un point de stratégie existant pour le déplacer - for (let point of pointsStrategie) { - let canvasX = point.y * echelleY; - let canvasY = (3000 - point.x) * echelleX; - if (dist(mouseX, mouseY, canvasX, canvasY) < 15) { - pointSelectionne = point; - pointTrouve = true; - break; // Un point est trouvé pour déplacement, arrêter la recherche + } else { + let pointTrouve = false; + // Tentez d'abord de sélectionner un point de stratégie existant pour le déplacer + for (let point of pointsStrategie) { + let canvasX = point.y * echelleY; + let canvasY = (3000 - point.x) * echelleX; + if (dist(mouseX, mouseY, canvasX, canvasY) < 15) { + pointSelectionne = point; + pointTrouve = true; + break; // Un point est trouvé pour déplacement, arrêter la recherche + } } - } - if (!pointTrouve && mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) { - // Si aucun point de stratégie n'est sélectionné, vérifiez l'aimantation ou créez un nouveau point - verifierAimantationEtCreerPoint(); + if (!pointTrouve && mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) { + // Si aucun point de stratégie n'est sélectionné, vérifiez l'aimantation ou créez un nouveau point + verifierAimantationEtCreerPoint(); + } } } } - - - function renumeroterPoints() { numeroPointStrategie = 1; for (let point of pointsStrategie) { @@ -375,6 +415,20 @@ function mouseDragged() { pointSelectionne.x = Math.round((3000 - (mouseY / echelleY))); pointSelectionne.y = Math.round(mouseX / echelleX); pointSelectionne.couleur = "blue"; // La couleur originale des points de stratégie + + // Restrictions des bords du terrain + if (pointSelectionne.x < 0) + pointSelectionne.x = 0; + + if (pointSelectionne.x > 3000) + pointSelectionne.x = 3000; + + if (pointSelectionne.y < 0) + pointSelectionne.y = 0; + + if (pointSelectionne.y > 2000) + pointSelectionne.y = 2000; + } } } @@ -389,6 +443,7 @@ function verifierAimantationEtCreerPoint() { pointsStrategie.push({ x: poi.x, y: poi.y, + rotation: null, // Aucune rotation par défaut nom: `Stratégie ${numeroPointStrategie}`, couleur: "green", numero: numeroPointStrategie++ @@ -402,9 +457,11 @@ function verifierAimantationEtCreerPoint() { // Crée un nouveau point à l'emplacement de la souris si non aimanté let xTerrain = Math.round((3000 - (mouseY / echelleY))); let yTerrain = Math.round(mouseX / echelleX); + pointsStrategie.push({ x: xTerrain, y: yTerrain, + rotation: null, // Aucune rotation par défaut nom: `Stratégie ${numeroPointStrategie}`, couleur: "blue", numero: numeroPointStrategie++ @@ -414,6 +471,49 @@ function verifierAimantationEtCreerPoint() { function mouseReleased() { + if (rotationOption) // Verif si l'option de modif rotation activée + { + if (mouseButton === RIGHT && + (mouseX / echelleX) > 0 && + (mouseX / echelleX) < 2000 && + (3000 - (mouseY / echelleY)) > 0 && + (3000 - (mouseY / echelleY)) < 3000) // Verif si le clic droit est dans le terrain + { + let pointTrouve = false; + for (let point of pointsStrategie) { + let canvasX = point.y * echelleY; + let canvasY = (3000 - point.x) * echelleX; + if (dist(mouseX, mouseY, canvasX, canvasY) < 15) { + pointSelectionne = point; + pointTrouve = true; + break; // Un point est trouvé pour déplacement, arrêter la recherche + } + } + + if (pointTrouve) + { + inputRotation = prompt(`Entrer la rotation que va effectuer le robot au point (${pointSelectionne.x}, ${pointSelectionne.y})`); + + if (inputRotation === "null" || inputRotation === "" || inputRotation === null) + { + inputRotation = null; + pointSelectionne.rotation = inputRotation; + pointSelectionne.couleur = "blue"; + } + else if ((inputRotation / 360) < -1 || (inputRotation % 360) > 1) + { + inputRotation = abs(inputRotation - 360 * parseInt(inputRotation / 360)); + pointSelectionne.rotation = inputRotation; + pointSelectionne.couleur = "magenta"; + } + else + { + pointSelectionne.rotation = inputRotation; + pointSelectionne.couleur = "magenta"; + } + } + } + } pointSelectionne = null; // Réinitialiser le point sélectionné après le glissement } From 7e16ce0746aa4b0f670f55ade2c0246c17e4f785 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Tue, 4 Jun 2024 00:45:14 +0200 Subject: [PATCH 02/12] Strategy : fix color changing and undefined on POI --- docs/pages/strategy-2024/sketch.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 13631eb..148fec0 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -301,7 +301,7 @@ function drawPoint(point) { // Appliquer l'alignement et le décalage pour le nom et les coordonnées textAlign((mouseX < width / 2) ? LEFT : RIGHT, (mouseY < height / 2) ? BOTTOM : TOP); text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); - if (point.rotation !== null) + if (point.rotation !== null && point.rotation !== undefined) text(`(${point.x}, ${point.y}, ${point.rotation}°)`, canvasX + offsetX, canvasY + offsetY + 20); else text(`(${point.x}, ${point.y})`, canvasX + offsetX, canvasY + offsetY + 20); @@ -414,7 +414,10 @@ function mouseDragged() { // Si le point n'est pas aimanté, mettez à jour selon la position de la souris et remettez en bleu pointSelectionne.x = Math.round((3000 - (mouseY / echelleY))); pointSelectionne.y = Math.round(mouseX / echelleX); - pointSelectionne.couleur = "blue"; // La couleur originale des points de stratégie + if (pointSelectionne.rotation !== null) + pointSelectionne.couleur = "magenta"; // La couleur de la rotation + else + pointSelectionne.couleur = "blue"; // La couleur originale des points de stratégie // Restrictions des bords du terrain if (pointSelectionne.x < 0) From c85b31913888efa4aaf17bc536acea31fa261afc Mon Sep 17 00:00:00 2001 From: Robin864 Date: Tue, 4 Jun 2024 01:04:07 +0200 Subject: [PATCH 03/12] Strategy : calibrate 0 deg with North of Table Compass --- docs/pages/strategy-2024/sketch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 148fec0..f7aca1c 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -171,7 +171,7 @@ function drawRobot() { fill('rgba(10, 10, 10, 0.5)'); ellipse(canvasX, canvasY, 50, 50); - line(canvasX, canvasY, canvasX + 25 * cos(rotationActuelle), canvasY + 25 * sin(rotationActuelle)); + line(canvasX, canvasY, canvasX + 25 * cos(rotationActuelle-90), canvasY + 25 * sin(rotationActuelle-90)); if (etatRobot === 'lecture') { if (indexActuel < pointsStrategie.length - 1) { // Empêche l'incrémentation au-delà du dernier point From 362ca3c410e145602f3d733434a7897f1840d552 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Fri, 14 Jun 2024 22:34:04 +0200 Subject: [PATCH 04/12] Strategy : set robot scale to window size --- docs/Gemfile | 3 ++- docs/Gemfile.lock | 10 ++++++---- docs/pages/strategy-2024/sketch.js | 10 ++++------ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/Gemfile b/docs/Gemfile index 2d2242c..ba183b2 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -7,4 +7,5 @@ group :jekyll_plugins do gem 'jekyll-seo-tag' gem 'jekyll-include-cache' gem 'rake' -end \ No newline at end of file +end +gem "json", "~> 2.7" diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index bf681c9..5e7b489 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -46,6 +46,7 @@ GEM jekyll (>= 3.8, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) + json (2.7.2) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) @@ -66,10 +67,10 @@ GEM rouge (4.2.0) rubyzip (2.3.2) safe_yaml (1.0.5) - sass-embedded (1.71.1-x64-mingw-ucrt) - google-protobuf (~> 3.25) - sass-embedded (1.71.1-x86_64-linux-gnu) - google-protobuf (~> 3.25) + sass-embedded (1.69.5-x64-mingw-ucrt) + google-protobuf (~> 3.23) + sass-embedded (1.69.5-x86_64-linux-gnu) + google-protobuf (~> 3.23) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) unicode-display_width (2.5.0) @@ -84,6 +85,7 @@ DEPENDENCIES jekyll-include-cache jekyll-remote-theme jekyll-seo-tag + json (~> 2.7) rake BUNDLED WITH diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index f7aca1c..b5e99ea 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -162,6 +162,8 @@ function drawRobot() { let canvasX = lerp(pointActuel.y * echelleY, pointSuivant.y * echelleY, progression); let canvasY = lerp((3000 - pointActuel.x) * echelleX, (3000 - pointSuivant.x) * echelleX, progression); + let robotSize = height * (1/15); // Taille dynamique selon la taille du plateau + if (pointActuel.rotation !== null) { rotationActuelle = pointActuel.rotation; } @@ -169,9 +171,9 @@ function drawRobot() { stroke(255); // Couleur du contour strokeWeight(2); // Épaisseur du contour fill('rgba(10, 10, 10, 0.5)'); - ellipse(canvasX, canvasY, 50, 50); + ellipse(canvasX, canvasY, robotSize); - line(canvasX, canvasY, canvasX + 25 * cos(rotationActuelle-90), canvasY + 25 * sin(rotationActuelle-90)); + line(canvasX, canvasY, canvasX + robotSize/2 * cos(rotationActuelle-90), canvasY + robotSize/2 * sin(rotationActuelle-90)); if (etatRobot === 'lecture') { if (indexActuel < pointsStrategie.length - 1) { // Empêche l'incrémentation au-delà du dernier point @@ -181,10 +183,6 @@ function drawRobot() { } } - - - - function majDeleteOption() { deleteOption = cb_DeleteOption.checked(); } From 84166c96cd53aa0e595483d8d982276a9f13c18e Mon Sep 17 00:00:00 2001 From: Robin864 Date: Fri, 14 Jun 2024 23:10:53 +0200 Subject: [PATCH 05/12] Strategy : fix user input --- docs/pages/strategy-2024/sketch.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index b5e99ea..9d65e8c 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -299,8 +299,9 @@ function drawPoint(point) { // Appliquer l'alignement et le décalage pour le nom et les coordonnées textAlign((mouseX < width / 2) ? LEFT : RIGHT, (mouseY < height / 2) ? BOTTOM : TOP); text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); + if (point.rotation !== null && point.rotation !== undefined) - text(`(${point.x}, ${point.y}, ${point.rotation}°)`, canvasX + offsetX, canvasY + offsetY + 20); + text(`(${point.x}, ${point.y}, ${point.rotation.toFixed(2)}°)`, canvasX + offsetX, canvasY + offsetY + 20); else text(`(${point.x}, ${point.y})`, canvasX + offsetX, canvasY + offsetY + 20); @@ -493,7 +494,14 @@ function mouseReleased() { if (pointTrouve) { - inputRotation = prompt(`Entrer la rotation que va effectuer le robot au point (${pointSelectionne.x}, ${pointSelectionne.y})`); + var inputRotation = "thisisnotanumber"; + + while (inputRotation != "" && inputRotation != null && inputRotation != "null" && isNaN(inputRotation)) + { + inputRotation = prompt(`Entrer la rotation que va effectuer le robot au point (${pointSelectionne.x}, ${pointSelectionne.y})`); + if (inputRotation.includes(",")) + inputRotation = inputRotation.replace(",", "."); + } if (inputRotation === "null" || inputRotation === "" || inputRotation === null) { From c3fea23df431c406e35369f38d41df1bb02179d5 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Sat, 15 Jun 2024 00:16:24 +0200 Subject: [PATCH 06/12] Strategy : fix points names stacking --- docs/pages/strategy-2024/sketch.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 9d65e8c..41ad70e 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -284,6 +284,8 @@ function drawPoint(point) { } if (estProche) { + let isPOI = pois.find(poi => poi.x === point.x && poi.y === point.y); + let isUserPoint = pointsStrategie.find(userPoint => userPoint.x === point.x && userPoint.y === point.y); textSize(20); fill(0); // Couleur du texte stroke(255); // Contour du texte pour améliorer la lisibilité @@ -298,7 +300,14 @@ function drawPoint(point) { // Appliquer l'alignement et le décalage pour le nom et les coordonnées textAlign((mouseX < width / 2) ? LEFT : RIGHT, (mouseY < height / 2) ? BOTTOM : TOP); - text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); + if ( + (point.numero !== undefined && isPOI !== undefined && isUserPoint !== undefined) || + (point.numero !== undefined && isPOI === undefined && isUserPoint !== undefined) || + (point.numero === undefined && isPOI !== undefined && isUserPoint === undefined) + ) + { + text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); + } if (point.rotation !== null && point.rotation !== undefined) text(`(${point.x}, ${point.y}, ${point.rotation.toFixed(2)}°)`, canvasX + offsetX, canvasY + offsetY + 20); From 099cb00e30662d393c6dca1d261cf67b84f65fe9 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Sat, 15 Jun 2024 00:20:43 +0200 Subject: [PATCH 07/12] Strategy : fix rotation display on POI --- docs/pages/strategy-2024/sketch.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 41ad70e..cc294a3 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -307,13 +307,12 @@ function drawPoint(point) { ) { text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); + if (point.rotation !== null && point.rotation !== undefined) + text(`(${point.x}, ${point.y}, ${point.rotation.toFixed(2)}°)`, canvasX + offsetX, canvasY + offsetY + 20); + else + text(`(${point.x}, ${point.y})`, canvasX + offsetX, canvasY + offsetY + 20); } - if (point.rotation !== null && point.rotation !== undefined) - text(`(${point.x}, ${point.y}, ${point.rotation.toFixed(2)}°)`, canvasX + offsetX, canvasY + offsetY + 20); - else - text(`(${point.x}, ${point.y})`, canvasX + offsetX, canvasY + offsetY + 20); - // Réinitialisez le contour pour les autres éléments à dessiner après le texte noStroke(); } From 6c1363c120e55a25c070fadda4eac822dcf449b4 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Sat, 15 Jun 2024 00:26:18 +0200 Subject: [PATCH 08/12] Strategy : fix syntax error --- docs/pages/strategy-2024/sketch.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index cc294a3..70061a8 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -300,11 +300,7 @@ function drawPoint(point) { // Appliquer l'alignement et le décalage pour le nom et les coordonnées textAlign((mouseX < width / 2) ? LEFT : RIGHT, (mouseY < height / 2) ? BOTTOM : TOP); - if ( - (point.numero !== undefined && isPOI !== undefined && isUserPoint !== undefined) || - (point.numero !== undefined && isPOI === undefined && isUserPoint !== undefined) || - (point.numero === undefined && isPOI !== undefined && isUserPoint === undefined) - ) + if ((point.numero !== undefined && isPOI !== undefined && isUserPoint !== undefined) || (point.numero !== undefined && isPOI === undefined && isUserPoint !== undefined) || (point.numero === undefined && isPOI !== undefined && isUserPoint === undefined)) { text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); if (point.rotation !== null && point.rotation !== undefined) From 23608092235ccfcb84dcf8382dcb57bbff1c10a9 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Sat, 15 Jun 2024 01:06:41 +0200 Subject: [PATCH 09/12] Strategy : alert collision --- docs/pages/strategy-2024/sketch.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 70061a8..45099ff 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -8,6 +8,8 @@ let cb_DeleteOption; let deleteOption = false; let cb_Rotation; let rotationOption = false; +let cb_Alert; +let alertOption = false; let etatRobot = 'arrêté'; // Peut être 'lecture', 'pause', ou 'arrêté' let positionRobot = 0; // Indice du point de stratégie actuel let vitesseRobot = 1; // Vitesse de déplacement entre les points (modifiable par un curseur) @@ -87,6 +89,11 @@ function setupUI() { cb_Rotation.changed(majRotationOption); cb_Rotation.class('form-check-label'); + cb_Alert = createCheckbox(" Alerte collision mur", alertOption); + cb_Alert.parent('checkboxContainer'); + cb_Alert.changed(majAlertOption); + cb_Alert.class('form-check-label'); + // Initialisation des boutons avec style Bootstrap let btnClear = createButton("Clear Stratégie"); btnClear.parent('buttonsContainer'); @@ -162,7 +169,7 @@ function drawRobot() { let canvasX = lerp(pointActuel.y * echelleY, pointSuivant.y * echelleY, progression); let canvasY = lerp((3000 - pointActuel.x) * echelleX, (3000 - pointSuivant.x) * echelleX, progression); - let robotSize = height * (1/15); // Taille dynamique selon la taille du plateau + let robotSize = 130 * (height/2000); // Taille dynamique selon la taille du plateau if (pointActuel.rotation !== null) { rotationActuelle = pointActuel.rotation; @@ -195,6 +202,10 @@ function majRotationOption() { rotationOption = cb_Rotation.checked(); } +function majAlertOption() { + alertOption = cb_Alert.checked(); +} + function drawPOI() { if (afficherPOI) { drawList(pois); @@ -442,10 +453,16 @@ function mouseDragged() { function verifierAimantationEtCreerPoint() { let aimante = false; + let robotSize = 130*2 * (height/2000); // Taille dynamique selon la taille du plateau for (let poi of pois) { let canvasX = poi.y * echelleY; let canvasY = (3000 - poi.x) * echelleX; + if (dist(mouseX, mouseY, canvasX, canvasY) < 15) { + + if (alertOption && (poi.x - robotSize < 0 || poi.x + robotSize > 3000 || poi.y - robotSize < 0 || poi.y + robotSize > 2000)) + alert("Le point proche du bord du terrain, le robot risque une collision avec le mur"); + pointsStrategie.push({ x: poi.x, y: poi.y, @@ -464,6 +481,9 @@ function verifierAimantationEtCreerPoint() { let xTerrain = Math.round((3000 - (mouseY / echelleY))); let yTerrain = Math.round(mouseX / echelleX); + if (alertOption && (xTerrain - robotSize < 0 || xTerrain + robotSize > 3000 || yTerrain - robotSize < 0 || yTerrain + robotSize > 2000)) + alert("Le point proche du bord du terrain, le robot risque une collision avec le mur"); + pointsStrategie.push({ x: xTerrain, y: yTerrain, From 52d7a6cf51781678f8897f9324f3c32df84a68a9 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Fri, 2 Aug 2024 17:59:36 +0200 Subject: [PATCH 10/12] Strategy : fix point name after delete --- docs/pages/strategy-2024/sketch.js | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 45099ff..dbc6f77 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -405,6 +405,7 @@ function renumeroterPoints() { numeroPointStrategie = 1; for (let point of pointsStrategie) { point.numero = numeroPointStrategie++; + point.nom = `Stratégie ${point.numero}`; } } From 6af8c18fd304de219a17de5f81a8928b2c09df68 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Sat, 3 Aug 2024 13:21:11 +0200 Subject: [PATCH 11/12] Strategy : fix reinit robot position when lecture is paused --- docs/pages/strategy-2024/sketch.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index dbc6f77..1f36fb5 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -129,9 +129,6 @@ function setupUI() { btnLecture.parent('robotContainer'); btnLecture.class('btn btn-light mr-2'); btnLecture.mousePressed(() => { - if (etatRobot !== 'lecture') { // Si le robot n'est pas déjà en lecture, réinitialisez sa position - positionRobot = 0; - } etatRobot = 'lecture'; }); From 99f47bd63485abe996245516f844796388647967 Mon Sep 17 00:00:00 2001 From: Robin864 Date: Fri, 15 Nov 2024 20:59:18 +0100 Subject: [PATCH 12/12] Strategy : translate JSON relative variables --- docs/Gemfile | 1 + docs/Gemfile.lock | 4 +++ docs/pages/strategy-2024/sketch.js | 50 +++++++++++++++--------------- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/docs/Gemfile b/docs/Gemfile index ba183b2..ada03f3 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -9,3 +9,4 @@ group :jekyll_plugins do gem 'rake' end gem "json", "~> 2.7" +gem "erb" diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 5e7b489..8ad5eee 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -3,11 +3,14 @@ GEM specs: addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) + cgi (0.4.1) colorator (1.1.0) concurrent-ruby (1.2.3) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) + erb (4.0.4) + cgi (>= 0.3.3) eventmachine (1.2.7) ffi (1.16.3) ffi (1.16.3-x64-mingw-ucrt) @@ -81,6 +84,7 @@ PLATFORMS x86_64-linux DEPENDENCIES + erb jekyll (~> 4.0) jekyll-include-cache jekyll-remote-theme diff --git a/docs/pages/strategy-2024/sketch.js b/docs/pages/strategy-2024/sketch.js index 1f36fb5..b26dc36 100644 --- a/docs/pages/strategy-2024/sketch.js +++ b/docs/pages/strategy-2024/sketch.js @@ -278,17 +278,17 @@ function drawPoint(point) { noStroke(); } - fill(point.couleur); + fill(point.color); ellipse(canvasX, canvasY, taillePoint, taillePoint); // Réinitialiser le contour pour le texte et autres éléments noStroke(); // Afficher le numéro au centre du point, si disponible - if (point.numero !== undefined) { + if (point.number !== undefined) { fill(255); // Couleur du numéro textAlign(CENTER, CENTER); - text(point.numero, canvasX, canvasY); + text(point.number, canvasX, canvasY); } if (estProche) { @@ -308,9 +308,9 @@ function drawPoint(point) { // Appliquer l'alignement et le décalage pour le nom et les coordonnées textAlign((mouseX < width / 2) ? LEFT : RIGHT, (mouseY < height / 2) ? BOTTOM : TOP); - if ((point.numero !== undefined && isPOI !== undefined && isUserPoint !== undefined) || (point.numero !== undefined && isPOI === undefined && isUserPoint !== undefined) || (point.numero === undefined && isPOI !== undefined && isUserPoint === undefined)) + if ((point.number !== undefined && isPOI !== undefined && isUserPoint !== undefined) || (point.number !== undefined && isPOI === undefined && isUserPoint !== undefined) || (point.number === undefined && isPOI !== undefined && isUserPoint === undefined)) { - text(`${point.nom}`, canvasX + offsetX, canvasY + offsetY); + text(`${point.name}`, canvasX + offsetX, canvasY + offsetY); if (point.rotation !== null && point.rotation !== undefined) text(`(${point.x}, ${point.y}, ${point.rotation.toFixed(2)}°)`, canvasX + offsetX, canvasY + offsetY + 20); else @@ -354,8 +354,8 @@ function extractPOIs() { const name = match[1]; const x = parseInt(match[2], 10); const y = parseInt(match[3], 10); - const numero = undefined; // ou un numéro spécifique si disponible - pois.push({ nom: name, x: x, y: y, couleur: "red", numero: numero }); + const number = undefined; // ou un numéro spécifique si disponible + pois.push({ name: name, x: x, y: y, color: "red", number: number }); } }); } @@ -401,8 +401,8 @@ function mousePressed() { function renumeroterPoints() { numeroPointStrategie = 1; for (let point of pointsStrategie) { - point.numero = numeroPointStrategie++; - point.nom = `Stratégie ${point.numero}`; + point.number = numeroPointStrategie++; + point.name = `Stratégie ${point.number}`; } } @@ -416,7 +416,7 @@ function mouseDragged() { // Si proche d'un POI, aimantez le point pointSelectionne.x = poi.x; pointSelectionne.y = poi.y; - pointSelectionne.couleur = "green"; // Changez la couleur pour indiquer l'aimantation + pointSelectionne.color = "green"; // Changez la couleur pour indiquer l'aimantation aimante = true; break; } @@ -427,9 +427,9 @@ function mouseDragged() { pointSelectionne.x = Math.round((3000 - (mouseY / echelleY))); pointSelectionne.y = Math.round(mouseX / echelleX); if (pointSelectionne.rotation !== null) - pointSelectionne.couleur = "magenta"; // La couleur de la rotation + pointSelectionne.color = "magenta"; // La couleur de la rotation else - pointSelectionne.couleur = "blue"; // La couleur originale des points de stratégie + pointSelectionne.color = "blue"; // La couleur originale des points de stratégie // Restrictions des bords du terrain if (pointSelectionne.x < 0) @@ -465,9 +465,9 @@ function verifierAimantationEtCreerPoint() { x: poi.x, y: poi.y, rotation: null, // Aucune rotation par défaut - nom: `Stratégie ${numeroPointStrategie}`, - couleur: "green", - numero: numeroPointStrategie++ + name: `Stratégie ${numeroPointStrategie}`, + color: "green", + number: numeroPointStrategie++ }); aimante = true; break; @@ -486,9 +486,9 @@ function verifierAimantationEtCreerPoint() { x: xTerrain, y: yTerrain, rotation: null, // Aucune rotation par défaut - nom: `Stratégie ${numeroPointStrategie}`, - couleur: "blue", - numero: numeroPointStrategie++ + name: `Stratégie ${numeroPointStrategie}`, + color: "blue", + number: numeroPointStrategie++ }); } } @@ -529,18 +529,18 @@ function mouseReleased() { { inputRotation = null; pointSelectionne.rotation = inputRotation; - pointSelectionne.couleur = "blue"; + pointSelectionne.color = "blue"; } else if ((inputRotation / 360) < -1 || (inputRotation % 360) > 1) { inputRotation = abs(inputRotation - 360 * parseInt(inputRotation / 360)); pointSelectionne.rotation = inputRotation; - pointSelectionne.couleur = "magenta"; + pointSelectionne.color = "magenta"; } else { pointSelectionne.rotation = inputRotation; - pointSelectionne.couleur = "magenta"; + pointSelectionne.color = "magenta"; } } } @@ -562,7 +562,7 @@ function loadStrategie() { if (strategie) { pointsStrategie = JSON.parse(strategie); // Assurez-vous que le numéro suit correctement le dernier point ajouté - numeroPointStrategie = pointsStrategie.length ? pointsStrategie[pointsStrategie.length - 1].numero + 1 : 1; + numeroPointStrategie = pointsStrategie.length ? pointsStrategie[pointsStrategie.length - 1].number + 1 : 1; } } @@ -585,7 +585,7 @@ function handleFile(file) { try { let contents = e.target.result; pointsStrategie = JSON.parse(contents); - numeroPointStrategie = pointsStrategie.length ? pointsStrategie[pointsStrategie.length - 1].numero + 1 : 1; + numeroPointStrategie = pointsStrategie.length ? pointsStrategie[pointsStrategie.length - 1].number + 1 : 1; redraw(); // Force le redessinage pour afficher les points importés } catch (error) { console.error("Erreur lors du parsing du fichier JSON : ", error); @@ -605,10 +605,10 @@ function exporterCPP() { let correspondancePOI = pois.find(poi => poi.x === point.x && poi.y === point.y); if (correspondancePOI) { // Utiliser le nom du POI s'il y a correspondance - contenuCPP += ` motion.go(POI::${correspondancePOI.nom}); // Numero ${point.numero}\n`; + contenuCPP += ` motion.go(POI::${correspondancePOI.name}); // Numero ${point.number}\n`; } else { // Sinon, utiliser les coordonnées x et y - contenuCPP += ` motion.go(${point.x},${point.y}); // Numero ${point.numero}\n`; + contenuCPP += ` motion.go(${point.x},${point.y}); // Numero ${point.number}\n`; } }); contenuCPP += "}\n";