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 :

Rotation de case dans un tableau 2D


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut Rotation de case dans un tableau 2D
    J'ai un tableau de 2D de dimension n * n (un carré)

    Et je voudrais faire une rotation de mes cases de 90°.

    Comment faire ?

    Exemple
    Devient

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    Bien le bonjour,

    Ce qui me vient en tête, c'est de faire une rotation de manière tout à fait conventionelle, à savoir avec la matrice qui va bien.

    le centre de rotation est (n/2,n/2), tu calcules donc les coordonnées de chacune de tes cases (par translation de (n/2,n/2)) puis tu leur appliques la matrice de rotation

    0, -1
    1, 0 , qui d'ailleurs dans ce cas se calcule sans même avoir à poser de produit matriciel
    Et pour finir tu réappliques une translation inverse de (n/2,n/2) et tu as tes nouvelles coordonnées.

    Et pout faire + algorithmique :
    tu crées une matrice n*n vide
    tu parcours ta matrice n*n de départ (boucle)
    tu fais les étapes décrites précédemment avec la matrice de rotation
    tu remplis la nouvelle matrice (fin de la boucle)
    tu détruits la première matrice.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par khayyam90
    Et pout faire + algorithmique :
    tu crées une matrice n*n vide
    tu parcours ta matrice n*n de départ (boucle)
    tu fais les étapes décrites précédemment avec la matrice de rotation
    tu remplis la nouvelle matrice (fin de la boucle)
    tu détruits la première matrice.
    Dans un cas général, mieux vaut parcourir le tableau d'arrivée plutôt que le tableau de départ et lui appliquer la transformation inverse (avec éventuellement une interpolation) : en parcourant le tableau de départ, on risque de "sauter" des cases du tableau d'arrivée et donc de se retrouver avec des cases non initialisées.

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut
    Une matrice de rotation!! Et en inversant le le rôle des indices, c'est pas plus simple?

    La rotation de Pi/2 : S[i][j] = T[j][n-1-i]
    La rotation de -Pi/2 : S[i][j] = T[n-1-j][i]
    La symetrie Central : S[i][j] = T[n-1-i][n-1-j]
    La symetrie horizontal : S[i][j] = T[n-1-i][j]
    La symetrie vertical : S[i][j] = T[i][n-1-j]
    La symetrie diagonal : S[i][j] = T[j][i]
    La symetrie anti-diagonal : S[i][j] = T[n-1-j][n-1-i]
    L'identité : S[i][j] = T[i][j]

    Pourquoi voiloir absolument, faire la rotation. C'est la facon dont tu va acceder qui va determiner l'ordre des données. pourquoi faire un parcourt en O(n^2), si tu peut le remplacer avantageusement par des petites additions et soustraction aux bons endroits.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Mon problème c'est la gestion déplacement des cases de départ dans la case d'arrivé.

    La solution de khayyam90 me parait la plus simple. Or elle prend le plus de mémoire, si le tableau est grand.

    J'ai penché sur une solution de faire dans la même matrice, et d'avoir une variable tmp de type case, pour faire un swap. Mais je n'arrive pas à le gérer.

  6. #6
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par Oberown
    J'ai penché sur une solution de faire dans la même matrice, et d'avoir une variable tmp de type case, pour faire un swap. Mais je n'arrive pas à le gérer.
    Parce que justement, c'est pas un swap mais une rotation. Dans ton exemple:

    1 prend la place du 7
    7 prend la place du 9
    9 prend la place du 3
    3 prend la place du 1

    donc je vois deux solutions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tmp = S[0, 0]
    S[0] [0] = S[0] [2]
    S[0] [2] = S[2] [2]
    S[2] [2] = S[2] [0]
    S[2] [0] = Tmp
    ou bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Swap(S[0] [0], S[0] [2])
    Swap(S[0] [0], S[2] [2])
    Swap(S[0] [0], S[2] [0])
    Et pour le cas général, remplace tous les 0 par des i ou des j, et les 2 par des (n - i - 1) ou (n - j - 1).

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Disons que ta matrice n*n se repésente par M(i,j) où i,j sont compris entre 1 et n, i représentant le No de ligne et j le No de colonne.

    Notons N(i,j) la matrice où on a effectué la rotation de 90 degré.

    Alors on a simplement N(i,j) = M(j,n+1-i) !!

  8. #8
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut
    Citation Envoyé par Oberown
    J'ai penché sur une solution de faire dans la même matrice, et d'avoir une variable tmp de type case, pour faire un swap. Mais je n'arrive pas à le gérer.
    pour faire une permutation sur place, tu permute quatre éléments à cahaque fois. ALors tu ne parcourt plus que le quart de ta matrice (sinon tu va revenir à ton etats initiale)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ###..
    ###..
    .. ..
    ..:::
    ..:::
    Fait juste attention à la parité de n, si il est impaire il faudra rajouter un petit morceau.

    sinon tu parcourt le triangle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ####.
    .##..
    .. ..
    ..::.
    .::::

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Oubli, mais c'est evident: le swap s'effectue entre (i,j) et (j,n+1-i) !

  10. #10
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut
    Citation Envoyé par Nemerle
    entre (i,j) et (j,n+1-i) !
    c'est n-1-i, si tu considère les tableaux indéxés à partir de 0.
    et
    n+1-i, si ils sont indéxés à partir de 1.

    Personnellement, je préfère les tableaux indéxés à la C, je sais c'est lpus par habitude. L'indéxation à partir de 1 est plus "naturelle", parcequ'on parle bien du i-ème élément à l'index i. Mais bon à un décalage près on s'y retrouve aussi.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par buzard
    c'est n-1-i, si tu considère les tableaux indéxés à partir de 0.
    et
    n+1-i, si ils sont indéxés à partir de 1.
    ce que j'avais dit --> cf + haut: indexés à partir de 1

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Merci beaucoup pour la case d'arrivé.

    Mais comment gérer le déplacement de la case ? Pour ne pas effacer la case d'arrivé ?

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par Oberown
    Merci beaucoup pour la case d'arrivé.

    Mais comment gérer le déplacement de la case ? Pour ne pas effacer la case d'arrivé ?
    tu as besoin obligatoirement d'une var. tampon, non?

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Oui, mais je n'arrive pas à gerer.
    En gros faut swaper 4 cases de la rotation puis passer à la case d'après. Une fois arrivé au milieu il faut arrêter.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par Oberown
    Oui, mais je n'arrive pas à gerer.
    En gros faut swaper 4 cases de la rotation puis passer à la case d'après. Une fois arrivé au milieu il faut arrêter.
    je ne comprends pas ton problème!

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Si on continue de swapper les cases on va les swapper plusieurs fois.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    no comprendo senior: tu parcours seulement la moitié des i,j, non?

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Mon problème c'est de gerer le déplacement de mes cases.
    Je sais où est le départ et où est l'arrivé. Mais je ne sais pas omment les déplacer. Vu que le déplacement ce fait dans la même matrice et non dans une matrice de réception.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Bon, la chaîne de rotations x,r(x),rr(x),... où x=(i,j) est une case de ta matrice donne

    (i,j) (j,n+1-i) (n+1-i,n+1-j) (n+1-j,i )

    et après on revient à (i,j). On a donc 4 valeurs différentes qui s'échangent par permutation circulaire (sauf pour la valeur "centrale" d'une matrice d'ordre impair, valeur qui ne bouge pas).

    Donc il faut faire, en notant M(i,j) la matrice ou i,j sont dans 1...n:

    pour j de 1 à n-1
    pour i de j à n-j
    a=M(n+1-j,i) //*** variable tampon
    M(n+1-j,i )=M(n+1-i,n+1-j)
    M(n+1-i,n+1-j)=M(j,n+1-i)
    M(j,n+1-i)=M(i,j)
    M(i,j)=a
    finpour
    finpour
    le truc était de vérifier que (j varie de 1 à n-1)&(i varie de j à n-j)

  20. #20
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par Nemerle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pour j de 1 à n-1
    pour i de j à n-j
    Heu... Moi j'aurais plutôt dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pour j de 1 à n / 2
    pour i de j à n-j

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. un bouton sur plusieurs cases dans un tableau dynamique
    Par dododawn dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/12/2009, 12h51
  2. Réponses: 0
    Dernier message: 13/02/2008, 12h11
  3. Cocher une case dans un tableau
    Par mangood83 dans le forum VBA Word
    Réponses: 0
    Dernier message: 27/08/2007, 09h42
  4. plier/ deplier blocs de cases dans un tableau
    Par deepwrath dans le forum Langage
    Réponses: 8
    Dernier message: 26/04/2007, 08h14

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