Forums Développement Multimédia

Aller au contenu

Nouveau tuto Pathfinding A*

CODE

29 réponses à ce sujet

#1 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 08 January 2010 - 18:42 PM

Bonjour à tous, j'ai profité d'un temps mort aujourd'hui pour ouvrir une section "jeux" sur le wiki.
J'ai également rédigé un premier tuto que vous pouvez voir ici -> Explication de l'algorithme de pathfinding A*.

[edit] La suite du tutoriel, qui présente l'implémentation en Actionscript 3, est disponible ici Explication de l'algorithme de pathfinding A* - la pratique

J'aimerai votre avis et également savoir si quelqu'un sait comment je peux le porter facilement dans la partie rédiger vos tutoriaux sans devoir retaper toute la mise en page :D.

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7013 messages

Posté 08 January 2010 - 19:08 PM

Salut,

Va falloir qu'on se cause pour se coordonner et éviter de bosser en paralléle sur certains trucs, je suis également en cours de rédaction de tutos sur le jeu (en ce moment c'est Raycasting ici : http://ressources.me...e/3d/raycasting et je passerait sans doute à Mode 7 et Voxels, mode 7 prévu pour ce weekend normalement) Je fini le tuto ce soir.

Faudra aussi penser à lier les sujets qui ont un intérêt entre eux, par exemple ton tuto sur le A* va surement me servir dans la suite du tuto du raycasting pour le test du raycaster lorsque je vais aborder les sprites et la gestion des ennemis, çà serait idiot de faire plusieurs fois la même définition.

#3 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 08 January 2010 - 20:15 PM

Ok pas de problèmes, moi je comptes faire un tuto pour l'implémentation de A* just derrière, ensuite je comptes enchaîner sur l'isométrie ou sur AMFPHP ou l'algorithme min_max et son implémenation alpha-bêta ( pour les jeux d'échecs ).

Rien de préveu pour toi de ce côté ?

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7013 messages

Posté 08 January 2010 - 20:40 PM

Non pas de problème c'est même complémentaire. :smile:

#5 lazrie

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 242 messages

Posté 08 January 2010 - 23:43 PM

Bonsoir :),

Merci Monsieur_Spi, je viens d'apprendre quelque choses.Je connaissais pas du tout le voxels! Mais c'est pas un peu lourd pour du Flash (enfin bon d'après ce que j'ai pue voir sur Internet)?

Bonne soirée,

#6 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 09 January 2010 - 15:34 PM

Voir le messageThoutmosis, le 08 January 2010 - 18:42 PM, dit :

Bonjour à tous, j'ai profité d'un temps mort aujourd'hui pour ouvrir une section "jeux" sur le wiki.

Bonjour,
Très bonne initiative à mon avis, en plus tu as bien compris comment faire, alors qu'il n'y a pour l'instant aucune documentation sur le sujet. Bravo.

Voir le messageThoutmosis, le 08 January 2010 - 18:42 PM, dit :

