#include <AlgoGuskov.hh>
Public Member Functions | |
AlgoGuskov () | |
Constructeur. | |
void | init_mesh (OriginalMesh &m) |
initialiser le mesh en ajoutant des propiétés | |
std::vector< Seed > | create_seeds (const unsigned int n, const OriginalMesh &m) |
Créer une liste de n noueds tirés au hazard du mesh. | |
void | run_chartification (OriginalMesh &m, vector< Seed > &seed_list, vector< Tile * > &tiles) |
Exécuter l'algorithme de chartification. | |
void | create_base_mesh (OriginalMesh &m, vector< Tile * > &tiles, OriginalMesh &base_mesh) |
Créer le base mesh. | |
void | initial_parameterization (OriginalMesh &orig_mesh, OriginalMesh const &base_mesh, vector< Tile * > const &tiles) |
Calculer la parametrisation initiale. | |
void | run_resampling (OriginalMesh &m, vector< Tile * > &tiles, OriginalMesh &base_mesh, OriginalMesh &result_mesh) |
Exécuter le "Resampling". | |
Accès aux paramètres de l'algorithme | |
void | set_max_normal_error (double error) |
double | get_max_normal_error () const |
void | set_cubic_spline_delta (unsigned int which_delta, double value) |
double | get_cubic_spline_delta (unsigned int which_delta) const |
void | set_resampling_level (unsigned int level) |
unsigned int | get_resampling_level () const |
void | set_mapping_parameter_h (unsigned int h) |
unsigned int | get_mapping_parameter_h () const |
Private Member Functions | |
std::vector< OriginalMesh::Normal > | get_face_normal (OriginalMesh &result_mesh, OriginalMesh::VertexHandle v) |
index du base mesh triangle dans "one-ring" autour de vApplication d'un point dans le "one-ring" de b dans la région planareobtenir les normals diffirante de chaque face adjacente pour un sommet | |
Fonctions d'aide pour la chartification | |
bool | condition_EB (vector< Tile * > &tiles, Vertex &v, OriginalMesh &m) |
bool | condition_NZ (vector< Tile * > &tiles, Vertex &v, OriginalMesh &m) |
bool | condition_MB (vector< Tile * > &tiles, Vertex &v, OriginalMesh &m) |
bool | condition_MN (vector< Tile * > &tiles, Vertex &v, OriginalMesh &m) |
bool | check_normal_error (vector< Tile * > &tiles, Vertex &v, OriginalMesh &m, OpenMesh::VPropHandleT< unsigned int > &vprop_tile) |
Fonctions d'aide pour les pas "Resampling" et Optimisation | |
double | calculate_cubic_spline (const double r) const |
Calcule "smooth cubic spline" beta(r) (Guskov, p.14). | |
double | metric_space_dist (OriginalMesh::Point const &s, OriginalMesh::Point const &b1, OriginalMesh::Point const &b2, OriginalMesh::Point const &b3) const |
Calcule la distance entre s et b1 dans l'espace métrique défini dans Guskov, p. 13. | |
OriginalMesh::Point | blending (OriginalMesh &m, const vector< Tile * > &tiles, const OriginalMesh &base_mesh, const OriginalMesh::Point s, const OriginalMesh::FaceHandle base_face1, const OriginalMesh::FaceHandle second_base_face) |
Calcul le nouveau ("blended", "resampled") point. | |
bool | triangle_in_D (const OriginalMesh &m, const unsigned int tile_id, const Vertex vertices[3], vector< Tile * > tiles) const |
Vérifier si un triangle de noeuds du mesh original se trouve complétement dans une carte planaire. | |
Fonctions d'aide pour l'optimisation | |
void | optimize_vertex_find_region_interior (OriginalMesh &om, const OriginalMesh &bm, Tile &cur_tile, const OpenMesh::VPropHandleT< double > &vprop_distance, vector< OriginalMesh::Point > &ret_region, Vertex &boundary_start_vertex) |
Trouver sommets sur le maillage de départ qui se trouvent dans "base vertex region". | |
void | optimize_vertex_region (OriginalMesh &om, OriginalMesh &bm, vector< Tile * > &tiles) |
Optimisation 2: "base vertex optimisation". | |
Private Attributes | |
double | max_normal_error |
Erreur normale maximale d'une région pendant la phase de chartification. | |
vector< Vertex > | seed_list |
Liste de seeds autour desquels les régions seront créées. | |
double | delta_cubic_spline [2] |
Les deux paramètres pour le cubic spline (Guskov, p. 14). | |
unsigned int | resampling_level |
Level de resampling. | |
unsigned int | mapping_parameter_h |
Remeshing parameter pour l'application planaire. |
Contient toute la fonctionnalité de l'algorithme.
Les fonctions sont groupées dans plusieurs fichiers .cc par rapport de leurs fonctionnalités.
AlgoGuskov::AlgoGuskov | ( | ) | [inline] |
Constructeur.
NOT IMPLEMENTED
std::vector< OriginalMesh::Normal > AlgoGuskov::get_face_normal | ( | OriginalMesh & | result_mesh, | |
OriginalMesh::VertexHandle | v | |||
) | [private] |
index du base mesh triangle dans "one-ring" autour de vApplication d'un point dans le "one-ring" de b dans la région planareobtenir les normals diffirante de chaque face adjacente pour un sommet
Parcourir les faces adjacentes au sommet v et retourner la differente normal de chaque face
result_mesh | le mesh cree par base mesh | |
v | centre du "one-ring" |
bool AlgoGuskov::condition_EB | ( | vector< Tile * > & | tiles, | |
Vertex & | v, | |||
OriginalMesh & | m | |||
) | [private] |
Vérifie que la condition EB est satisfaite pour toutes les régions.
tiles | vecteur contenant toutes les régions en forme de Tile | |
v | si la condition n'est pas satisfaite v contiendra un noeud choisi à devenir seed dans l'itération suivante | |
m | le mesh |
bool AlgoGuskov::condition_NZ | ( | vector< Tile * > & | tiles, | |
Vertex & | v, | |||
OriginalMesh & | m | |||
) | [private] |
Vérifie que la condition NZ est satisfaite pour toutes les régions.
bool AlgoGuskov::condition_MB | ( | vector< Tile * > & | tiles, | |
Vertex & | v, | |||
OriginalMesh & | m | |||
) | [private] |
Vérifie que la condition MB est satisfaite pour toutes les régions.
bool AlgoGuskov::condition_MN | ( | vector< Tile * > & | tiles, | |
Vertex & | v, | |||
OriginalMesh & | m | |||
) | [private] |
Vérifie que la condition MN est satisfaite pour toutes les régions.
bool AlgoGuskov::check_normal_error | ( | vector< Tile * > & | tiles, | |
Vertex & | v, | |||
OriginalMesh & | m, | |||
OpenMesh::VPropHandleT< unsigned int > & | vprop_tile | |||
) | [private] |
Vérifie pour chaque Tile que l'erreur normale est inférieur à une borne
tiles | vecteur contenant toutes les régions en forme de Tile | |
v | si cette condition n'est pas satisfaite v contiendra un noeud choisi à devenir seed dans l'itération suivante | |
m | le mesh | |
vprop_tile | id de la propiété attribué aux noeuds indiquant la région à laquelle ils appartiennent |
double AlgoGuskov::calculate_cubic_spline | ( | const double | r | ) | const [private] |
Calcule "smooth cubic spline" beta(r) (Guskov, p.14).
double AlgoGuskov::metric_space_dist | ( | OriginalMesh::Point const & | s, | |
OriginalMesh::Point const & | b1, | |||
OriginalMesh::Point const & | b2, | |||
OriginalMesh::Point const & | b3 | |||
) | const [private] |
Calcule la distance entre s et b1 dans l'espace métrique défini dans Guskov, p. 13.
s | point sur le base mesh pour lequel la distance sera calculée | |
b1 | coordonée du premier noeud du base mesh | |
b2 | coordonée du 2ieme noeud du base mesh | |
b3 | coordonée du 3ieme noeud du base mesh |
OriginalMesh::Point AlgoGuskov::blending | ( | OriginalMesh & | m, | |
const vector< Tile * > & | tiles, | |||
const OriginalMesh & | base_mesh, | |||
const OriginalMesh::Point | s, | |||
const OriginalMesh::FaceHandle | base_face1, | |||
const OriginalMesh::FaceHandle | second_base_face | |||
) | [private] |
Calcul le nouveau ("blended", "resampled") point.
m | Le mesh original | |
tiles | Les régions de Voronoi | |
base_mesh | Le base mesh crée à partir du mesh original et les régions de Voronoi | |
s | point sur le base mesh | |
base_face1 | face handle du triangle englobant le point s | |
second_base_face | face handle du deuxieme triangle si s se trouve sur la frontière entre deux triangle |
bool AlgoGuskov::triangle_in_D | ( | const OriginalMesh & | m, | |
const unsigned int | tile_id, | |||
const Vertex | vertices[3], | |||
vector< Tile * > | tiles | |||
) | const [private] |
Vérifier si un triangle de noeuds du mesh original se trouve complétement dans une carte planaire.
Fait simplification: triangle est dans D s'il est dans la région correspondante au base vertex courant où une des régions voisines
m | Le mesh original | |
tile_id | L'index de la région (égal à l'index du base vertex correspondant) | |
vertices | Triangle de noeuds sur le mesh original | |
tiles | Les régions sur le maillage de départ |
void AlgoGuskov::optimize_vertex_find_region_interior | ( | OriginalMesh & | om, | |
const OriginalMesh & | bm, | |||
Tile & | cur_tile, | |||
const OpenMesh::VPropHandleT< double > & | vprop_distance, | |||
vector< OriginalMesh::Point > & | ret_region, | |||
Vertex & | boundary_start_vertex | |||
) | [private] |
Trouver sommets sur le maillage de départ qui se trouvent dans "base vertex region".
Pour une base vertex donné cette fonction devrait trouver les sommets du maillage de départ qui se trouvent dans une région appelée base vertex region par Guskov
NOT IMPLEMENTED!
void AlgoGuskov::optimize_vertex_region | ( | OriginalMesh & | om, | |
OriginalMesh & | bm, | |||
vector< Tile * > & | tiles | |||
) | [private] |
Optimisation 2: "base vertex optimisation".
NOT IMPLEMENTED
void AlgoGuskov::set_max_normal_error | ( | double | error | ) | [inline] |
Mettre l'erreur normale maximale
double AlgoGuskov::get_max_normal_error | ( | ) | const [inline] |
Obtenir l'erreur normale maximale
void AlgoGuskov::set_cubic_spline_delta | ( | unsigned int | which_delta, | |
double | value | |||
) | [inline] |
Mettre un des deux paramètres du cubic spline (delta)
which_delta | Valeur 0 ou 1, accès au delta0 ou delta1 | |
value | nouvelle valeur de delta |
double AlgoGuskov::get_cubic_spline_delta | ( | unsigned int | which_delta | ) | const [inline] |
Obtenir delta
void AlgoGuskov::set_resampling_level | ( | unsigned int | level | ) | [inline] |
Mettre le level de "Resampling3
unsigned int AlgoGuskov::get_resampling_level | ( | ) | const [inline] |
Obtenir le level courant de "Resampling"
void AlgoGuskov::set_mapping_parameter_h | ( | unsigned int | h | ) | [inline] |
Mettre le paramètre de l'application planaire
unsigned int AlgoGuskov::get_mapping_parameter_h | ( | ) | const [inline] |
Obtenir le paramètre de l'application planaire
void AlgoGuskov::init_mesh | ( | OriginalMesh & | m | ) |
initialiser le mesh en ajoutant des propiétés
std::vector< Seed > AlgoGuskov::create_seeds | ( | const unsigned int | n, | |
const OriginalMesh & | m | |||
) |
Créer une liste de n noueds tirés au hazard du mesh.
Noeuds obtenus en divisant l'ensemble de noeuds {1,..., max} en n sous-ensembles: {1... max/n}, {max/n + 1 ... 2max/n} ... { (n-1)/n * max + 1 ... max} et choisir par hazard un noeud dans chacun de ces sous-ensembles.
void AlgoGuskov::run_chartification | ( | OriginalMesh & | m, | |
vector< Seed > & | seed_list, | |||
vector< Tile * > & | tiles | |||
) |
Exécuter l'algorithme de chartification.
Exécuter l'algorithme comme décrit dans le papier de Guskov en construisant l'ensemble de régions de Voronoi
m | mesh sur lequel la chartification doit être exécuté | |
seed_list | liste de seeds à partir de lesquels on commençe la chartification | |
tiles | valeur de retour qui contiendra la liste des Tiles crées |
void AlgoGuskov::create_base_mesh | ( | OriginalMesh & | m, | |
vector< Tile * > & | tiles, | |||
OriginalMesh & | base_mesh | |||
) |
Créer le base mesh.
Parcourir les seeds et les ajouter dans le base mesh pour chaque seed, créer les faces adjacentes avec les autres seeds sur "one-ring"
m | maillage originale | |
tiles | liste des tiles | |
base_mesh | maillage de base |
void AlgoGuskov::initial_parameterization | ( | OriginalMesh & | orig_mesh, | |
OriginalMesh const & | base_mesh, | |||
vector< Tile * > const & | tiles | |||
) |
Calculer la parametrisation initiale.
Parcourir les tiles et créer une premiere parametrisation. Ceci est faite en exploitant la correspondance entre les Voronoi tiles sur le maillage original et le maillage de base. Les coordonées moyennes sont calculées pour chaque sommet par rapport à ces voisins. Pour les sommets qui sont à côté du frontière avec les autres tiles, des points voisins sur le frontière sont calculés. Pour ces points, on trouve des points correspondants sur le base mesh, qui sont ensuite mappés dans R^2. Les points ainsi obtenu servent comme des conditions à bord pour résoudre le problème de "mean-value parametrization". Ceci entraine formuler le système et résoudre un système linéaire dont le matrice est assemblé avec les coordonnées moyennes et le second membre avec les points dans R^2 correspondants au points sur le bord. Le système est résolu avec le méthode de Gradients Bi-Conjugés (BiCGS), implementé parWilly Dorfler
orig_mesh | maillage originale | |
base_mesh | maillage de base | |
tiles | liste des tiles |
void AlgoGuskov::run_resampling | ( | OriginalMesh & | m, | |
vector< Tile * > & | tiles, | |||
OriginalMesh & | base_mesh, | |||
OriginalMesh & | result_mesh | |||
) |
Exécuter le "Resampling".
Le niveau controlle la densité du point de la face. A chaque niveau, pour ajouter les points-échantillons et créer le nouveau mesh selon le base_mesh on déchire chaque face à 4 sous_faces par ajouter les trois sommets medians sur le bords Repositionner les points-échantillons avec le nouvelle posision du point-échantillon que la fonction "blending" donne
m | Le mesh original | |
tiles | Les régions de Voronoi | |
base_mesh | Le base mesh crée à partir du mesh original et les régions de Voronoi | |
result_mesh | Le nouveau mesh crée par resampling |
double AlgoGuskov::max_normal_error [private] |
Erreur normale maximale d'une région pendant la phase de chartification.
Valeur maximale pour l'erreur normale (Guskov, p. 9). Si l'erreur pour une région est plus grande on ajoute un nouveau seed adjacent à l'ancien.
vector<Vertex> AlgoGuskov::seed_list [private] |
Liste de seeds autour desquels les régions seront créées.
double AlgoGuskov::delta_cubic_spline[2] [private] |
Les deux paramètres pour le cubic spline (Guskov, p. 14).
unsigned int AlgoGuskov::resampling_level [private] |
Level de resampling.
unsigned int AlgoGuskov::mapping_parameter_h [private] |
Remeshing parameter pour l'application planaire.
Doit être {0 = normal polar map, 1 = better triangle area distribution} remeshing parameter (Guskov, p.12)