#ifndef TRIANGULATION_HPP #define TRIANGULATION_HPP #include #include #include //#include "point.hpp" #include "Triangle.hpp" #include "connected_triangle.hpp" // il faut juste que sizeof(int)>=2 const int HSide[] = {0x100,0x200,0x400}; // pourquoi on peut le mettre dans la class const int HMask = 0x00FF; // Mask de lecture d'une partie du tag (dans le cas de stockage const int HUMask = 0xFF00;// condensée de booléens et d'un entier sur le même tag : Economie) class Triangulation { public: typedef real_t PointNumType; typedef std::vector CurveVertex; private: Vertex corners[4]; protected: typedef std::vector Points; typedef std::list Triangles; Triangles triangles; //! tableau de triangles. const Points * _points_; public: Triangulation() { } void setBox(const PointNumType xmin, const PointNumType ymin, const PointNumType xmax, const PointNumType ymax); //! Construit la triangulation d'un ensemble de points suivants des contraintes de type bord, trous ou segments bool triangulize(Points & points, const CurveVertex & envVertex, const std::vector & holes, const std::vector & curves); void export_mesh(std::ostream &o) const; const Triangles & getTriangles() { return triangles; } private: bool scanNeigh(const TriangleIndex & start, const unsigned in, Vertex * newPoint, Vertex * &last); void insertPoint(Vertex * newPoint, const TriangleIndex & curTriangle); //! Insère un point dans la triangulation precedente à partir du triangle T inline void findInsert(Vertex & newPoint) { insertPoint(&newPoint,find_P_in_elt(newPoint)); } //! Cherche le triangle associe a P TriangleIndex find_P_in_elt(const Vertex &P); //! Test si un point est dans le cercle circonscrit au triangle bool isInCircle(const Vertex &point, const Triangle &tri) const; //! Retourne l'arrete opp au sommet k du triangle num_tri1. void permutation(TriangleIndex num_tri1,const unsigned k); //! Elimination complète du triangle num_tri. void elimination_tri(TriangleIndex num_tri); void resetTags(); bool checkAll() ; void deleteTriangle(const TriangleIndex & tri) { for(Triangles::iterator i = triangles.begin(); i != triangles.end(); ++i) { if (&*i == tri) { triangles.erase(i); return; } } assert(false); exit(1); } void newTriangle(const ConnectedTriangle & tri) { triangles.push_back(tri); } bool colorize(const Points & points); TriangleIndex findVertex(const Vertex * const p); /*! Peut être mettre le bool en template => code optimisé car pas de cas particulier : traité à la compil */ bool checkLine(const CurveVertex &L, const bool closed); }; #endif /* TRIANGULATION_HPP */