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

Algorithmes et structures de données Discussion :

calcul distance dans une grille hexagonale


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut calcul distance dans une grille hexagonale
    Bonjour à tous,

    ben voilà, je suis en train d'halluciner sur la complexité de cet algo. Je pensais que ça me prendrais 2mn, mais là j'y suis dessus depuis ce matin et je n'en reviens pas comme c'est compliqué. Le truc, c'est que j'en ai trouvé un qui fonctionne, mais c'est affreux (tellement affreux que je n'ose pas le poster ).

    Alors voilà. J'ai une grille hexagonale comme cela:

    les petits chiffres correspondent aux coordonnées de chaque case. Je ne les ai pas toutes écrites, mais suffisamment pour comprendre le principe.

    Donc voilà, je cherche un algo qui prend 2 cases (qui connais donc les coordonnées i et j de chacune d'entre elles), et qui me renvoie la distance entre ces deux cases.

    Par exemple:
    -> entre (0,0) et (2,0), la distance est 2
    -> entre (3,0) et (0,0), la distance est 3
    -> entre (3,1) et (0,0), la distance est 3
    etc...

    je vous aurais prévenu, c'est nettement plus difficile qu'il n'y parait

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    un bel arrondi sur une distance directe marchera, non ??

    (d'ailleurs, d'après ton schéma, je mettrais plutôt les distances à 1,2,2)

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    un bel arrondi sur une distance directe marchera, non ??
    Le truc c'est que je ne connais pas les dimensions des cases. Je ne connais vraiment que leurs coordonnées.

    Citation Envoyé par souviron34 Voir le message
    (d'ailleurs, d'après ton schéma, je mettrais plutôt les distances à 1,2,2)
    Ben non c'est bien ça: pour aller de la case (0,0) à la case (2,0), je dois "sauter" 2 fois de case. Mais bon, ça reviens au même, c'est juste la façon de compter (il suffit d'ajouter/soustraire 1 pour passer de l'une à l'autre).

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    (0,0) (2,0) : sqrt( (2-0)*(2-0) + (0-0)*(0-0) ) = 2
    (0,0) (3,0) : sqrt( (3-0)*(3-0) + (0-0)*(0-0) ) = 3
    (0,0) (3,1) : sqrt( (3-0)*(3-0) + (1-0)*(1-0) ) = sqrt(10) = 3.16..

    donc dist = (int)(0.5+sqrt())




    (0,0) (3,2) : sqrt( (3-0)*(3-0) + (2-0)*(2-0) ) = sqrt(13) = 3.6
    (int)(3.6+0.5) = 4

  5. #5
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Il y aurait bien une définition récursive:
    1) Définir pour toute case C l'ensemble V(C) de ses 'voisins' immédiats. Ça c'est pas trop dur.
    Ensuite dire:
    Si C1 et C2 sont deux cases:
    Si C1=C2 alors d(C1,C2)=0
    Si C2 appartient à V(C1) alors d(C1,C2)=1
    Sinon
    d(C1,C2)=Inf(X dans V(C1),d(X,C2))+1
    Mais pour éviter de partir dans toutes les directions on se limite la recherche à un rectangle englobant C1 et C2.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Il y aurait bien une définition récursive:
    1) Définir pour toute case C l'ensemble V(C) de ses 'voisins' immédiats. Ça c'est pas trop dur.
    Ensuite dire:
    Si C1 et C2 sont deux cases:
    Si C1=C2 alors d(C1,C2)=0
    Si C2 appartient à V(C1) alors d(C1,C2)=1
    Sinon
    d(C1,C2)=Inf(X dans V(C1),d(X,C2))+1
    Mais pour éviter de partir dans toutes les directions on limite la recherche à un rectangle englobant C1 et C2.
    Effectivement j'avais pensé à un algo récursif (bien que différent du tiens), mais pour des raisons de rapidité d'exécution, j'aurais aimé trouver un calcul direct. J'ai vraiment besoin que cet algo soit super rapide, car il fait partie d'un autre algo et sera donc appelé beaucoup beacoup de fois.

    L'algo auquel j'avais pensé consiste à calculer, à chaque itération, la direction de la case à atteindre, et d'aller dans cette direction jusqu'à ce qu'on l'atteigne.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 293
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    dist = (int)(0.5+sqrt())
    Je ne saurais pas te dire pourquoi, mais ça ne marche pas à tous les coups.
    Par exemple:
    (5,4) -> (8,6), ça devrait donner 3
    or (int) ( 0.5 + sqrt( (8-5 )*(8-5) + (6-4)*(6-4) ) ) = 4

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par r0d Voir le message
    Je ne saurais pas te dire pourquoi, mais ça ne marche pas à tous les coups.
    Par exemple:
    (5,4) -> (8,6), ça devrait donner 3
    or (int) ( 0.5 + sqrt( (8-5 )*(8-5) + (6-4)*(6-4) ) ) = 4
    Mais au fond, vu tes problèmes, et que tes hexagones ne sont pas réguliers, cela veut dire que ta grille a des trous...

    Cela voudrait donc dire qu'il faudrait que tu superposes à ta grille irrégulière une grille régulière, et que tu interpoles à partir de là (comme on fait quand on veut tourner une image : on part du pixel résultat, pour calculer là ou on tombe en rotation inverse, sinon ça provoque du moiré).

Discussions similaires

  1. Calculer une distance dans une image
    Par yomas64 dans le forum jQuery
    Réponses: 3
    Dernier message: 08/10/2014, 01h07
  2. calcul dans une grille MSFlexGrid
    Par lumbroso dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/12/2011, 17h36
  3. Calcul de la distance dans une image binaire
    Par tawada dans le forum Images
    Réponses: 1
    Dernier message: 06/07/2010, 10h27
  4. calcul distance dans une image
    Par pro-naw dans le forum Images
    Réponses: 16
    Dernier message: 07/08/2009, 02h25
  5. Réponses: 4
    Dernier message: 01/03/2009, 13h07

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