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

C Discussion :

Problème quadtree inversion


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Problème quadtree inversion
    Bonjour, je dois faire un quadtree comme projet. Lorsque je fais l'inversion verticale et après plusieurs division, rien ne se passe à l'affichage, pourtant les coordonnées sont bien modifiées. Quelqu'un peut il m'aider ou me conseiller. Merci

    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
    39
    40
    41
    42
    43
    44
    45
     
    void inverser(ARBRE *A)
    {
    	if((*A)->f1!=NULL)
    	{
    		inverser(&(*A)->f1);
    		inverser(&(*A)->f2);
    		inverser(&(*A)->f3);
    		inverser(&(*A)->f4);
    		change_coord_inversion(&(*A));
    	}
    }
     
    void change_coord_inversion(ARBRE *A)
    {
    	int cote=(*A)->f1->P2.x-(*A)->f1->P1.x;
    	if((*A)->f3->P1.y>(*A)->f1->P1.y)
    	{
    		(*A)->f1->P1.y+=cote;
    		(*A)->f1->P2.y+=cote;
     
    		(*A)->f3->P1.y-=cote;
    		(*A)->f3->P2.y-=cote;
     
    		(*A)->f2->P1.y+=cote;
    		(*A)->f2->P2.y+=cote;
     
    		(*A)->f4->P1.y-=cote;
    		(*A)->f4->P2.y-=cote;
    	}
    	else
    	{
    		(*A)->f1->P1.y-=cote;
    		(*A)->f1->P2.y-=cote;
     
    		(*A)->f3->P1.y+=cote;
    		(*A)->f3->P2.y+=cote;
     
    		(*A)->f2->P1.y-=cote;
    		(*A)->f2->P2.y-=cote;
     
    		(*A)->f4->P1.y+=cote;
    		(*A)->f4->P2.y+=cote;
    	}
    }
    PS: A l'origine, f1 est en haut à gauche, f2 est en haut à droite, f3 est en bas à gauche, puis f4 en bas à droite.

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Salut

    questions préliminaires indispensables : est-ce que le type ARBRE ou la structure NOEUD ont changé depuis ton dernier message ? La fonction init_arbre a-t-elle été modifiée ou pas ?

    Et aussi (j'avais déja posé la question), dois-tu développer dans le cadre du projet un "gestionnaire" de Quadtree général et l'appliquer à ton découpage ou dois-tu seulement t'inspirer des Quadtree pour effectuer tes découpages ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    les définitions de certains types ont été données dans cette discussion


    • En laissant de côté pour le moment les détails de ton code C,
    • en ne gardant que l'esprit de tes 2 fonctions,
    • sans être sur de comprendre dans le détail ce que tu appelles inversion (ni quel est son intérêt)


    j'ai bien l'impression qu'il y a, de toute façon, un problème dans ta façon de procéder.

    C'est dû au fait que les coordonnées extrêmes (xmin,ymin,xmax,ymax) des zones couvertes par les noeuds de l'arbre sont fixées lors de leur création ou de la division du noeud père (ce sont les coordonnées des points P1 et P2). Ces coordonnées sont des coordonnées absolues mais, à la création, elles sont cohérentes : avant les "inversions", les fils sont spatialement localisés dans le père.


    Quand tu commences à faire les inversions, c'est là que ça part en vrille : tu swappes les deux couples de fils (les gauches haut et bas, les droits haut et bas) qui, globalement, restent dans le père. Sauf qu'à l'étape suivante (attention, c'est du récursif et les changements se font en remontant dans l'arbre), le père change de place avec "un frère". Au final (sauf quelques cas particuliers, profondeur de 1), les noeuds pères ne contiennent pas, spatialement, leurs noeuds fils ... pour un Quadtree qui, dans ton cas, doit partitionner l'espace, ça coince.

    Visuellement, sur un exemple minimaliste où on reconnaitra chacun des noeuds par une couleur de périmètre :



    figure 1 : c'est la position de départ. La racine (noir) a été divisée et a 4 fils (jaune, gris, vert, rouge). Seul le fils jaune a été divisé (rose, bleu, violet et marron)

    Première inversion sur f1 (jaune) qui (réursivité) lance les inversions sur les fils (feuilles de l'arbre : il ne se passe rien). Changement des coordonnées des dits-fils f1 et f3 (résultat figure 2 / inversion rose-violet) et f2 et f4 (résultat figure 3 - inversion bleu-marron).

    L'inversion des fils de la racine f2 (gris), f3 (vert) et f4 (rouge) s'arrêtent de suite (ce sont des feuilles de l'arbre).

    Vient alors le changement de coordonnées de f1 (jaune) et f3 (vert) : résultat à la figure 4 : cà y est ! Le noeud père JAUNE référence toujours (champs f1,f2,f3 et f4) ses fils violet, marron, rose et bleu mais ne les contient même plus.

    Denier changement entre f2 et f4 de la racine : inversion gris-rouge et résultat final donné à la figure 5.



    Et quand les divisions des noeuds sont plus poussées, ça part, encore un peu plus, dans tous les sens.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    J'ai réussi à faire l'inversion finalement, en recalculant les coordonnées pour chaque nœuds et en échangeant les fils en mémoire. Merci .

  5. #5
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    A moins que ce ne soit qu'une simple contrainte dans ton projet (une "figure imposée"), pourrais-tu m'éclairer sur l'intérêt de cette inversion ? Je ne vois pas du tout à quoi ça peut servir.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

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

Discussions similaires

  1. [Problème] Algorithme inversion de listes.
    Par Armadeon dans le forum Général Python
    Réponses: 9
    Dernier message: 24/10/2013, 16h27
  2. [Débutant] Problème pour inverser une matrice
    Par alexov dans le forum MATLAB
    Réponses: 1
    Dernier message: 08/06/2011, 17h53
  3. Problème pour inverser des lignes d'une matrice
    Par breizh297 dans le forum MATLAB
    Réponses: 7
    Dernier message: 21/05/2010, 18h00
  4. problème date inverser
    Par michelle1000 dans le forum ASP
    Réponses: 5
    Dernier message: 07/11/2006, 12h41
  5. [SQL-Server] Inversion entre le mois et le jour
    Par casper24 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/09/2006, 19h33

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