/*************************************/ /* Auteur : Rémi Synave */ /* Date de création : 01/11/07 */ /* Date de modification : 15/03/15 */ /* Version : 0.4 */ /*************************************/ /*************************************/ /* Auteur : Romain Leguay */ /* Nguyen Haiduong */ /* Marianne Fichoux */ /* Date de modification : 06/06/09 */ /* Version : 0.2 */ /*************************************/ /***************************************************************************/ /* This file is part of a2ri. */ /* */ /* a2ri is free software: you can redistribute it and/or modify it */ /* under the terms of the GNU Lesser General Public License as published */ /* by the Free Software Foundation, either version 3 of the License, or */ /* (at your option) any later version. */ /* */ /* a2ri is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU Lesser General Public License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public */ /* License along with a2ri. */ /* If not, see . */ /***************************************************************************/ #ifndef SPACE_PARTITION__H #define SPACE_PARTITION__H #include #include #include "point.h" #include "geometry.h" #include "util.h" #define REJECT_ZERO_LENGTH 0 #define ACCEPT_ZERO_LENGTH 1 typedef struct { point3d *list_point; int nb_point; } sp_depth, *pt_sp_depth; typedef struct { sp_depth *z; } sp_height; typedef struct { sp_height *y; } sp_width; /** structure de partition de l'espace avec un tableau à 3 dimensions contenant des listes de points */ typedef struct { point3d ptmin, ptmax; int nb_part_x, nb_part_y, nb_part_z; sp_width *x; } space_partition; /** Initialisation d'une partition de l'espace @param sp la partition de l'espace @return aucun */ void space_partition_init ( space_partition * sp); /** Création d'une nouvelle partition de l'espace @param sp la partition de l'espace @param min coin inférieur @param max coin supérieur @param nbpartx nombre de partition en X @param nbparty nombre de partition en Y @param nbpartz nombre de partition en Z @return aucun */ void space_partition_new ( space_partition * sp, const point3d * const min, const point3d * const max, int nbpartx, int nbparty, int nbpartz); /** Désallocation mémoire de la partition de l'espace @param sp la partition de l'espace @return aucun */ void space_partition_free ( space_partition * sp); /** Affichage simple d'une partition de l'espace @param sp la partition de l'espace @return aucun */ void space_partition_display ( const space_partition * const sp); /** Affichage detaillé d'une partition de l'espace @param sp la partition de l'espace @return aucun */ void space_partition_display_detail ( const space_partition * const sp); /** Affichage detaillé d'une partition de l'espace @param sp la partition de l'espace @return aucun */ void space_partition_display_high_detail ( const space_partition * const sp); /** Calcule les numeros de cases du point @param sp la partition de l'espace @param p le point @param x le numéro de case en X @param y le numéro de case en Y @param z le numéro de case en Z @return aucun **/ void space_partition_get_XYZ ( const space_partition * const sp, const point3d * const p, int *x, int *y, int *z); /** Ajout d'un point dans la partition de l'espace @param sp la partition de l'espace @param p le point à ajouter @return aucun */ void space_partition_add_point ( space_partition * sp, const point3d * const p); /** Calcule le point moyen d'une cellule @param sp la partition de l'espace @param cell_x numéro de la cellule en X @param cell_y numéro de la cellule en Y @param cell_z numéro de la cellule en Z @param aucun */ point3d space_partition_get_average ( const space_partition * const sp, int cell_x, int cell_y, int cell_z); /** Calcule le point milieu d'une cellule @param sp la partition de l'espace @param cell_x numéro de la cellule en X @param cell_y numéro de la cellule en Y @param cell_z numéro de la cellule en Z @param aucun */ point3d space_partition_get_middle ( const space_partition * const sp, int cell_x, int cell_y, int cell_z); /** Retourne le nombre total de points de la partition de l'espace @param sp la partition de l'espace @return le nombre de points */ int space_partition_nb_points ( const space_partition * const sp); /** Retourne les cases adjacentes à celle contenant le point passé en paramètre est à une distance maximum de distance @param sp la partition de l'espace @param pt le point servant à sélectionner la case centrale @param distance profondeur de la sélection @param list liste des cases sélectionnées @param size taille de la liste retournée @return aucun **/ void space_partition_get_neighbour ( const space_partition * const sp, const point3d * const pt, int distance, pt_sp_depth ** list, int *size); /** Retourne le point le plus proche d'un point donné @param sp la partition de l'espace @param pt le point dont on cherche le point le plus proche dans la partition de l'espace @param near_pt point le plus proche de la partition de l'espace @param length longueur entre les deux points @return un pointeur vers le point de la partition le plus paroche de celui recherche */ point3d * space_partition_nearest_point ( const space_partition * const sp, const point3d * const pt, point3d * near_pt, double *length, int acceptzerolength); /** Retourne un pointeur vers le point de la partition s'il existe @param sp la partition de l'espace @param pt le point que l'on cherche dans la partition @return un pointeur vers le point cherché, NULL sinon */ point3d * space_partition_contains_point ( const space_partition * const sp, const point3d * const pt); /** Enlève les outliers @param sp la partition de l'espace @return aucun */ void space_partition_remove_outliers ( space_partition * sp); /** retourne une liste de pointeur sur des point3d contenus dans les cellules passées en paramètre @param sp la partition de l'espace @param listcellx liste des index des cellules en X @param listcelly liste des index des cellules en Y @param listcellz liste des index des cellules en Z @param sizelist taille de la liste des cellules @param listpoint liste des pointeurs vers les point3d @param sizelistpoint taille de la liste de pointeur @return aucun **/ void space_partition_get_points_cells ( const space_partition * const sp, const int * const listcellx, const int * const listcelly, const int * const listcellz, int sizelist, pt_point3d ** listpoint, int *sizelistpoint); /** Calcule la Bounding Box de la liste de points @param sp la partition de l'epace @param list la list de point @param size nombre de points @param xmin cellule minimale en X @param ymin cellule minimale en Y @param zmin cellule minimale en Z @param xmax cellule maximale en X @param ymax cellule maximale en Y @param zmax cellule maximale en Z **/ void space_partition_bounding_box ( const space_partition * const sp, const point3d * const list, int size, int *xmin, int *ymin, int *zmin, int *xmax, int *ymax, int *zmax); /** Retourne les cases adjacentes et elle-même à celle contenant le point passé en paramètre est à une distance maximum de distance @param sp la partition de l'espace @param pt le point servant à sélectionner la case centrale @param list liste des cases sélectionnées @param size taille de la liste retournée @return aucun **/ void space_partition_get_list_near_point ( const space_partition * const sp, const point3d * const pt, pt_sp_depth ** list, int *size); #endif