// File: /workspace/github_c_makefile_star2_O2/trumabrat[P]GrandProjet/ArbreQuat.c
// Function: insererNoeudArbre
void insererNoeudArbre(Noeud *n, ArbreQuat **a, ArbreQuat *parent){
    if (*a == NULL){
        // Si il n'existe pas de abre a crée, on crée un nouveau et on insére dans l'un des fils du parent
        /*L'hypoyhèse est que si *a==NULL, alors ca veut dire l'enfant du parent ou doit aller le noeud est vide
        Si ce n'est pas le cas, cette fonction va écraser ce qui se trouver dans cet enfant du parent*/

        //Longueur et largeur de l'arbre a
        double newCoteX = parent->coteX / 2.0;
        double newCoteY = parent->coteY / 2.0;

        //cas sud-ouest
        if (n->x < parent->xc && n->y < parent->yc)
        {
            *a = creerArbreQuat(parent->xc - newCoteX / 2.0, parent->yc - newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->so = *a;
        }

        //cas sud-est
        if (n->x >= parent->xc && n->y < parent->yc){
            *a = creerArbreQuat(parent->xc + newCoteX / 2.0, parent->yc - newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->se = *a;
        }

        //cas nord-ouest
        if (n->x < parent->xc && n->y >= parent->yc){
            *a = creerArbreQuat(parent->xc - newCoteX / 2.0, parent->yc + newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->no = *a;
        }

        //cas nord-est
        if(n->x >= parent->xc && n->y >= parent->yc){
            *a = creerArbreQuat(parent->xc + newCoteX / 2.0, parent->yc + newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->ne = *a;
        }

        return;
    }

    else{
        if ((*a)->noeud != NULL){
            /*Ici on considère le cas ou l'arbre a est une feuille (noeud présent).
            L'arbre cesse alors d'etre une feuille mais devient une racine, et ces dans ses feuilles
            qu'on va vouloir insérer les valeurs.Si les points sont très prêts les uns des autres, on
            peut également imaginer qu'on doit transformer la racine des enfants de l'arbre a aussi.*/

            //a devient le parent, on transfere son noeud vers l'un des fils de a.
            ArbreQuat *tmp = NULL;
            insererNoeudArbre((*a)->noeud, &tmp, *a);
            (*a)->noeud = NULL;

            insererNoeudArbre(n, a, parent);
            //Maintenant, la feuille est devenu une cellule interne, donc la clause d'après va décider ou mettre le noeud.
            //Si le noeud doit aller dans la feuille déjà occupé par le noeud qui existait dans *(a)->noeud, le procès se repète.
        }

        else{
            /*si on se trouve dans une cellule interne, on cherche ou placer le noeud n en comparant les coordonées du noeud
            par rapport au centre. On peut alors soit arriver rencontrer l'espace libre pour insérer notre noeud, soit rencontrer
            une feuille, ce qui va être géré dans le bloc d'avant.*/

            //cas sud-ouest
            if (n->x < (*a)->xc && n->y < (*a)->yc)
            {
                insererNoeudArbre(n, &((*a)->so), *a);
            }

            //cas sud-est
            if (n->x >= (*a)->xc && n->y < (*a)->yc){
               insererNoeudArbre(n, &((*a)->se), *a);
            }

            //cas nord-ouest
            if (n->x < (*a)->xc && n->y >= (*a)->yc){
                insererNoeudArbre(n, &((*a)->no), *a);
            }

            //cas nord-est
            if(n->x >= (*a)->xc && n->y >= (*a)->yc){
                insererNoeudArbre(n, &((*a)->ne), *a);
            }
        }
    }
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
leaq 0x10(%rsp), %r12
movq (%r14), %rdx
testq %rdx, %rdx
je 0x2899
movq 0x20(%rdx), %rdi
testq %rdi, %rdi
je 0x27e8
andq $0x0, 0x10(%rsp)
movq %r12, %rsi
callq 0x27a2
movq (%r14), %rax
andq $0x0, 0x20(%rax)
jmp 0x27bb
movsd 0x8(%rbx), %xmm0
movsd (%rdx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x281b
movsd 0x8(%rdx), %xmm2
ucomisd 0x10(%rbx), %xmm2
jbe 0x281b
leaq 0x28(%rdx), %rsi
movq %rbx, %rdi
callq 0x27a2
movsd 0x8(%rbx), %xmm0
movq (%r14), %rdx
movsd (%rdx), %xmm1
ucomisd %xmm1, %xmm0
jb 0x2845
movsd 0x8(%rdx), %xmm2
ucomisd 0x10(%rbx), %xmm2
jbe 0x2845
leaq 0x30(%rdx), %rsi
movq %rbx, %rdi
callq 0x27a2
movsd 0x8(%rbx), %xmm0
movq (%r14), %rdx
movsd (%rdx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x2857
movsd 0x10(%rbx), %xmm2
ucomisd 0x8(%rdx), %xmm2
jae 0x285c
movq %rdx, %r15
jmp 0x2875
leaq 0x38(%rdx), %rsi
movq %rbx, %rdi
callq 0x27a2
movsd 0x8(%rbx), %xmm0
movq (%r14), %r15
movsd (%r15), %xmm1
ucomisd %xmm1, %xmm0
jb 0x2a2c
movsd 0x10(%rbx), %xmm0
leaq 0x40(%r15), %r14
ucomisd 0x8(%r15), %xmm0
jae 0x27bb
jmp 0x2a2c
movsd 0x9af(%rip), %xmm1      # 0x3250
movsd 0x10(%r15), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, 0x8(%rsp)
movsd 0x18(%r15), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, (%rsp)
movsd 0x8(%rbx), %xmm2
movsd (%r15), %xmm0
ucomisd %xmm2, %xmm0
jbe 0x2922
movsd 0x8(%r15), %xmm1
ucomisd 0x10(%rbx), %xmm1
jbe 0x2922
movsd 0x8(%rsp), %xmm2
movapd %xmm2, %xmm3
movsd 0x961(%rip), %xmm4      # 0x3250
mulsd %xmm4, %xmm3
subsd %xmm3, %xmm0
movsd (%rsp), %xmm3
movapd %xmm3, %xmm5
mulsd %xmm4, %xmm5
subsd %xmm5, %xmm1
callq 0x274b
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x28(%r15)
movsd 0x8(%rbx), %xmm2
movsd (%r15), %xmm0
ucomisd %xmm0, %xmm2
jb 0x297e
movsd 0x8(%r15), %xmm1
ucomisd 0x10(%rbx), %xmm1
jbe 0x297e
movsd 0x8(%rsp), %xmm2
movapd %xmm2, %xmm5
movsd 0x909(%rip), %xmm4      # 0x3250
mulsd %xmm4, %xmm5
addsd %xmm0, %xmm5
movsd (%rsp), %xmm3
movapd %xmm3, %xmm0
mulsd %xmm4, %xmm0
subsd %xmm0, %xmm1
movapd %xmm5, %xmm0
callq 0x274b
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x30(%r15)
movsd 0x8(%rbx), %xmm2
movsd (%r15), %xmm0
ucomisd %xmm2, %xmm0
jbe 0x29da
movsd 0x10(%rbx), %xmm1
movsd 0x8(%r15), %xmm5
ucomisd %xmm5, %xmm1
jb 0x29da
movsd 0x8(%rsp), %xmm2
movapd %xmm2, %xmm1
movsd 0x8a9(%rip), %xmm4      # 0x3250
mulsd %xmm4, %xmm1
subsd %xmm1, %xmm0
movsd (%rsp), %xmm3
movapd %xmm3, %xmm1
mulsd %xmm4, %xmm1
addsd %xmm5, %xmm1
callq 0x274b
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x38(%r15)
movsd 0x8(%rbx), %xmm2
movsd (%r15), %xmm0
ucomisd %xmm0, %xmm2
jb 0x2a2c
movsd 0x10(%rbx), %xmm1
movsd 0x8(%r15), %xmm5
ucomisd %xmm5, %xmm1
jb 0x2a2c
movsd 0x8(%rsp), %xmm2
movapd %xmm2, %xmm4
movsd 0x84d(%rip), %xmm1      # 0x3250
mulsd %xmm1, %xmm4
addsd %xmm0, %xmm4
movsd (%rsp), %xmm3
mulsd %xmm3, %xmm1
addsd %xmm5, %xmm1
movapd %xmm4, %xmm0
callq 0x274b
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x40(%r15)
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq