Mesh is now templated by a triangulation

This commit is contained in:
Laurent Rineau 2002-04-08 12:12:28 +00:00
parent 896c410692
commit ded42572e9
2 changed files with 109 additions and 97 deletions

View File

@ -29,34 +29,43 @@ CGAL_BEGIN_NAMESPACE
// };
template <class Gt, class Tds, class Mtraits = void>
class Mesh:
public Constrained_Delaunay_triangulation_2 <Gt, Tds, Exact_predicates_tag >
template <class Tr, class Mtraits = void>
class Mesh: public Tr
{
public:
// QWidget *viewer;
typedef Gt Triangulation_geom_traits;
typedef Tds Triangulation_data_structure;
typedef typename Gt::FT FT;
typedef Tr Triangulation;
typedef typename Triangulation::Geom_traits Geom_traits;
typedef typename Tr::Triangulation_data_structure Tds;
typedef typename Geom_traits::FT FT;
typedef FT Length;
typedef FT Square_length;
typedef CGAL::Triangulation_2<Gt, Tds> Tr;
typedef CGAL::Constrained_triangulation_2<Gt, Tds, Exact_predicates_tag> Ct; // used for
typedef Tr Ct;
// typedef CGAL::Constrained_triangulation_2<Gt, Tds, Exact_predicates_tag> Ct; // used for
// special_insert_in_edge TODO: is it necessar?
typedef CGAL::Constrained_Delaunay_triangulation_2<Gt, Tds, Exact_predicates_tag> CDt;
typedef Tr CDt;
// typedef CGAL::Constrained_Delaunay_triangulation_2<Gt, Tds, Exact_predicates_tag> CDt;
// typedef typename CDt::Constraint Constraint;
typedef typename CDt::Vertex Vertex;
typedef typename CDt::Edge Edge;
typedef typename CDt::Face_handle Face_handle;
typedef typename CDt::Vertex_handle Vertex_handle;
typedef typename CDt::Finite_faces_iterator Finite_faces_iterator;
typedef typename Tr::Vertex Vertex;
typedef typename Tr::Edge Edge;
typedef typename Tr::Edge_iterator Edge_iterator;
typedef typename Tr::Edge_circulator Edge_circulator;
typedef typename Tr::Face_handle Face_handle;
typedef typename Tr::Face_iterator Face_iterator;
typedef typename Tr::Face_circulator Face_circulator;
typedef typename Tr::Vertex_handle Vertex_handle;
typedef typename Tr::Vertex_circulator Vertex_circulator;
typedef typename Tr::Vertex_iterator Vertex_iterator;
typedef typename Tr::Finite_faces_iterator Finite_faces_iterator;
typedef typename Tr::Locate_type Locate_type;
typedef std::pair<Vertex_handle,Vertex_handle> Constrained_edge;
typedef typename Gt::Point_2 Point;
typedef typename Tr::Point Point;
typedef std::pair<Point,Point> Constraint;
typedef std::list<Constraint> List_constraints;
@ -95,9 +104,9 @@ public:
Mesh(/*const Geom_traits& gt=Geom_traits()*/):CDt(/*gt*/){};
Mesh(/*const Geom_traits& gt=Geom_traits()*/):Tr(/*gt*/){};
Mesh(List_constraints& lc, const Geom_traits& gt=Geom_traits()):CDt(gt)
Mesh(List_constraints& lc, const Geom_traits& gt=Geom_traits()):Tr(gt)
{
typename List_constraints::iterator lcit=lc.begin();
for( ; lcit != lc.end(); ++lcit)
@ -108,8 +117,8 @@ public:
}
template <class InputIterator>
Mesh(InputIterator first, InputIterator last/*, const Geom_traits&
gt=Gt()*/):CDt(/*gt*/)
Mesh(InputIterator first, InputIterator last, const Geom_traits&
gt=Geom_traits()):Tr(gt)
{
while(first != last){
insert((*first).first, (*first).second);
@ -265,8 +274,8 @@ bool is_infinite(Edge e) {
}; // end of Mesh
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
find_cluster(Vertex_handle va, Vertex_handle vb, Cluster &c)
{
// check if vb is in any cluster of va
@ -286,8 +295,8 @@ find_cluster(Vertex_handle va, Vertex_handle vb, Cluster &c)
}
//the function that writes a file
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
write(ostream &f)
{
int nedges = 0;
@ -312,8 +321,8 @@ write(ostream &f)
//the function that reads a file
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
read(istream &f)
{
int nedges = 0;
@ -326,8 +335,8 @@ read(istream &f)
}
}
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
fill_edge_queue()
{
Edge_iterator ei = edges_begin();
@ -345,8 +354,8 @@ fill_edge_queue()
}
//it is necessarry for process_facette_map
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
fill_facette_map()
{
Face_iterator fit = faces_begin();
@ -365,8 +374,8 @@ fill_facette_map()
//is used by process_edge_queue
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
process_edge_queue()
{
while(! c_edge_queue.empty() )
@ -398,8 +407,8 @@ process_edge_queue()
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
process_facette_map()
{
if(Bad_faces.empty())
@ -427,8 +436,8 @@ process_facette_map()
//this function split all the segments that are encroached
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
refine_edge(Vertex_handle va, Vertex_handle vb)
{
// UPDATE;
@ -461,8 +470,8 @@ refine_edge(Vertex_handle va, Vertex_handle vb)
}
//split all the bad faces
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
refine_face(Face_handle f)
{
Point pc;
@ -527,8 +536,8 @@ refine_face(Face_handle f)
}
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
create_clusters()
{
Vertex_iterator vit = vertices_begin();
@ -538,8 +547,8 @@ create_clusters()
}
}
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
create_clusters_of_vertex(Vertex_handle v)
{
// prerequisite: at least too vertices must exist in the triangulation
@ -594,8 +603,8 @@ create_clusters_of_vertex(Vertex_handle v)
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
show_clusters()
{
/* multimap<Vertex_handle, Cluster>::iterator cmit = cluster_map.begin();
@ -612,8 +621,8 @@ show_clusters()
}
//refine the cluster
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
cut_cluster(Vertex_handle va, Vertex_handle vb)
{
Cluster c;
@ -631,8 +640,8 @@ cut_cluster(Vertex_handle va, Vertex_handle vb)
//refine the reduced_cluster
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
cut_reduced_cluster(Vertex_handle va, Vertex_handle vb)
{
Cluster c;
@ -648,8 +657,8 @@ cut_reduced_cluster(Vertex_handle va, Vertex_handle vb)
//refine the cluster edges
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
cut_cluster_edge(Vertex_handle va, Vertex_handle vb)
{
//seulement les constraints
@ -670,8 +679,8 @@ cut_cluster_edge(Vertex_handle va, Vertex_handle vb)
}
template <class Gt, class Tds, class Mtraits>
Mesh<Gt, Tds, Mtraits>::Vertex_handle Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
Mesh<Tr, Mtraits>::Vertex_handle Mesh<Tr, Mtraits>::
insert_middle(Vertex_handle va, Vertex_handle vb)
{
Point midpoint;
@ -681,8 +690,8 @@ insert_middle(Vertex_handle va, Vertex_handle vb)
//insert in constraint edge the middle
template <class Gt, class Tds, class Mtraits>
Mesh<Gt, Tds, Mtraits>::Vertex_handle Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
Mesh<Tr, Mtraits>::Vertex_handle Mesh<Tr, Mtraits>::
insert_in_c_edge(Vertex_handle va, Vertex_handle vb, Point p)
{
Face_handle f;
@ -698,8 +707,8 @@ insert_in_c_edge(Vertex_handle va, Vertex_handle vb, Point p)
//update the encroached segments list
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
update_c_edge_queue(Vertex_handle va, Vertex_handle vb, Vertex_handle vm)
{
//c_edge_queue.pop_back();
@ -732,8 +741,8 @@ update_c_edge_queue(Vertex_handle va, Vertex_handle vb, Vertex_handle vm)
}
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
update_facette_map(Vertex_handle v)
{
Face_circulator fc = v->incident_faces();
@ -751,8 +760,8 @@ update_facette_map(Vertex_handle v)
//ok
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
update_cluster(Vertex_handle va, Vertex_handle vb, Vertex_handle vm)
{
multimap<Vertex_handle, Cluster>::iterator it_va_cluster =
@ -791,9 +800,9 @@ update_cluster(Vertex_handle va, Vertex_handle vb, Vertex_handle vm)
}
}
template <class Gt, class Tds, class Mtraits>
inline Mesh<Gt, Tds, Mtraits>::Edge
Mesh<Gt, Tds, Mtraits>::edge_between(Vertex_handle va, Vertex_handle vb) {
template <class Tr, class Mtraits>
inline Mesh<Tr, Mtraits>::Edge
Mesh<Tr, Mtraits>::edge_between(Vertex_handle va, Vertex_handle vb) {
Edge_circulator ec = va->incident_edges();
Edge_circulator ecbegin = ec;
do {
@ -817,8 +826,8 @@ Mesh<Gt, Tds, Mtraits>::edge_between(Vertex_handle va, Vertex_handle vb) {
//CHECK
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
is_encroached(Vertex_handle va, Vertex_handle vb, Point p)
{
Point pm=midpoint(va->point(), vb->point());
@ -830,8 +839,8 @@ is_encroached(Vertex_handle va, Vertex_handle vb, Point p)
}
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
is_encroached(Vertex_handle va, Vertex_handle vb)
{
Vertex_iterator vi=vertices_begin();
@ -850,8 +859,8 @@ is_encroached(Vertex_handle va, Vertex_handle vb)
}
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
min_insertion_radius(Vertex_handle v, Cluster &c)
{
@ -859,8 +868,8 @@ min_insertion_radius(Vertex_handle v, Cluster &c)
//the measure of faces quality
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
is_bad(Face_handle f)
{
FT quality = circumradius_to_shortest_edge_ratio(f);
@ -885,8 +894,8 @@ is_bad(Face_handle f)
//
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
is_small_angle(Vertex_handle vleft,
Vertex_handle vmiddle,
Vertex_handle vright)
@ -905,8 +914,8 @@ is_small_angle(Vertex_handle vleft,
//
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
is_cluster_reduced(const Cluster& c)
{
return c.status == REDUCED;
@ -914,8 +923,8 @@ is_cluster_reduced(const Cluster& c)
template <class Gt, class Tds, class Mtraits>
bool Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
bool Mesh<Tr, Mtraits>::
is_cluster(Vertex_handle va, Vertex_handle vb)
{
// check if vb is in any cluster of va
@ -934,8 +943,8 @@ is_cluster(Vertex_handle va, Vertex_handle vb)
}
template <class Gt, class Tds, class Mtraits>
typename Gt::FT Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
typename Mesh<Tr, Mtraits>::FT Mesh<Tr, Mtraits>::
shortest_edge_of_cluster(Vertex_handle v, Cluster &cluster)
{
map<Vertex_handle, Length>::iterator vit = cluster.vertices.begin();
@ -954,8 +963,8 @@ shortest_edge_of_cluster(Vertex_handle v, Cluster &cluster)
}
// look if all edges have the same lenght
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
check_cluster_status( Cluster& cluster)
{
Length initl;
@ -983,8 +992,8 @@ check_cluster_status( Cluster& cluster)
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
bounds(FT &xmin, FT &ymin,
FT &xmax, FT &ymax,
FT &xcenter, FT &ycenter)
@ -1009,8 +1018,8 @@ bounds(FT &xmin, FT &ymin,
//bounding box
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
bounding_box()
{
@ -1035,8 +1044,8 @@ bounding_box()
//the angle that are between 2 edges from the triangulation
template <class Gt, class Tds, class Mtraits>
typename Gt::FT Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
typename Mesh<Tr, Mtraits>::FT Mesh<Tr, Mtraits>::
angle(Vertex_handle vleft, Vertex_handle vmiddle, Vertex_handle vright)
{
Point
@ -1053,8 +1062,8 @@ angle(Vertex_handle vleft, Vertex_handle vmiddle, Vertex_handle vright)
//the shortest edge that are in a triangle
template <class Gt, class Tds, class Mtraits>
typename Gt::FT Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
typename Mesh<Tr, Mtraits>::FT Mesh<Tr, Mtraits>::
shortest_edge(Face_handle f)
{
Point
@ -1072,8 +1081,8 @@ shortest_edge(Face_handle f)
//the triangle quality is represented by the
//circumradius_to_shortest_edge_ratio value
template <class Gt, class Tds, class Mtraits>
typename Gt::FT Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
typename Mesh<Tr, Mtraits>::FT Mesh<Tr, Mtraits>::
circumradius_to_shortest_edge_ratio(Face_handle f)
{
Point p;
@ -1086,8 +1095,8 @@ circumradius_to_shortest_edge_ratio(Face_handle f)
//insertion radius: the definition
template <class Gt, class Tds, class Mtraits>
typename Gt::FT Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
typename Mesh<Tr, Mtraits>::FT Mesh<Tr, Mtraits>::
insertion_radius(Vertex_handle v)
{
Vertex_handle v1 = nearest_incident_vertex(v);
@ -1096,8 +1105,8 @@ insertion_radius(Vertex_handle v)
//this function must compute the vertex that are so close to our vertex.
template <class Gt, class Tds, class Mtraits>
Mesh<Gt, Tds, Mtraits>::Vertex_handle Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
Mesh<Tr, Mtraits>::Vertex_handle Mesh<Tr, Mtraits>::
nearest_incident_vertex(Vertex_handle v)
{
Vertex_handle vbegin, vcurrent, vnearest;
@ -1118,8 +1127,8 @@ nearest_incident_vertex(Vertex_handle v)
//the mesh refine function
template <class Gt, class Tds, class Mtraits>
void Mesh<Gt, Tds, Mtraits>::
template <class Tr, class Mtraits>
void Mesh<Tr, Mtraits>::
refine_mesh(/* QWidget *w */)
{
// viewer = w;

View File

@ -77,8 +77,11 @@ typedef K::Line_2 Line;
typedef CGAL::Triangulation_vertex_base_2<K> Vb;
typedef CGAL::Constrained_triangulation_face_base_2<K> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;
typedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds,
CGAL::Exact_predicates_tag> Tr;
typedef CGAL::Mesh<K, Tds> Msh;
typedef CGAL::Mesh<Tr> Msh;
class TrViewer : public QWidget {
Q_OBJECT