diff --git a/algo.js b/algo.js new file mode 100644 index 0000000..8216873 --- /dev/null +++ b/algo.js @@ -0,0 +1,169 @@ +const Orientation = Object.freeze({ + HAUT: Symbol("haut"), + BAS: Symbol("bas"), + GAUCHE: Symbol("gauche"), + DROITE: Symbol("droite") +}); + + +class Noeud { + coordX; + coordY; + chemins; + + constructor(coordX, coordY){ + this.coordX = coordX; + this.coordY = coordY; + chemins = new Array(); + } + + addCheminPossible(chemin){ + this.chemins.push(chemin) + } + + getCheminsPossibles(){ + return this.chemins + } +} + + +class ModeAutomatique { + + cheminsPossibles = new Array(); // liste des listes de noeuds + noeudsVisites = new Array(); + + // valeurs pour la première position + posX=0; + posY=0; + rotation=HAUT; + + run(){ + // TODO while find + this.analyseEnvironnement(); // met à jour ses connaissances (à dessiner au fur et à mesure ?) + this.move(); // récupère un chemin non encore parcourus en fonction de ses connaissances + } + + //////////////////////////////////////// ANALYSE ENVIRONNEMENT + + analyseEnvironnement(){ + currentNode = getCaseAnalysee(); + + // SI case déjà visitée, alors on connait ses obstacles + if (currentNode == null) { + + // pour les 4 directions possibles + for (let i = 0; i < 4; i++) { + if (!isObstacleDevant(currentNode, rotation)){ + addCheminPossible(currentNode); + } + tourne(); // changement de l'angle de 90 degrés + } + this.noeudsVisites.push(currentNode); + } + } + + isObstacleDevant(){ + // TODO + return true; + } + + tourne(){ + if(this.rotation = Orientation.HAUT){ + // TODO tourne + this.rotation = Orientation.GAUCHE; + } else if(this.rotation = Orientation.BAS){ + // TODO tourne + this.rotation = Orientation.GAUCHE; + }else if(this.rotation = Orientation.BAS){ + // TODO tourne + this.rotation = Orientation.DROITE; + }else if(this.rotation = Orientation.DROITE){ + // TODO tourne + this.rotation = Orientation.HAUT; + } + } + + addCheminPossible(){ + chemin = new Array(); + if(this.rotation = Orientation.HAUT){ + chemin.push(new Noeud(posX+1, posY)); + } else if(this.rotation = Orientation.BAS){ + chemin.push(new Noeud(posX-1, posY)); + }else if(this.rotation = Orientation.GAUCHE){ + chemin.push(new Noeud(posX, posY-1)); + }else if(this.rotation = Orientation.DROITE){ + chemin.push(new Noeud(posX, posY+1)); + } + this.cheminsPossibles.push(chemin); + } + + //////////////////////////////////////// MOVE + + move(){ + // on choisi le prochain noeud + nextNode = getNextNode(); + // on met à jour la liste des chemins en ajoutant le noeud courant dans les chemins non choisis + updatePaths(nextNode); + // on met à jour les coordonnées + this.updateCoordonnees(nextNode); + // move + this.move(nextNode); + } + + // parcours en profondeur : il s'agit de LIFOs + getNextNode(){ + if (this.cheminsPossibles[this.cheminsPossibles.length - 1] > 0) { + // on récupère la dernière liste + cheminChoisi = this.cheminsPossibles[this.cheminsPossibles.length - 1]; + // on récupère le dernier élément de cette liste + nodeChoisi = cheminChoisi[cheminChoisi.length - 1]; + // on créé un nouveau noeud + return new Noeud(nodeChoisi.posX, nodeChoisi.posY); + } + return null; + } + + updatePaths(nextNode){ + nextNode = this.getCaseAnalysee(); + // on ajoute le noeud visité à toutes les listes sauf la dernière + for (let i=0; i < this.cheminsPossibles -1; i++){ + cheminPossible = this.cheminsPossibles[i]; + if (nextNode == null){ + // on ajoute le noeud en cours à la liste des noeuds visités + cheminPossible.push(nextNode); + } else { + // on vire le noeud visité de toutes les listes s'il a déjà été visité avant (on fait demi tour) + cheminPossible.pop(); + } + } + + // on supprime les listes vides + cheminsPossibles = cheminsPossibles.filter(function (el) { + return el.length > 0; + }); + } + + updateCoordonnees() { + if(this.rotation = Orientation.HAUT){ + this.posX++; + } else if(this.rotation = Orientation.BAS){ + this.posX--; + }else if(this.rotation = Orientation.GAUCHE){ + this.posY--; + }else if(this.rotation = Orientation.DROITE){ + this.pos++; + } + } + + /////////////////////////////////////// GETTERS + + getCaseAnalysee(){ + noeudsVisites.forEach((noeud) => { + if (noeud.posX == this.posX && noeud.posY == this.posY){ + return noeud; + } + }); + return null; + } +} + diff --git a/ui/bootstrap-5.3.3-dist/css/bootstrap.css b/ui/bootstrap-5.3.3-dist/css/bootstrap.css index b7ab57f..0cc4521 100644 --- a/ui/bootstrap-5.3.3-dist/css/bootstrap.css +++ b/ui/bootstrap-5.3.3-dist/css/bootstrap.css @@ -2454,7 +2454,8 @@ textarea.form-control-lg { } .form-switch .form-check-input { --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); - width: 2em; + width: 4em; + height: 2em; margin-left: -2.5em; background-image: var(--bs-form-switch-bg); background-position: left center; @@ -12054,4 +12055,67 @@ textarea.form-control-lg { } } -/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file +/*# sourceMappingURL=bootstrap.css.map */ + + /* The switch - the box around the slider */ + .switch { + position: relative; + display: inline-block; + width: 60px; + height: 34px; +} + +/* Hide default HTML checkbox */ +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +/* The slider */ +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #2196F3; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} \ No newline at end of file diff --git a/ui/index.html b/ui/index.html index e9abe6f..039418b 100644 --- a/ui/index.html +++ b/ui/index.html @@ -27,7 +27,11 @@

Automatique

- +
+ + +
+ \ No newline at end of file