J'ai également rédigé un premier tuto que vous pouvez voir ici -> Explication de l'algorithme de pathfinding A*.
Très chouette de pouvoir disposer de cet algorithme.
Après t'avoir lu j'ai l'impression que j'aurais tous les éléments pour l'implémenter.
Mais pour le comprendre , comme tu le dis en conclusion, j'aurais du boulot de cogitation. Ça ne m'a pas sauté au yeux comment ça fonctionne. Pour ma part, je crois que quelques clés supplémentaires m'y aiderait. C'est cette histoire de liste ouverte et de liste fermée qui ne m'apparait pas clairement.
Mais bon, je le redis, je crois que tu as suffisamment bien décrit la chose pour permettre de passer à la programmation, et c'est déjà beaucoup.
(A quand l'exemple pratique :) ? )

Sinon j'ai bien apprécié les notes sur qualité et complexité.

Merci pour ce boulot.

[EDIT]

Voir le messageThoutmosis, le 08 January 2010 - 18:42 PM, dit :

J'aimerai votre avis et également savoir si quelqu'un sait comment je peux le porter facilement dans la partie rédiger vos tutoriaux sans devoir retaper toute la mise en page :D.
Pas la peine de le porter sur le forum. Tu peux simplement l'annoncer dans la salle "Rédigez vos tutoriaux": un petit résumé, le lien vers le tuto, et le lien vers ce topic ci, en précisant que c'est ici que se dérouleront les discussions à ce sujet.
(pour la compensation on ne demandera plus que le tuto soit aussi sur le forum)

#7 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 10 January 2010 - 21:28 PM

Voir le messageThoutmosis, le 08 January 2010 - 18:42 PM, dit :

Bonjour à tous, j'ai profité d'un temps mort aujourd'hui pour ouvrir une section "jeux" sur le wiki.
J'ai également rédigé un premier tuto que vous pouvez voir ici -> Explication de l'algorithme de pathfinding A*.

J'aimerai votre avis et également savoir si quelqu'un sait comment je peux le porter facilement dans la partie rédiger vos tutoriaux sans devoir retaper toute la mise en page :D.

Rebonjour tout le monde, voilà c'est fait vous pouvez consulter le tuto sur l'implémentation de l'algo ici ->> Explication de l'algorithme de pathfinding A* - la pratique.

#8 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 13 January 2010 - 16:27 PM

Voir le messageThoutmosis, le 10 January 2010 - 21:28 PM, dit :

Rebonjour tout le monde, voilà c'est fait vous pouvez consulter le tuto sur l'implémentation de l'algo ici ->> Explication de l'algorithme de pathfinding A* - la pratique.

Salut Thoutmosis,
C'est chouette, enfin, je pense... il y a des erreurs à la compilation.

#9 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 13 January 2010 - 16:33 PM

Voir le messagelilive, le 13 January 2010 - 16:27 PM, dit :

Salut Thoutmosis,
C'est chouette, enfin, je pense... il y a des erreurs à la compilation.

Ah bonn ? Mince alors je vais le re-tester et corriger :), sinon tu as compris le principe ?

#10 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 13 January 2010 - 16:38 PM

Voir le messageThoutmosis, le 13 January 2010 - 16:33 PM, dit :

Ah bonn ? Mince alors je vais le re-tester et corriger :)

Ok je retesterais ensuite :)

Voir le messageThoutmosis, le 13 January 2010 - 16:33 PM, dit :

sinon tu as compris le principe ?

J'ai pas essayé ;)
Le tuto me semble plus porter sur:
- la présentation d'un algorithme résolvant un problème de pathfinding, et les raisons d'adopter ou pas cet algorithme
- l'implémentation de cet algorithme
Que l'explication de la conception de l'algorihme lui-même.

#11 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 13 January 2010 - 17:00 PM

Voir le messagelilive, le 13 January 2010 - 16:38 PM, dit :

Ok je retesterais ensuite :)



J'ai pas essayé ;)
Le tuto me semble plus porter sur:
- la présentation d'un algorithme résolvant un problème de pathfinding, et les raisons d'adopter ou pas cet algorithme
- l'implémentation de cet algorithme
Que l'explication de la conception de l'algorihme lui-même.


En effet, le but ici n'est pas d'expliquer la logique derrière l'algorithme, je ne me suis pas lancé la dessus pour plusieurs raisons notamment le fait qu'expliquer la logique derrière A* demande un looong dossier si on veut être exhaustif ;).

Bon j'ai corrigé les choses qui faisaient n'importe quoi ( j'ai tout simplement pris une trèès vieille version de mon pathfinder et j'ai oublié d'updater certaines choses ^^ ) je corriges ça de suite.

#12 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 13 January 2010 - 17:36 PM

Voir le messageThoutmosis, le 13 January 2010 - 17:00 PM, dit :

En effet, le but ici n'est pas d'expliquer la logique derrière l'algorithme, je ne me suis pas lancé la dessus pour plusieurs raisons notamment le fait qu'expliquer la logique derrière A* demande un looong dossier si on veut être exhaustif ;).

