00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TRIANGULATION_HPP
00021 #define TRIANGULATION_HPP
00022
00023 #include <cstdlib>
00024 #include <ostream>
00025 #include <vector>
00026 #include <list>
00027
00028 #include "Triangle.hpp"
00029 #include "connected_triangle.hpp"
00030
00031
00032 const int HSide[] = {0x100,0x200,0x400};
00033 const int HMask = 0x00FF;
00034 const int HUMask = 0xFF00;
00035
00036 class Triangulation {
00037 public:
00038 typedef real_t PointNumType;
00039 typedef std::vector<Vertex *> CurveVertex;
00040 private:
00041 Vertex __corners[4];
00042 protected:
00043 typedef std::vector<Vertex> Points;
00044 typedef std::list<ConnectedTriangle> Triangles;
00045 Triangles __triangles;
00046
00047 const Points * __points;
00048 public:
00049 Triangulation() { }
00050 void setBox(const PointNumType xmin, const PointNumType ymin,
00051 const PointNumType xmax, const PointNumType ymax);
00052
00054 bool triangulize(Points & points,
00055 const CurveVertex & envVertex,
00056 const std::vector<CurveVertex> & holes,
00057 const std::vector<CurveVertex> & curves);
00058
00059 void export_mesh(std::ostream &o) const;
00060
00061 const Triangles & getTriangles() { return __triangles; }
00062
00063 private:
00064 bool __scanNeigh(const TriangleIndex & start,
00065 const unsigned in,
00066 Vertex * newPoint,
00067 Vertex * &last);
00068 void __insertPoint(Vertex * newPoint, const TriangleIndex & curTriangle);
00069
00071 inline void __findInsert(Vertex & newPoint) {
00072 __insertPoint(&newPoint,__find_P_in_elt(newPoint));
00073 }
00074
00076 TriangleIndex __find_P_in_elt(const Vertex &P);
00077
00079 bool __isInCircle(const Vertex &point, const Triangle &tri) const;
00080
00082 void __permutation(TriangleIndex num_tri1,const unsigned k);
00083
00085 void __elimination_tri(TriangleIndex num_tri);
00086
00087 void __resetTags();
00088
00089 bool __checkAll() ;
00090
00091 void __deleteTriangle(const TriangleIndex & tri) {
00092 for(Triangles::iterator i = __triangles.begin(); i != __triangles.end(); ++i) {
00093 if (&*i == tri) {
00094 __triangles.erase(i);
00095 return;
00096 }
00097 }
00098 ASSERT(false);
00099 exit(1);
00100 }
00101
00102 void __newTriangle(const ConnectedTriangle & tri) {
00103 __triangles.push_back(tri);
00104 }
00105
00106 bool __colorize(const Points & points);
00107
00108 TriangleIndex __findVertex(const Vertex * const p);
00109
00111 bool __checkLine(const CurveVertex &L, const bool closed);
00112 };
00113
00114 #endif