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