Bon j'ai corrigé les choses qui faisaient n'importe quoi ( j'ai tout simplement pris une trèès vieille version de mon pathfinder et j'ai oublié d'updater certaines choses ^^ ) je corriges ça de suite.

EDIT: voilà j'ai mis à jour le code, tout fonctionne impec. En revanche j'ai enlevé la gestion des diagonales pour la bonne et simple raison que les diagonales demandent une gestion particulière dans les jeux ( outre le fait qu'elles sont en diagonales ), j'avais oublié ce détail et ferait sans doute un EDIT ou une extension au tuto dans un cours sur la création de labyrinthes.

Modifié par Thoutmosis, 13 January 2010 - 17:37 PM.


#13 remidebra

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 282 messages

Posté 13 January 2010 - 19:56 PM

Ah, y a une petit erreur de frappe. Dans le sujet du début La complexité d'un algorithme tu marque en conclusion de ton exemple:

Citation

Conclusion: l'algorithme B a une plus grande complexité que l'algorithme B.
Je doute... :mrgreen:

#14 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 15 January 2010 - 09:36 AM

Voir le messageUthor le cruel, le 13 January 2010 - 19:56 PM, dit :

Ah, y a une petit erreur de frappe. Dans le sujet du début La complexité d'un algorithme tu marque en conclusion de ton exemple:

Je doute... :mrgreen:


gnééé ??? en effet ^^, merci de l'avoir signalée.

EDIT: corrigé !

Modifié par Thoutmosis, 15 January 2010 - 09:39 AM.


#15 Le_Pioo

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 09 February 2010 - 03:43 AM

Merci beaucoup pour ce tuto, je commence à y voir un peu plus clair.
Cependant j'ai pas réussi à tester le code, que faut-il rentrer au juste dans le fla? (je suis pas encore très au fait de l'utilisation des classes..)

j'ai essayé un bête
[code]import Main;
var mongraphe:Main = new Main();[/AS]
mais ça me donne une page blanche

..un peu d'aide?

#16 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 09 February 2010 - 09:42 AM

En fait il faut utiliser la classe Main comme classe de document c'est plus simple.

càd que tu ouvres le panneau propriété ( CTRL + f3 sous Windows ) et dans l'onglet publier, tu verras un champ texte qui porte pour doux nom "Classe". Tapes "Main" dans ce champ texte et place le fla dans le même répertoire que ton Main.as.

Le .fla prendra le code de te classe Main comme point de départ ;-). Sinon, si tu n'es pas au point concernant les classes je ne saurais que trop te conseiller de lire le bouquin de Thibault Imbert "pratique d'actionscript 3" qui se trouve en libre téléchargement dans les ressources au format pdf.

#17 Le_Pioo

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 10 February 2010 - 01:28 AM

Effectivement ça fonctionne! Merci des tuyaux :D
Mon but est de modifier ce script pour qu'il colle à mon application où le 'tilage' doit se faire sur un clip "waypoint" contenant d'autres clips "wall" à contourner, tout cela en passant par une Tween(max).
Si vous avez des pistes perso j'ai des skis :)

#18 bertrand.riche

    Ceinture Blanche

  • Members
  • Pip
  • 2 messages

Posté 31 March 2010 - 10:46 AM

Hello !

Tout d'abord merci et bravo pour le tutoriel, il est vraiment pas mal est bien expliqué !!

Malgré cela, j'aurais une question subsidiaire :-)
En effet j'utilise une implémentation simple de l'algo A* (une vieille version de cette lib si vous connaissez) et dans le cas présent je souhaite développer une appli qui en plus de me retourner un chemin, peut également me retourner la case accessible la plus proche lorsque la case finale ne l'est pas (dans le cas où il n'existe aucune solution au calcul en gros...), quitte à faire une second calcul de chemin dans un tel cas...

Est-ce que vous verriez un algo rapide à implémenter pour obtenir un tel résultat ?...

Merci beaucoup par avance !

Cordialement,
Ber

#19 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 31 March 2010 - 11:22 AM

Bonjour.

Merci pour tes commentaires sur le tuto ça fait toujours plaisir.
Je compte me remettre à la rédaction de tuto dès ce midi d'ailleurs ).

Pour récupérer la case la plus proche en fait il suffit de prendre la case avec le plus petit F dans la liste fermée.
Dans le cas ou le chemin est trouvé ce sera forcément la case d'arrivée sinon la case la plus proche.

Voilà en espérant avoir répondu à ta question le plus efficacement possible.

#20 bertrand.riche

    Ceinture Blanche

  • Members
  • Pip
  • 2 messages

Posté 31 March 2010 - 12:08 PM

Merci pour la réponse !

En effet j'avais commencé à chercher dans cette direction, je vais faire quelques tests et ça devrait être concluant à priori. Merci !

#21 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 331 messages

Posté 09 April 2010 - 21:14 PM

Du nouveau ? :D

#22 Lyanoward

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 52 messages

Posté 06 January 2011 - 14:25 PM

