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 :

symétries dans un hexagone


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Inscrit en
    Août 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 46
    Par défaut symétries dans un hexagone
    Bonjour,
    Je vous soumet un petit problème (j'ai une partie de la solution, mais je pense qu'il y a beaucoup moins couteux et plus élégant).
    J'ai un assemblage rectangulaire dans lequel je vais mettre des mailles. l'ensemble de ces mailles va former un hexagone, dans lequel j'aimerai pouvoir gérer des symétries.

    en dessin cela donne : chaque - représente une case vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    °° 1234567
    01 ---f---
    02 --f-f--
    03 -f-f-f-
    04 f-f-f-f
    05 -f-f-f-
    06 f-f-f-f
    07 -f-f-f-
    08 f-f-f-f
    09 -f-f-f-
    10 f-f-f-f
    11 -f-f-f-
    12 --f-f--
    13 ---f---
    La structure est réalisée avec des cases rectangulaires, ce qui lui donne un aspect moin "aplati" que sur mon dessin, mais bref, passons.
    Dans cette structure, il y a des cases équivalentes.
    Si je découpe l'hexagone formé en six, je vais avoir six cadrans symétriques. Par conséquent, il y a des cases équivalentes : si l'on s'aide des coordonnées de ligne/colonne de chaque case (chaque lettre dans mon schéma), cela donne : la case (13;4) est équivalente par symétrie médiane à la case (1;4).
    Si je prend un secteur de cet hexagone de 60° et que, pour la pointe de ce secteur (case (13;4)), je cherche toutes les cases équivalentes, je vais trouver : (1;10), (1;4) (4;1) (7;4) (7;10).

    La question du jour : trouver un algorithme simple qui me donne, connaissant la composition d'un secteur de 60° la composition de tout l'hexagone obtenue après rotation de ce secteur.
    Dans l'exemple que j'ai donné toutes les cases sont identiques, mais dans la réalité ce n'est pas toujours le cas.
    Faire la même chose pour tous les types de symétries possibles dans un hexagone, et toutes les rotations.

  2. #2
    Membre averti
    Inscrit en
    Août 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 46
    Par défaut
    je fais remonter, ça n'a pas l'air d'inspirer grand monde...
    J'ai vu qu'il y avait des codes pour gérer les structures hexagonales, mais en s'aidant du voisin. A priori je ne peux pas les utiliser dans ce cas là, sauf si qq'un me prouve le contraire, ce qui m'arrangerait bien

  3. #3
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par titpuce
    je fais remonter, ça n'a pas l'air d'inspirer grand monde...
    faudrait que tu expliques mieux en particulier "Si je prend un secteur de cet hexagone de 60° et que, pour la pointe de ce secteur (case (13;4)), je cherche toutes les cases équivalentes, je vais trouver : (1;10), (1;4) (4;1) (7;4) (7;10)."

    En particulier, je dirais la même chose qu'à Charly: cherche "système radiciel" --> il existe une "base" (u,v) qui te permet de placer tes hexagones et de travailler simplement avec tes rotations.

    Ensuite, il te suffit de passer de ta base (u,v) à ta base standard (x,y).

  4. #4
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Considère la base (i,j) suivante:



    - le centre est un centre d'un hexagone choisi par toi
    - i est le vecteur qui relie ce centre au centre de l'hexagone voisin "de droite"
    - j est le vecteur qui relie ce centre au centre de l'hexagone voisin "en haut à droite" (l'angle (i,j) est donc de 60 degrés)

    Dans cette base, tous les centres des hexagones s'écrivent ai+bj ou i,j sont des entiers relatifs. Par exemple, en partant du centre

    ....j-i.....j
    -i......0.....i
    ....-j....i-j

    Travailler avec des rotations est alors plus simple dans cette base (=réseau radiciel associé à notre hexagone)

  5. #5
    Membre averti
    Inscrit en
    Août 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 46
    Par défaut
    merci Nemerle
    Zai toujours pas compris ce qu'était un système radiciel, mais je suppose que c'est un autre référentiel de base... Google n'est pas très causant dessus....

    Si je comprends bien ton explication, je dois dans mon algo travailler d'abord en ne considérant que les hexagones.
    Mais si j'ai trois couronnes d'hexagones autour de ma cellule centrale, comment calculer les coordonnées selon ton système ?
    Si je veux les coordonnées des trois cellules situées sous la cellule centrale je calcule :
    Est-ce exact ?

  6. #6
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par titpuce
    Mais si j'ai trois couronnes d'hexagones autour de ma cellule centrale, comment calculer les coordonnées selon ton système

  7. #7
    Membre averti
    Inscrit en
    Août 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 46
    Par défaut
    ça, ca vaut au moins deux
    m'ci lemerle

  8. #8
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    ...et ai+bj c'est l'élément [a,j] de ton tableau, pour clore avec ce double post

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Par défaut
    Citation Envoyé par Nemerle
    ...et ai+bj c'est l'élément [a,j] de ton tableau, pour clore avec ce double post
    Ce serait pas [a,b] ?
    Merci pour ma déniaiserie en tous cas

  10. #10
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    Dans ce domaine je ne pourrais aussi que recommander de lire les chapitres d'introduction à la cristallographie.

  11. #11
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par borisd
    Ce serait pas [a,b] ?
    Merci pour ma déniaiserie en tous cas
    si, tu as raison, j'avais des mouffles: ai+bj donne [a,b], puisque (i,j) est notre base de vecteurs !

    Effectivement, une intro à la cristalo peut être utile; la base ce celle-ci réside dans les réseaux radiciels ("root systems", puisqu'en français Google n'est pas prolixe). Donc, un article sur Wiki:

    http://en.wikipedia.org/wiki/Root_system

    les diagrammes de Dynkin n'étant pas utiles ici, mais cela donne un exemple d'invariants rigolo

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Par défaut
    moi aussi je travaille sur le développement de jeux avec des Hexagones, et votre discussion m'intéresse beaucoup
    je crois que j'ai compris le calcul d'hexagone à Hexagone mais comment transformer une coordonnée d'hexagone en coordonner d'un tableau carré
    x=5
    y=6
    i=x
    j=y

    si après ma fonction je détermine que les besoins de l'hexagone situé en i+4 et de j+2 comment je fais pour le retrouver dans mon tableau carré?
    ce serait gentil de me donner le calcul sous format programmation car je n'y connais rien en algèbre ...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Par défaut
    attendez... je crois que ça fait Tilt
    mais pour un affichage à l'écran de 20 Hexagones sur 20 j'aurais besoin d'un tableau en 30 sur 30 ce qui me fait 500 cases qui occuperaient de la place en mémoire inutilement
    imaginez maintenant, une tres grande carte (pour un jeu de strategie online massivement Multi-joueurs ) de 5000 sur 5000, donc, j'aurais besoin d'un tableau de 7500 * 7500 ce qui nous fait tout de meme 31.250.000 cellules inutilement réservé
    auriez-vous une astuce pour éviter cela?

  14. #14
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    et bien non: la base "canonique" (i,j) évidente indiqué plus haut et le minimum necessaire pour encoder les positions sous forme de paires d'entiers.

    C'est logique: si tu prends un hexa + les 6 autours, cela te fais 7 hexagones, mais que tu stockes dans une table 3*3....... passkeuh 2*2 ca fait que 4 et 3*2 ca fait que 6

    Maintenant si ta question etait technique, et si tu veux éviter les tableaux, utilise des objets différents -- des vector par exemple --

  15. #15
    Membre averti
    Inscrit en
    Août 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 46
    Par défaut
    Zarr : pourquoi as-tu besoin de repasser en base classique ?
    Si c'est pour un calcul de positionnement de tes hexagones, tu peux aussi garder en mémoire les coordonnées chaque hexagone par rapport au centre de ta grille, mais calculé avec la base vectorielle indiquée plus haut.
    Pour mon problème, je gère deux affichages : l'affichage de la grille hexagonale, où je passe d'un hexagone à un autre par un pas de 1, et un affichage d'un maillage rectangulaire, dans lequel j'indique les positions de mes hexagones (chais pas si c'est très clair comme ça....).
    Pour l'hexagonale, je part d'une base vectorielle (merci nemerle), puis je fais un changement de repère pour retrouver les coordonnées de l'hexagone dans mon maillage rectangulaire.
    dans le repère rectangulaire, le vecteur i correspond à un déplacement de (nx; my). Le vecteur j à un déplacemnt (ox; py)
    Donc si dans le repère radiciel mon hexagone a pour coordonnées (3i+4j), la coordonnée dans le repère orthonormé sera :
    ( (x0+3*nx + 4*ox); (y0+3*my+4*py) )

  16. #16
    Membre averti
    Inscrit en
    Août 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 46
    Par défaut
    Sinon pour revenir à mon problème j'ai fini par faire un truc tout bete :
    dans un tableau j'enregistre mon élément de base (1/6 de l'hexagone par ex), puis je copie dans le tableau principale la composition de l'hexagone entier, à l'aide de deux boucles for imbriquées pour générer les coordonnées x,y. Si il y a symétrie ou rotation, je génère la valeur nécessaire en parcourant le premier tableau dans un sens ou dans l'autre....
    C'est bete, c'est lourd, mais ça marche....

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

Discussions similaires

  1. Calcul de la distance dans un repère hexagonal non orthonormé.
    Par vatelien69 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 16/09/2012, 18h07
  2. symétrie d'un pixel dans une image
    Par bechir ouni dans le forum Images
    Réponses: 2
    Dernier message: 23/04/2012, 13h03
  3. Réponses: 4
    Dernier message: 01/03/2009, 13h07
  4. Réponses: 5
    Dernier message: 26/06/2008, 19h08
  5. Encerclement dans hexagone
    Par chris28200 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 15/12/2006, 11h42

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