Bonjour � tous, � toutes, la forme ?

Alors voil�, j'ai un petit probl�me.. Je bosse en ce moment sur les graphes et sur les recherches de meilleur chemin. De tels algorithmes imposent tr�s souvent de tenir une liste rang�e ( en l'occurrence, une map ) de points, de telle sorte que le premier point de la dite liste soit celui qui satisfait le plus possible telle ou telle exigence.

Dans mon exemple, j'utilise une map de <points,char>, et je voudrais que le premier �l�ment de la liste soit celui dont la cl� ( le point ) est le plus proche du point d'arriv�e.

En fait j'y suis d�j� arriv�, le probl�me vient quand deux points sont �quidistants ( me sortez pas vos histoire d'�quidistant avec le dragon, je vois d�j� venir les fans de kaamelott ) �quidistants, disais-je, du point d'arriv�e. En fait, lorsqu'un nouveau point est ajout� � la liste et qu'il est aussi loin du point d'arriv�e que ne l'est d�j� un autre point de la liste, le nouveau point remplace le pr�c�dent, dans sa position dans la map ( ce qui ne me d�range pas ) et dans sa cl�/valeur ( ce qui me d�range beaucoup plus ! ). Voyez plut�t :

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
#include <SFML/Graphics.hpp>
#include <map>
#include <iostream>
#include <cmath>
 
/* Que ceci n'effraie pas certains : un sf::Vector2i est exactement la même chose qu'un std::pair<int,int>, à ceci près que ses deux "pairs" sont accessibles par des .x et .y, au lieu de .first et .second */
typedef sf::Vector2i Point;
 
Point start(5,6), goal(16,6);
 
// Le comparateur de map..
class comp 
{
public:
    bool operator()(const Point X,const Point Y) 
    { 
        // si X est sctrictement plus proche de goal que ne l'est Y, on renvoie TRUE. Sinon, on renvoie FALSE.
        return sqrtf((goal.x-X.x)*(goal.x-X.x)+(goal.y-X.y)*(goal.y-X.y)) < sqrtf((goal.x-Y.x)*(goal.x-Y.x)+(goal.y-Y.y)*(goal.y-Y.y));
    }
};
 
int main()
{
    std::map<Point,char,comp> map;
 
    Point a(5,7), b(10,3), c(15,5), d(17,5);
 
    map[d]='d';
    map[a]='a';
    map[c]='c';
    map[b]='b';
 
    map.erase(map.begin()->first);
 
    std::cout<<"point le plus proche : "<<map.begin()->second;
 
    return 0;
}
Ici, c est aussi loin de goal que d. Probl�me : lorsque j'ajoute c � la map, apr�s d donc, il remplace d par c. Cons�quence : lorsque je supprime c, le premier �l�ment n'est plus d mais b. Comment faire pour que tel ne soit pas le cas ? J'ai bien essay� de remplacer < par <= dans le comparateur mais il semblerait que ne soit pas la bonne solution..

Des id�es ?

Mr Pchoun !