IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Recherche de l'élément le plus proche


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 27
    Points : 32
    Points
    32
    Par défaut Recherche de l'élément le plus proche
    Bonsoir, j'ai un problème sur un algorithme de recherche d'élèment le plus proche. Voici tout de suite le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function rechercheTourProche(){
    	var coordonnees = [];
    	var minimum;
    	var xT = [];
    	var yT = [];
    	for (var i = 0; i < ensembleTour.length; i++){
    		xT.push(ensembleTour[i].offsetLeft);
    		yT.push(ensembleTour[i].offsetTop);
    	}
    	var xM = [];
    	var yM = [];
    	for (var i = 0; i < ensembleTour.length; i++){
    		xM.push(ensembleMob[i].offsetLeft);
    		yM.push(ensembleMob[i].offsetTop);
    	}
    	for (t = 0, m =0; t < ensembleTour.length && m < ensembleMob.length; m++,i++){
    		coordonnees = Math.sqrt(((xT[t]-xM[m])*(xT[t]-xM[m]))+((yT[t]-yM[m])*(yT[t]-yM[m]))); //un peu laborieux mais je voulais pas faire de connerie avec le Math.pow
    	}
    	for (var i =0; i < coordonnees.length; i++){
    		minimum = Math.min(coordonnees[i]);
    	}
    	alert(coordonnees);
    }
    Le console.log me renvoie ici NaN.

    Ici le problème est, je pense, l'incrémentation à chaque tour de variable. Au début de l'algorithme, je stock dans xT, xY les coordonnées de chaque tour, et dans xM et yM les coordonnées de chaque mob, dans des tableaux.

    C'est ensuite ici que le problème est je pense, je veux calculer la distance séparant chaque mob de chaque tour. Ensemble si il y a 4 mobs et 3 tours, je veux que le mob compares la distance entre les différents tours pour savoir laquelle est la plus proche. Le problème est je pense dans la boucle for, en effet à chaque passage de boucle, j'incrémente ma tour +1 et mon mob +1, sauf que si il y a plus de mob que de tour, la boucle for ne fonctionne plus, puisque le tableau ensembleTour.length()+1 n'existe pas.

    Si quelqu'un pouvait m'éclairir sur le problème.

    Merci beaucoup bonne soirée

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Il y a beaucoup de choses qui rendent difficiles de te répondre efficacement...
    Tu parcoures des tableaux (ensembleTour et ensembleMob) dont on ne sait pas d'où ils sortent (et donc pas ce qu'ils contiennent), tu déclares un tableau ensembleTour, mais tu lui affectes une valeur numérique (coordonnees = Math.sqrt(...)) et pour finir, tu demandes la plus petite valeur d'une seule valeur (Math.min(coordonnees[i])) !
    Heureusement que tu ne rentreras jamais dans cette dernière boucle d'ailleurs, vu qu'un nombre ne possède pas de propriété length.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 27
    Points : 32
    Points
    32
    Par défaut
    Oui c'est vrai désolé j'ai oublié de préciser certaines choses, ensembleMob est un tableau ou sont stocker 10 divs crée dynamiquement avec une fonction et placé sur un gros div 600 sur 600. C'est pareil pour ensembleTour, je dispose d'un bouton qui place des tours aléatoirement dans un gros div de 600 sur 600 lorsqu'on l'on appuie dessus.

    Pour ce qui est du tableau coordonnees, je voulais créer un tableau coordonné ou toute les coordonnées des distances tour/mob sont stocké. Et la boucle finale, avec le minimum, je voulais parcourir le tableau pour trouver justement le minimum.

    J'espère que ces informations t'aideront, si besoin je peux t'envoyer le reste du code.

    Le but finale de cette algorithme est donc de cherche pour l'ensembleMob[x] la tour la plus proche, pour qu'il s'y dirige. L'algorithme d'animation est déjà réalisé, mais pas pour la tour la plus proche. L'ensemble des mobs se dirige sur ensembleTour[0].

    Ps: Désolé pour mon faible niveau.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 27
    Points : 32
    Points
    32
    Par défaut
    Chalut ! Bon voila j'ai résolu le problème, si jamais ça peut servir à certaines personnes je met le code, et si par ailleurs vous avez des suggestions pour l'optimiser je prends

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    var vx = 1;
    var vy = 1;
    var timer1;
    var ensembleMob = document.getElementsByClassName("monstre");
    var ensembleTour = document.getElementsByClassName("tour");
    window.onload = function(){
        var debut = document.getElementById("start");
        var arret = document.getElementById("stop");
        var blocCentrale = document.getElementById("blocCentrale");
        var tour = document.getElementById("tour");
        debut.addEventListener("click", debutPartie);
        arret.addEventListener("click", pause);
        tour.addEventListener("click", generationTour);
        generationMob();
        ensembleMob[0].style.backgroundColor = "purple";
        ensembleMob[1].style.backgroundColor = "blue";
    }
    function generationMob(){
        for(i = 0; i < 20; i++){
            creationPositionnementMob();
        }
    }
    function generationTour(){
        creationPositionnementTour();
    }
    function creationPositionnementTour(){
        var tourCree = document.createElement("div");
        tourCree.className = "tour";
        tourCree.style.width = "5px";
        tourCree.style.height = "5px";
        tourCree.style.backgroundColor = "green";
        tourCree.style.position = "absolute";
        tourCree.style.top = Math.floor(Math.random() * 595) + "px";
        tourCree.style.left = Math.floor(Math.random() * 595) + "px";
        blocCentrale.appendChild(tourCree);
    }
    function creationPositionnementMob(){
        var mobCree = document.createElement("div");
        mobCree.className = "monstre";
        mobCree.style.width = "5px";
        mobCree.style.height = "5px";
        mobCree.style.backgroundColor = "red";
        mobCree.style.position = "absolute";
        var mobCreeHauteur = mobCree.style.top = Math.floor(Math.random() * 595) + "px";
        var mobCreeLargeur = mobCree.style.left = Math.floor(Math.random() * 595) + "px";
        var aleatoirePosition = Math.floor((Math.random() * 4) + 1);
        if(aleatoirePosition == 1){
            if(mobCreeHauteur != 0){
                mobCree.style.left = "0" + "px";
            }
        }
        if(aleatoirePosition == 2){
            if(mobCreeLargeur != 0){
                mobCree.style.top = "0" + "px";
            }
        }
        if(aleatoirePosition == 3){
            if(mobCreeHauteur != 0){
                mobCree.style.left = "595" + "px";
            }
        }
        if(aleatoirePosition == 4){
            if(mobCreeLargeur != 0){
                mobCree.style.top = "595" + "px";
            }
        }
        blocCentrale.appendChild(mobCree);
    }
    function debutPartie(){
        clearInterval(timer1);
        timer1 = setInterval(animation, 30);
    }
    function pause(){
        clearInterval(timer1);
    }
    function animation(){
        var cibleTour = rechercheTourProcheChaqueMob();
        for(var i = 0; i < ensembleMob.length; i++){
            if(ensembleMob[i].offsetTop < ensembleTour[cibleTour[i]].offsetTop){
                ensembleMob[i].style.top = ensembleMob[i].offsetTop + vy + "px";
            }
            if(ensembleMob[i].offsetTop > ensembleTour[cibleTour[i]].offsetTop){
                ensembleMob[i].style.top = ensembleMob[i].offsetTop - vy + "px";
            }
            if(ensembleMob[i].offsetLeft < ensembleTour[cibleTour[i]].offsetLeft){
                ensembleMob[i].style.left = ensembleMob[i].offsetLeft + vx + "px";
            }
            if(ensembleMob[i].offsetLeft > ensembleTour[cibleTour[i]].offsetLeft){
                ensembleMob[i].style.left = ensembleMob[i].offsetLeft - vx + "px";
            }
        }
    }
    function rechercheTourProcheChaqueMob(){
        var tableauIndexMob = [];
        for(var i = 0; i < ensembleMob.length; i++){
            tableauIndexMob.push(rechercheTourProche(i));
        }
        return tableauIndexMob;
    }
    function rechercheTourProche(indexMob){
        var distances = [];
        var indexTourProche;
        var xT = [];
        var yT = [];
        for(var i = 0; i < ensembleTour.length; i++){
            xT.push(ensembleTour[i].offsetLeft);
            yT.push(ensembleTour[i].offsetTop);
        }
        var xM = [];
        var yM = [];
        for(var i = 0; i < ensembleMob.length; i++){
            xM.push(ensembleMob[i].offsetLeft);
            yM.push(ensembleMob[i].offsetTop);
        }
        for(var i = 0; i < ensembleTour.length; i++){
            distances.push(Math.floor(Math.sqrt(((xM[indexMob] - xT[i]) * (xM[indexMob] - xT[i])) + ((yM[indexMob] - yT[i]) * (yM[indexMob] - yT[i])))));
        }
        var minimum = distances[0];
        indexTourProche = 0
        for(var i = 1; i < distances.length; i++){
            if(distances[i] < minimum){
                minimum = distances[i];
                indexTourProche = i;
            }
        }
        return indexTourProche;
    }
    Merci bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] MACRO pour rechercher les 2 valeurs les plus proches
    Par Tchibe dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/06/2010, 15h04
  2. recherche de la valeur la plus proche
    Par chadi18 dans le forum SAS Base
    Réponses: 19
    Dernier message: 20/01/2010, 11h04
  3. [Complexité] recherche des n points les plus proches d'un point dans une liste
    Par Benoit_T dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 20/06/2009, 15h55
  4. [DEBUTANT]recherche de date - heure la plus proche
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/06/2007, 12h15
  5. Réponses: 10
    Dernier message: 06/03/2007, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo