#include <Tile.hh>
Accès aux divers itérateurs | |
class | Tile_Vertex_Iter |
class | Tile_Face_Iter |
std::vector< unsigned int >::const_iterator | neighbour_tiles_begin () const |
Donne une iterateur sur l' id du premier tile voisin. | |
std::vector< unsigned int >::const_iterator | neighbour_tiles_end () const |
Donne une iterateur sur l'id du dernier tile voisin. | |
std::list< Vertex >::const_iterator | interior_vertices_begin () const |
Donne une iterateur sur la première noeud qui n'a pas des voisins dans d'autres tiles. | |
std::list< Vertex >::const_iterator | interior_vertices_end () const |
Donne une iterateur sur la dernière noeud qui n'a pas des voisins dans d'autres tiles. | |
std::list< Vertex >::const_iterator | boundary_vertices_begin () const |
Donne une iterateur sur la première noeud qui a des voisins dans d'autres tiles. | |
std::list< Vertex >::const_iterator | boundary_vertices_end () const |
Donne une iterateur sur la dernière noeud qui a des voisins dans d'autres tiles. | |
Tile_Vertex_Iter | vertices_begin () |
Donne une iterateur qui parcourt tous les noeuds appartenant dans cette région. | |
Tile_Face_Iter | faces_begin (OriginalMesh *mesh) |
Retourne un iterateur qui parcourt tous les faces qui ont au moins un noeuds à l'intérieur de la région. | |
Tile_Face_Iter | faces_begin (OriginalMesh *mesh, OriginalMesh::FaceHandle &fh) |
Retourne un iterateur qui parcourt tous les faces qui ont au moins un noeuds à l'intérieur de la région. | |
Public Member Functions | |
Tile (const Vertex tile_seed, const unsigned int tile_id) | |
Constructeur. | |
~Tile () | |
Destructeur. | |
Seed | get_seed () const |
Retourne le seed de la région. | |
const unsigned int | get_id () const |
Retourne l'identifeur de la région. | |
BaseMesh::VertexHandle | get_base_mesh_vertex () const |
Retourne le sommet dans le maillage de base corréspondant au tile. | |
void | set_base_mesh_vertex (BaseMesh::VertexHandle const &bm_vertex) |
Met à jour le sommet dans le maillage de base corréspondant au tile. | |
void | clear () |
Remettre la région à l'état initial. | |
void | add_vertex (Vertex v, bool is_on_tile_boundary, bool is_on_mesh_boundary) |
Ajouter le noeud v à la région. | |
void | change_to_boundary (Vertex v) |
Changer status d'un noeud (intérieur ou sur la frontière avec une autre région). | |
Vertex | reposition_seed (const OriginalMesh &mesh) |
Repositionner le seed au noeud le plus proche au centre de la région. | |
void | boundary_parametrization (OriginalMesh &om, const OriginalMesh &bm, const vector< Tile * > &tiles, map< int, unsigned int > &matrix_pos, SparseMatrix &matrix, double *b_ret_x, double *b_ret_y, OriginalMesh::Point &ret_map_centroid) |
Calculer les conditions aux limites et la solution de départ pour utilisé dans la paramétrisation initiale. | |
double | calculate_error (OriginalMesh &mesh) |
Calculer l'erreur normale décrite dans Guskov, p.9. | |
void | find_neighbours_orders (OriginalMesh &m) |
Calculce les voisins ordonnonées. | |
bool | connected_neighbours (OriginalMesh &m, unsigned int germe1, unsigned int germe2) |
Vérifier si les deux sommets dans la région Omega_b sont connectés ou pas. | |
Vérification des conditions topologiques | |
bool | check_conditions_EB (Vertex &new_seed, const OriginalMesh &mesh) |
Verifie la condition nommée EB dans le papier de Guskov. | |
bool | check_conditions_NZ (Vertex &new_seed, OriginalMesh &mesh) |
Verifie la condition nommée NZ dans le papier de Guskov. | |
bool | check_conditions_MB (Vertex &new_seed, OriginalMesh &mesh) |
Vérifie la condition nommée MB. | |
bool | check_conditions_MN (Vertex &new_seed, OriginalMesh &mesh) |
Vérifie la condition nommée MN. | |
Static Public Member Functions | |
static void | calculate_boundary_lengths (OriginalMesh &m, const vector< Tile * > &tiles) |
Calculce les longueurs des frontières entre les régions. | |
Private Member Functions | |
void | calculate_boundary_neighbours (OriginalMesh const &m) |
Créer un map de connectivité pour les sommets sur le bord de la tile. | |
Private Attributes | |
const unsigned int | id |
Seed | seed |
BaseMesh::VertexHandle | base_mesh_vertex |
bool | boundary_neighbours_calculated |
std::map< int, std::list< int > * > | boundary_neighbours |
list< Vertex > | interior_vertices |
Contient tous les noeuds qui sont à l'intérieur de la région. | |
list< Vertex > | boundary_vertices |
Contient tous les noeuds qui ont au moins un voisin appartenant à une autre région. | |
unsigned int | no_vertices_on_mesh_boundary |
Nombre de noeuds qui se trouve sur des frontières de la surface du mesh. | |
vector< unsigned int > | neighbour_tiles |
Liste des tiles (identifiée par leurs id) qui sont voisins à ce tile. | |
Static Private Attributes | |
static TableauBiDim< double > | tile_boundary_length |
Elle est realisee en utilisant std::list qui contient tous les noeuds apartennant au tile. En plus le seed est memorise.
Tile::Tile | ( | const Vertex | tile_seed, | |
const unsigned int | tile_id | |||
) |
Constructeur.
tile_seed,: | seed de la nouvelle région | |
tile_id,: | id de la région (pas nécessairement unique) |
Tile::~Tile | ( | ) | [inline] |
Destructeur.
void Tile::calculate_boundary_neighbours | ( | OriginalMesh const & | m | ) | [private] |
Créer un map de connectivité pour les sommets sur le bord de la tile.
Pour chaque sommet du tile ayant un voisin dans une autre tile (sommet dit "sur le bord"), cette méthode trouve les sommets voisins sur le bord. Il stocke dans le map boundary_neighbours la liste de ces voisins pour chaque sommet sur le bord.
m | Le mesh |
std::vector< unsigned int >::const_iterator Tile::neighbour_tiles_begin | ( | ) | const |
Donne une iterateur sur l' id du premier tile voisin.
std::vector< unsigned int >::const_iterator Tile::neighbour_tiles_end | ( | ) | const |
Donne une iterateur sur l'id du dernier tile voisin.
std::list< Vertex >::const_iterator Tile::interior_vertices_begin | ( | ) | const |
Donne une iterateur sur la première noeud qui n'a pas des voisins dans d'autres tiles.
std::list< Vertex >::const_iterator Tile::interior_vertices_end | ( | ) | const |
Donne une iterateur sur la dernière noeud qui n'a pas des voisins dans d'autres tiles.
std::list< Vertex >::const_iterator Tile::boundary_vertices_begin | ( | ) | const |
Donne une iterateur sur la première noeud qui a des voisins dans d'autres tiles.
std::list< Vertex >::const_iterator Tile::boundary_vertices_end | ( | ) | const |
Donne une iterateur sur la dernière noeud qui a des voisins dans d'autres tiles.
Tile_Vertex_Iter Tile::vertices_begin | ( | ) |
Donne une iterateur qui parcourt tous les noeuds appartenant dans cette région.
Tile_Face_Iter Tile::faces_begin | ( | OriginalMesh * | mesh | ) |
Retourne un iterateur qui parcourt tous les faces qui ont au moins un noeuds à l'intérieur de la région.
mesh | mesh dans lequel ce Tile représente une région |
Tile_Face_Iter Tile::faces_begin | ( | OriginalMesh * | mesh, | |
OriginalMesh::FaceHandle & | fh | |||
) |
Retourne un iterateur qui parcourt tous les faces qui ont au moins un noeuds à l'intérieur de la région.
mesh | mesh dans lequel ce Tile représente une région | |
fh | face handle du triangle qui doit être parcouru au premier |
Seed Tile::get_seed | ( | ) | const [inline] |
Retourne le seed de la région.
const unsigned int Tile::get_id | ( | ) | const [inline] |
Retourne l'identifeur de la région.
BaseMesh::VertexHandle Tile::get_base_mesh_vertex | ( | ) | const [inline] |
Retourne le sommet dans le maillage de base corréspondant au tile.
void Tile::set_base_mesh_vertex | ( | BaseMesh::VertexHandle const & | bm_vertex | ) | [inline] |
Met à jour le sommet dans le maillage de base corréspondant au tile.
void Tile::clear | ( | ) |
Remettre la région à l'état initial.
L'appel vide les listes des noeuds, seulement le seed est gardé.
void Tile::add_vertex | ( | Vertex | v, | |
bool | is_on_tile_boundary, | |||
bool | is_on_mesh_boundary | |||
) |
Ajouter le noeud v à la région.
v | noeud à ajouter à la région | |
is_on_tile_boundary | doit être mis à vrai ssi noeud v a un voisin appartenant à une autre région (si ce n'est pas encore certain mettre à faux et utiliser change_to_boundary plus tard) | |
is_on_mesh_boundary | doit être mis à vrai ssi noeud v se trouve sur une frontière du mesh |
void Tile::change_to_boundary | ( | Vertex | v | ) |
Changer status d'un noeud (intérieur ou sur la frontière avec une autre région).
Noeud v était mémorisé comme noeud intérieur mais en cours de l'algorithme on a vu qu'il a des voisins appartenant déjà à d'autres régions Attention: Comportement indéfini si vertex n'était pas encore ajouté à la région (avec add_vertex)!
v | vertex à changer |
Vertex Tile::reposition_seed | ( | const OriginalMesh & | mesh | ) |
Repositionner le seed au noeud le plus proche au centre de la région.
Réalise "repositionning" décrit dans l'algo de Guskov, p 9
void Tile::boundary_parametrization | ( | OriginalMesh & | om, | |
const OriginalMesh & | bm, | |||
const vector< Tile * > & | tiles, | |||
map< int, unsigned int > & | matrix_pos, | |||
SparseMatrix & | matrix, | |||
double * | b_ret_x, | |||
double * | b_ret_y, | |||
OriginalMesh::Point & | ret_map_centroid | |||
) |
Calculer les conditions aux limites et la solution de départ pour utilisé dans la paramétrisation initiale.
om | Maillage de départ | |
bm | Maillage de base | |
tiles | Les tiles | |
matrix_pos | L'indexation utilisé dans l'assemblage du système linéaire | |
matrix | La matrice du système | |
b_ret_x | Tableau dans laquelle la coordonnée x du second membre du système sera stockée (paramètre de rétour) | |
b_ret_y | Tableau dans laquelle la coordonnée y du second membre du système sera stockée (paramètre de rétour) | |
ret_map_centroid | Centroid des points dans R^2 corréspondants aux point sur le frontière du tile, utilisé comme solution initiale (paramètre de rétour) |
void Tile::calculate_boundary_lengths | ( | OriginalMesh & | m, | |
const vector< Tile * > & | tiles | |||
) | [static] |
Calculce les longueurs des frontières entre les régions.
Calcule la longueur des frontières entre tous les paires de régions. Nous utilisons la définition de la frontière entre deux régions donnée dans Klein et al "Vertex-Based Triangulation of Meshes", page 4 Le résultat sera mémorisé dans tile_boundary_length
m | Le mesh | |
tiles | vector contenant les différents Tile |
bool Tile::check_conditions_EB | ( | Vertex & | new_seed, | |
const OriginalMesh & | mesh | |||
) |
Verifie la condition nommée EB dans le papier de Guskov.
Si la region contient des noeuds qui se trouvent sur la limitation de la surface (verifié avec mesh.is_boundary(vertex) ) et le seed n'en est pas un la fonction cherche un noeud quelconque sur la limitation dans cette region.
bool Tile::check_conditions_NZ | ( | Vertex & | new_seed, | |
OriginalMesh & | mesh | |||
) |
Verifie la condition nommée NZ dans le papier de Guskov.
Si la region contient des noeuds sur des limitations de la surface cette fonction verifie que ces trous ne causent pas de genus. Un trou est un genus ssi il se trouve complètement à l'intérieur de la région. Ayant déjà vérifié la condition EB le seed se trouve forcement sur la frontière d'un trou. On verifie donc d'abord si ce trou forme un genus en parcourant la frontière du trou: Ssi on sort de la région le trou n'est pas un genus.
bool Tile::check_conditions_MB | ( | Vertex & | new_seed, | |
OriginalMesh & | mesh | |||
) |
Vérifie la condition nommée MB.
La condition est vérifié si le bord du tile consiste d'une seule component connexe. La vérification est faite en parcourant les noeuds dans boundary_vertices qui sont connecté à un noeud donné à l'aide du methode calculate_boundary_neighbours. Si on visite dans cette façon tous les noeuds dans boundary_vertices, la condition est vérifiée, sinon on crée un nouvel germe sur un noeud voisin du germe courant.
new_seed | Vertex dans lequel le methode stocke le nouvel germe en cas de violation de la condition (si on renvoie false) | |
mesh | Le mesh |
bool Tile::check_conditions_MN | ( | Vertex & | new_seed, | |
OriginalMesh & | mesh | |||
) |
Vérifie la condition nommée MN.
La condition est vérifié si le bord de chaque tile avec chacun de ces tiles voisins consiste en un seul component connexe. La vérification est faite en d'abord groupant les noeuds dans boundary_vertices après les tiles dans lesquelles ils sont des voisins. Ensuite, pour chaque groupe, un component connexe est trouvé en parcourant les noeuds connecté à un noeud donné (à l'aide du methode calculate_boundary_neighbours). Si ce componant ne contient pas tous les noeuds du group, on a trouvé une violation. Dans ce cas, on met un nouvel germe sur un noeud dans le plus court du component connexe parcouru et un autre component connexe. Ceci est une approximation des longeurs des courbes de frontières associées.
new_seed | Vertex dans lequel le methode stocke le nouvel germe en cas de violation de la condition (si on renvoie false) | |
mesh | Le mesh |
double Tile::calculate_error | ( | OriginalMesh & | mesh | ) |
Calculer l'erreur normale décrite dans Guskov, p.9.
void Tile::find_neighbours_orders | ( | OriginalMesh & | m | ) |
Calculce les voisins ordonnonées.
Parcourir la frontière en mémorisant les tiles voisins rencontrés
m | Le maillage de départ |
bool Tile::connected_neighbours | ( | OriginalMesh & | m, | |
unsigned int | germe1, | |||
unsigned int | germe2 | |||
) |
Vérifier si les deux sommets dans la région Omega_b sont connectés ou pas.
m | Le maillage de départ | |
germe1 | un sommet | |
germe2 | autre sommet |
friend class Tile_Vertex_Iter [friend] |
friend class Tile_Face_Iter [friend] |
const unsigned int Tile::id [private] |
Identifieur unique de la région
Seed Tile::seed [private] |
VertexHandle indiquant le seed de cette région
BaseMesh::VertexHandle Tile::base_mesh_vertex [private] |
Sommet dans maillage de base correspondant au tile
bool Tile::boundary_neighbours_calculated [private] |
Indique si le map boundary_neighbours et à jour
std::map< int, std::list< int >* > Tile::boundary_neighbours [private] |
Map de connectivité mise à jour par la methode calculate_boundary_neighbours
TableauBiDim< double > Tile::tile_boundary_length [static, private] |
Après l'appel de calculate_boundary_lengths cet array contient les longueurs des frontières entre les régions
list<Vertex> Tile::interior_vertices [private] |
Contient tous les noeuds qui sont à l'intérieur de la région.
Ce sont les noeuds qui n'ont pas de voisins appartenant à une autre région. intersect(interior_vertices, boundary_vertices) = {} (Attention: boundary ici ne dit rien sur les frontière de la surface du mesh!)
list<Vertex> Tile::boundary_vertices [private] |
Contient tous les noeuds qui ont au moins un voisin appartenant à une autre région.
intersect(interior_vertices, boundary_vertices) = {} (Attention: boundary ici ne dit rien sur les frontière de la surface du mesh!)
unsigned int Tile::no_vertices_on_mesh_boundary [private] |
Nombre de noeuds qui se trouve sur des frontières de la surface du mesh.
( = #{v | mesh.is_boundary(v) et v element de la région} ) Attention: mesh_boundary = noeuds qui se trouve sur la surface du mesh (cad un arc adjacent est sur la frontiere)
vector< unsigned int > Tile::neighbour_tiles [private] |
Liste des tiles (identifiée par leurs id) qui sont voisins à ce tile.