Bonjour.
Je déterre un peu le sujet lié au tuto de l'algo A*. Je me suis basé dessus pour l'adapter à ce que je suis en train de faire, et après avoir relu dans tous les sens le tuto, je pense qu'il y a un petit oublie dans l'algo :

A aucun moment on ne calcul les propriétés G, H et F du node départ. De fait, lors de la recherche du node avec le plus petit F, G, H et F étant initialisé à 0, on récupère perpétuellement le node de départ.

Voila, c'était peut être une évidence, mais j'ai buté toute la matinée dessus ^^.
Sinon très bon tuto, clair et bien expliqué.

Modifié par Lyanoward, 06 January 2011 - 14:27 PM.


#23 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 14 January 2011 - 16:43 PM

Voir le messageLyanoward, le 06 January 2011 - 14:25 PM, dit :

Bonjour.
Je déterre un peu le sujet lié au tuto de l'algo A*. Je me suis basé dessus pour l'adapter à ce que je suis en train de faire, et après avoir relu dans tous les sens le tuto, je pense qu'il y a un petit oublie dans l'algo :

A aucun moment on ne calcul les propriétés G, H et F du node départ. De fait, lors de la recherche du node avec le plus petit F, G, H et F étant initialisé à 0, on récupère perpétuellement le node de départ.

Voila, c'était peut être une évidence, mais j'ai buté toute la matinée dessus ^^.
Sinon très bon tuto, clair et bien expliqué.

Bonjour Lyanoward,

Tu as bien fait de déterrer. Cette discussion est faite pour ça.

Cela fait longtemps que j'ai lu le tutoriel, donc je sais pas de quoi tu parles, mais si tu peux m'en dire un tout petit peu plus j'irais corriger ce qu'il y a à corriger.
A quelle page fais-tu référence? La théorie ou la pratique ?
Qu'as-tu du changer pour résoudre le problème? Quand j'avais créé le swf d'application affiché sur la page pratique, je ne me souviens pas avoir rencontré de problème.
C'est bien que tu l'aies signalé, si on peut sauver la matinée de futurs lecteurs :)

Si ça te dis tu peux aussi aller toi-même modifier la page, c'est fait pour ça un wiki: http://ressources.me...e/ecrire/editer

Merci d'avoir pris le temps de ce retour.

#24 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 14 January 2011 - 21:32 PM

hey ! mais j'avais pas vu qu'il y avait l'implémentation !

Oui, bon, il y a un lien on ne peut plus explicite en bas… :oops:

Et si on annonçait la couleur d'emblée et qu'en intro on précisait clairement que la mise en œuvre est détaillée, ou alors un lien en "en tête" genre sommaire… :roll: pour les ahuris, pressés, défaitistes comme moi…

Je sais : c'est un wiki ;) mais je ne veux pas faire dans l'interventionnisme inconsidéré non plus…
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#25 Lyanoward

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 52 messages

Posté 17 January 2011 - 11:13 AM

Bonjour
Alors, j'ose pas trop aller modifier directement le wiki, puisque l'erreur pourrait venir de mon implémentation (j'en doute, mais je suis loin d'être infaillible ^^).
Sinon, à mon sens l'erreur se trouverais dans la partie pratique, troisième étape : implémentation. Voici la fonction findPath tels que je la pense correct

je lui ai apporté deux modifications :
Juste avant la boucle principale : on y initialise les valeurs G, H et F du param_node

Juste après le début de la boucle, avant d'affecter le nouveau current_node : on y retire de l'openList le current_node du tour de boucle précédent

public static function findPath( param_graphe:Array, param_start:Node, param_end:Node ):Array
    {
      // on crée les listes fermées et les listes ouvertes
      m_openList = new Array();
      m_closeList = new Array();
 
      // on crée la variable qui va accueillir le chemin final
 
      var finalPath:Array = new Array();
 
 
      //  traitement
 
      /**
        - Ajout du node de départ à la liste ouverte.
        - Entrée dans la boucle suivante:  
          - Récupération du node avec le plus petit F contenu dans la liste ouverte. On le nommera CURRENT.
          - Basculer CURRENT dans la liste fermée.
          - Pour chacun des 4 nodes adjacents à CURRENT appliquer la méthode suivante:
 
          * Si le node est un obstacle ou est dans la liste fermée ignorez-le et
        passer à l'analyse d'un autre node.
 
          * Si le node n'est pas dans la liste ouverte, ajoutez-le à ladite liste
            et faites de CURRENT son parent(P). Calculez et enregistrez
            ses propriétés F, G et H.
 
          * Si le node est déjà dans la liste ouverte, recalculez son G, s'il est inférieur
            à l'ancien, faites de CURRENT son parent(P) et recalculez et enregistrez
            ses propriétés F et H.
 
          * Stopper la boucle de recherche si vous ajoutez le node d'arrivée à la liste fermée ou si la liste ouverte est vide,
        dans ce dernier cas, il n'y a pas de chemin possible entre A et B.
 
        - Prenez le node d'arrivée et reconstruisez le chemin à rebours, càd en bouclant sur les propriétés parentes
        jusqu'à ce que le parent soit CURRENT.
      */

       
        /* AJOUT
                par défaut, la classe node initialise les parametres G, H et F à 0.
                Il faut calculer les valeurs de ces parametres dans le cas présent, autrement lors
                de l'appel à la fonction getCurrentNode, ce sera toujours le node de départ qui sera retourné,
                puisque son F vaudra 0
        */

       
          var startG:int = TILE_DISTANCE_VALUE;
          var startH:int = (Math.abs(param_end.getPosX() - param_start.getPosX()) + Math.abs(param_End.getPosY() - param_Start.getPosY())) * TILE_DISTANCE_VALUE;
          var startF:int = startG + startH;
          param_start.setG(startG);
          param_start.setH(startH);
          param_start.setF(startF);
       
      addToOpenList( param_start );
               
      var currentNode:Node = null;
 
      while( m_openList.length > 0 ) //  stopper la boucle si la liste ouverte est vide
      {
        // a. Récupération du node avec le plus petit F contenu dans la liste ouverte. On le nommera CURRENT.
               
                /* AJOUT
                        il est nécessaire de retirer de l'open liste la currentTile du tour de boucle précédent
                        car en cas de chemin qui nécessite un détour, le findPath va boucler indéfiniment sur ce dernier node
                */

                removeFromOpenList(currentTile);
        currentNode = getCurrentNode();
 
        //  stopper la boucle si n ajoute le noeud d'arrivée à la liste fermée
        if( currentNode == param_end )
          break;
 
        // b. Basculer CURRENT dans la liste fermée.
        addToCloseList( currentNode );
 
        //  récupération des voisins de CURRENT
        var neighbours:Array = getNeighbours( currentNode, param_graphe );
        var maxi:int = neighbours.length;
 
        // Pour chacun des 8 nodes adjacents à CURRENT appliquer la méthode suivante:
        for( var i:int = 0; i < maxi; ++i )
        {
          var node:Node = neighbours[i];
 
          //Si le node est un obstacle ou est dans la liste fermée ignorez-le et passer à l'analyse d'un autre node.
          if( isOnCloseList( node ) || node.walkable == false )
            continue;
 
          /* on calcule le nouveau g */
          var newG:int;
          newG = node.parent.g + NODE_DISTANCE_VALUE;
 
          /*on calcule le nouveau h */
          var newH:int = ( Math.abs( param_end.line - node.line ) + Math.abs( param_end.col - node.col ) ) * NODE_DISTANCE_VALUE;
 
          /*on calcule le nouveau F*/
          var newF:int = newH + newG;
 
 
 
          if( isOnOpenList( node ) )
          {
            //Si le node est déjà dans la liste ouverte, recalculez son G, s'il est inférieur à l'ancien,
            //faites de CURRENT  son parent(P) et recalculez et enregistrez ses propriétés F et H.
 
            if( newG < node.g )
            {
              node.parent = currentNode;
              node.g = newG;
              node.h = newH;
              node.f = newF;
            }
 
          }
          else
          {
            //Si le node n'est pas dans la liste ouverte, ajoutez-le à la dite liste et faites de CURRENT son parent(P).
            //Calculez et enregistrez ses propriétés F, G et H.
            addToOpenList( node );
            node.parent = currentNode;
            node.g = newG;
            node.h = newH;
            node.f = newF;
          }
        }
 
      }


#26 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 17 January 2011 - 15:29 PM

Merci de ta réponse.
Mais je ne comprends pas le problème que tu vois :)

Citation

Juste après le début de la boucle, avant d'affecter le nouveau current_node : on y retire de l'openList le current_node du tour de boucle précédent
Au début de la boucle while il y a:
// b. Basculer CURRENT dans la liste fermée.
addToCloseList( currentNode );
ce qui enlève également le node de la liste ouverte. N'est-ce pas ce que tu dis qu'il faut faire?

Et comme tu écris:
/* AJOUT
il est nécessaire de retirer de l'open liste la currentTile du tour de boucle précédent
car en cas de chemin qui nécessite un détour, le findPath va boucler indéfiniment sur ce dernier node
*/

removeFromOpenList(currentTile);
 
mais que je ne vois nulle part où tu valorises currentTile, cela ne m'aide pas à te comprendre :)

Pour le problème du F = 0 pour le node de départ, est-ce que cela va poser problème? En effet il va être pris en compte uniquement lors de la première itération, au moment où le node start est le seul présent dans la liste ouverte. Donc même si son F n'a pas pour valeur la distance qui le sépare du node d'arrivée, ce qui est bien observé, cela ne va pas produire d'erreur, si?

Tu es peut-être plus plongé dans la compréhension du code que moi et c'est pour cela que je ne comprends pas ce que tu soulèves. As-tu réussi à faire bugguer le swf d'application au début de la page de l'implémentation?

#27 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 17 January 2011 - 15:36 PM

Voir le messageNataly, le 14 January 2011 - 21:32 PM, dit :

hey ! mais j'avais pas vu qu'il y avait l'implémentation !

Oui, bon, il y a un lien on ne peut plus explicite en bas… :oops:

Et si on annonçait la couleur d'emblée et qu'en intro on précisait clairement que la mise en œuvre est détaillée, ou alors un lien en "en tête" genre sommaire… :roll: pour les ahuris, pressés, défaitistes comme moi…

Je sais : c'est un wiki ;) mais je ne veux pas faire dans l'interventionnisme inconsidéré non plus…

Bien vu Nataly, merci.
C'est fait :)

#28 Lyanoward

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 52 messages

Posté 17 January 2011 - 15:47 PM

Citation

mais que je ne vois nulle part où tu valorises currentTile, cela ne m'aide pas à te comprendre :)

Pour le problème du F = 0 pour le node de départ, est-ce que cela va poser problème? En effet il va être pris en compte uniquement lors de la première itération, au moment où le node start est le seul présent dans la liste ouverte. Donc même si son F n'a pas pour valeur la distance qui le sépare du node d'arrivée, ce qui est bien observé, cela ne va pas produire d'erreur, si?

Tu es peut-être plus plongé dans la compréhension du code que moi et c'est pour cela que je ne comprends pas ce que tu soulèves. As-tu réussi à faire bugguer le swf d'application au début de la page de l'implémentation?

Alors là, au temps pour moi, en relisant ma propre implémentation, et le tuto, je me suis rendu compte d'une erreur assez importante de ma part !
J'ai mal codé la fonction addToCloseList : dans chacune, j'ai utilisé le mauvais remove (removeToCloseList dans addToCloseList au lieu removeToOpenList dans addToCloseList) bref, ce que j'ai fait n'a pas de sens.

Donc du coup, effectivement le tuto est complet, et mes modifications n'ont pas lieu d'être. J'ai bien fait de pas aller modifier l'article x).
Du coup c'est mon implémentation que je vais aller corriger de ce pas.

#29 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 17 January 2011 - 16:04 PM

Voir le messageLyanoward, le 17 January 2011 - 15:47 PM, dit :

J'ai bien fait de pas aller modifier l'article x).
:mrgreen:


En tout cas tu as bien fait de faire tes remarques, cette discussion est faite pour ça.

#30 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 17 January 2011 - 23:56 PM

Du coup, j'ai envie de jouer à ça, et je me demande un truc :

les B G H F, ce sont des conventions ?


Citation

La propriété parent (P): il s'agit du node qui a permis “d'arriver” au node courant.

La propriété G: il s'agit de la distance parcourue depuis le point de départ pour arriver au node courant.

La propriété H: il s'agit de la distance à vol d'oiseau entre le node courant et le node d'arrivée.

La propriété poids(F): il s'agit de la somme de G et de H.

Juste pcq ça me tue de mémoriser G comme distance, H comme hoiseau et F comme Total… En revanche si ce sont des conventions autant que je m'y fasse au lieu d'inventer mon vocabulaire à moi toute seule sur la planète ;)

En tous cas (avec la deuxième partie :oops:) ce tuto est vraiment très sympa \o/

Merci bcp, Ô fils de ra :)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)