// File: /workspace/github_c_makefile_star2_O0/trumabrat[P]GrandProjet/ArbreQuat.c
// Function: reconstitueReseauArbre
Reseau *reconstitueReseauArbre(Chaines *C){

    //Determiner et creer la racine 
    double xmin, ymin, xmax, ymax;
    chaineCoordMinMax(C, &xmin, &ymin, &xmax, &ymax);
    ArbreQuat *pere = creerArbreQuat(xmin + (xmax - xmin) / 2.0, ymin + (ymax - ymin) / 2.0, xmax - xmin, ymax - ymin);

    //Creation du reseau
    Reseau *R = (Reseau*) calloc(1, sizeof(Reseau));
    R->gamma = C->gamma;
    R->nbNoeuds = 0;

    //On va parcourir les chaines de C
    CellChaine *tmpChaines = C->chaines;
    for (int i = 0; i < C->nbChaines; i++){
        
        //On regarde chaque point individuel de la chaine
        CellPoint *tmpPoints = tmpChaines->points;

        //On stocke les extremites pour creer la commodité
        Noeud *extremite1 = NULL;
        Noeud *extremite2 = NULL;

        //Pour le premier noeud de l'arbre:
        extremite1 = lancerRecherche(R, pere, tmpPoints->x, tmpPoints->y);
        tmpPoints = tmpPoints->suiv;

        //On stocke le noeud d'avant pour ajouter les ajouter comme voisins
        Noeud *prev = extremite1;

        //Parcours de tous les points (sauf le premier qui est deja fait avant) de la chaine
        while(tmpPoints){
            Noeud *n = NULL;
            if (tmpPoints->suiv == NULL)
            {
                //On sauvegarde le dernier point car ca represente la deuxieme extremite de la commodité
                extremite2 = lancerRecherche(R, pere, tmpPoints->x, tmpPoints->y);
                n = extremite2;
            }
            else{
                //Ici on est dans les points du milieu
                n = lancerRecherche(R, pere, tmpPoints->x, tmpPoints->y);
            }

            //On ajoute les points dans les voisins les uns des autres, puis on change prev
            ajouterVoisin(prev, n);
            prev = n;

            tmpPoints = tmpPoints->suiv;
        }

        //ajout de la commodité dans le reseau
        R->commodites = creerCellCommodite(extremite1, extremite2, R->commodites);

        //Incremente pour parcourir toutes les chaines
        tmpChaines = tmpChaines->suiv;
    }
    //liberation de l'arbre avec la fonction d'en dessous ne marche pas, a verifier
    liberation_arbreQuat(pere);

    return R;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
leaq -0x10(%rbp), %rsi
leaq -0x18(%rbp), %rdx
leaq -0x20(%rbp), %rcx
leaq -0x28(%rbp), %r8
callq 0x34a0
movsd -0x10(%rbp), %xmm0
movsd -0x20(%rbp), %xmm1
subsd -0x10(%rbp), %xmm1
movsd 0x1104(%rip), %xmm2     # 0x50f0
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movsd -0x18(%rbp), %xmm1
movsd -0x28(%rbp), %xmm2
subsd -0x18(%rbp), %xmm2
movsd 0x10e5(%rip), %xmm3     # 0x50f0
divsd %xmm3, %xmm2
addsd %xmm2, %xmm1
movsd -0x20(%rbp), %xmm2
subsd -0x10(%rbp), %xmm2
movsd -0x28(%rbp), %xmm3
subsd -0x18(%rbp), %xmm3
callq 0x3620
movq %rax, -0x30(%rbp)
movl $0x1, %edi
movl $0x18, %esi
callq 0x10b0
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movl (%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x38(%rbp), %rax
movl $0x0, (%rax)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jge 0x419b
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x50(%rbp)
movq $0x0, -0x58(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x50(%rbp), %rax
movsd (%rax), %xmm0
movq -0x50(%rbp), %rax
movsd 0x8(%rax), %xmm1
callq 0x3e50
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x68(%rbp)
cmpq $0x0, -0x50(%rbp)
je 0x4161
movq $0x0, -0x70(%rbp)
movq -0x50(%rbp), %rax
cmpq $0x0, 0x10(%rax)
jne 0x4119
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x50(%rbp), %rax
movsd (%rax), %xmm0
movq -0x50(%rbp), %rax
movsd 0x8(%rax), %xmm1
callq 0x3e50
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x70(%rbp)
jmp 0x413b
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x50(%rbp), %rax
movsd (%rax), %xmm0
movq -0x50(%rbp), %rax
movsd 0x8(%rax), %xmm1
callq 0x3e50
movq %rax, -0x70(%rbp)
movq -0x68(%rbp), %rdi
movq -0x70(%rbp), %rsi
callq 0x2450
movq -0x70(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x50(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
jmp 0x40cf
movq -0x58(%rbp), %rdi
movq -0x60(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rdx
callq 0x2500
movq %rax, %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x406d
movq -0x30(%rbp), %rdi
callq 0x41b0
movq -0x38(%rbp), %rax
addq $0x70, %rsp
popq %rbp
retq
nop