From 8276289a889862d3ceb1b04bec4e9fdf97504bc3 Mon Sep 17 00:00:00 2001
From: poulpe <poulpe@localhost.localdomain>
Date: Wed, 12 May 2021 16:20:33 +0200
Subject: [PATCH] [Update] Add symmetry function with quadtree
 (horiz,vertical,central)

---
 main.c     |  3 ++-
 quadtree.c | 63 +++++++++++++++++++++++++++++-------------------------
 quadtree.h | 10 ++++++++-
 3 files changed, 45 insertions(+), 31 deletions(-)

diff --git a/main.c b/main.c
index 682a15d..dad4f0b 100644
--- a/main.c
+++ b/main.c
@@ -30,6 +30,7 @@ int main()
     // matrix_alloc(&mat,p->pixels.lin,p->pixels.col);
     // matrix_init(&mat);
 
+    quadtree_central_symetry(tree);
     quadtree_tree2matrix(tree,&pp->pixels);
     // // matrix_print(mat);
 
@@ -42,7 +43,7 @@ int main()
 
     matrix_destroy(&p->pixels);
     matrix_destroy(&pp->pixels);
-    quadtree_tree_destroy_clean(&tree);
+    quadtree_tree_destroy(&tree);
     free(p);
     free(pp);
     return 0;
diff --git a/quadtree.c b/quadtree.c
index 61bd55d..2246883 100644
--- a/quadtree.c
+++ b/quadtree.c
@@ -104,9 +104,9 @@ node *quadtree_position(int32_t li, int32_t col, node *a, int32_t d)
     node *crt = a;
     do
     {
-        int32_t ligne = (li>>d) & 1; // Permet de sélectionne le bit à considérer en fonction de la profondeur; Exemple: 10 >> 1 = 1
-        int32_t colonne = (col>>d) & 1; //Exemple: 10 >> 1 = 1;
-        int32_t index = (ligne<<1) | colonne; // Exemple: 1<<1 = 10 | 1(col) = 11=>3
+        int32_t ligne = (li >> d) & 1;          // Permet de sélectionne le bit à considérer en fonction de la profondeur; Exemple: 10 >> 1 = 1
+        int32_t colonne = (col >> d) & 1;       //Exemple: 10 >> 1 = 1;
+        int32_t index = (ligne << 1) | colonne; // Exemple: 1<<1 = 10 | 1(col) = 11=>3
 
         crt = crt->child[index];
         d--;
@@ -119,9 +119,9 @@ double quadtree_position_value(int32_t li, int32_t col, node *a, int32_t d)
     node *crt = a;
     do
     {
-        int32_t ligne = (li>>d) & 1; // Permet de sélectionne le bit à considérer en fonction de la profondeur; Exemple: 10 >> 1 = 1
-        int32_t colonne = (col>>d) & 1; //Exemple: 10 >> 1 = 1;
-        int32_t index = (ligne<<1) | colonne; // Exemple: 1<<1 = 10 | 1(col) = 11=>3
+        int32_t ligne = (li >> d) & 1;          // Permet de sélectionne le bit à considérer en fonction de la profondeur; Exemple: 10 >> 1 = 1
+        int32_t colonne = (col >> d) & 1;       //Exemple: 10 >> 1 = 1;
+        int32_t index = (ligne << 1) | colonne; // Exemple: 1<<1 = 10 | 1(col) = 11=>3
 
         crt = crt->child[index];
         d--;
@@ -154,45 +154,50 @@ void quadtree_tree2matrix(node *tree, matrix *mat)
     }
 }
 
-void quadtree_vertical_symetry(node *tree)
-{
-    // Inversé les colones
-}
-
+// OK
 void quadtree_horizontal_symetry(node *tree)
 {
+    if (NULL != tree)
+    {
+        for (uint32_t i = 0; i < CHILDREN; i += 1)
+        {
+            quadtree_horizontal_symetry(tree->child[i]);
+        }
+        quadtree_swap((void**)&tree->child[0], (void**)&tree->child[1]);
+        quadtree_swap((void**)&tree->child[2], (void**)&tree->child[3]);
+    }
 }
 
-void quadtree_central_symetry(node *tree)
-{
-}
-
-void quadtree_tree_destroy(node **tree)
+// OK
+void quadtree_vertical_symetry(node *tree)
 {
-    node *a = *tree;
-    if (a->child[0] == NULL)
-    {
-        free(a);
-    }
-    else
+    if (NULL != tree)
     {
         for (uint32_t i = 0; i < CHILDREN; i += 1)
         {
-            quadtree_tree_destroy(&a->child[i]);
+            quadtree_vertical_symetry(tree->child[i]);
         }
+        quadtree_swap((void**)&tree->child[0], (void**)&tree->child[2]);
+        quadtree_swap((void**)&tree->child[1], (void**)&tree->child[3]);
     }
 }
 
-void quadtree_tree_destroy_clean(node **tree)
+void quadtree_central_symetry(node *tree)
+{
+    quadtree_vertical_symetry(tree);
+    quadtree_horizontal_symetry(tree);
+}
+
+void quadtree_tree_destroy(node **tree)
 {
-    if(NULL != *tree)
+    if (NULL != *tree)
     {
-        if(!quadtree_is_leaf(*tree))
+        if (!quadtree_is_leaf(*tree))
         {
-            for (uint32_t i = 0; i < CHILDREN; i+=1)
+            for (uint32_t i = 0; i < CHILDREN; i += 1)
             {
-                quadtree_tree_destroy_clean(&(*tree)->child[i]);
-            }            
+                quadtree_tree_destroy(&(*tree)->child[i]);
+            }
         }
         else
         {
diff --git a/quadtree.h b/quadtree.h
index 9691080..22d3fa9 100644
--- a/quadtree.h
+++ b/quadtree.h
@@ -41,4 +41,12 @@ void quadtree_tree_destroy(node **tree);
 
 void quadtree_tree2matrix(node *tree,matrix* mat);
 
-void quadtree_tree_destroy_clean(node **tree);
\ No newline at end of file
+void quadtree_tree_destroy_clean(node **tree);
+
+double quadtree_position_value(int32_t li, int32_t col, node *a, int32_t d);
+
+void quadtree_horizontal_symetry(node *tree);
+
+void quadtree_vertical_symetry(node *tree);
+
+void quadtree_central_symetry(node *tree);
\ No newline at end of file
-- 
GitLab