00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef COREFINE_3D_FACE_FACE_HH
00025 #define COREFINE_3D_FACE_FACE_HH
00026
00027 #include "corefine.hh"
00028 #include "g-map-vertex.hh"
00029 #include "corefine-3d-tools.hh"
00030 #include "face-intersection-tools.hh"
00031 #include "grid-3d.hh"
00032 #include "time.hh"
00033
00034 namespace GMap3d {
00035
00036 typedef CIntersectionPoint TInterPt;
00037 typedef CIntersectionPointComparator TInterPtCmp;
00038 typedef std::set<TInterPt*, TInterPtCmp> TInterPtSet;
00039
00040 typedef std::multiset<CDart*, CAngularFaceComparator> TFaceSet;
00041
00042 struct SCorefFace
00043 {
00044 SCorefFace() {}
00045 SCorefFace(CDart * AFace, const CPlane & APlane, const CBoundingBox & ABox)
00046 : face(AFace), plane(APlane), box(ABox) {}
00047 CDart *face;
00048 CPlane plane;
00049 CBoundingBox box;
00050 };
00051
00052 typedef std::list<SCorefFace> TCorefFaceList;
00053
00054 typedef CGrid3d< std::pair< std::list<CDart*>,
00055 std::list<CDart*> > > TCorefFaceGrid;
00056 typedef CGrid3dIterator< std::pair< std::list<CDart*>,
00057 std::list<CDart*> > > TCorefFaceGridIter;
00058
00059 class DLL_COREFINEMENT CCorefine3dFF : public CCorefine
00060 {
00061 public:
00062 CCorefine3dFF(CGMapVertex * AMap, bool ACalculateOrientation = true,
00063 TCoordinate AEpsilon = 1E-4, int AVertexDI = -1);
00064 virtual ~CCorefine3dFF();
00065
00066 void calculateOrientation(bool AState) { FCalculateOrientation = AState; }
00067 void optimizeSearch(bool AState) { FOptimizeSearch = AState; }
00068 void setOptimizationGridResolution(int ARes) { FGridResolution = ARes; }
00069 void setDisplayMessagesLevel(int ALevel) { FDisplayMessages = ALevel; }
00070
00071 const CTime & getInitialisationTime() const { return FInitialisationTime; }
00072 const CTime & getFaceListCreationTime() const { return FFaceListCreationTime; }
00073 const CTime & getFaceListReductionTime() const { return FFaceListReductionTime; }
00074 const CTime & getSplitTime() const { return FSplitTime; }
00075 const CTime & getMergeTime() const { return FMergeTime; }
00076
00077 virtual int corefine(CDart *& AMesh1, CDart *& AMesh2,
00078 std::bitset<NB_MARKS> ACopyMarks = 0);
00079 virtual int corefine(int AMark1, int AMark2,
00080 std::bitset<NB_MARKS> ACopyMarks = 0);
00081
00082 virtual void splitMeshes(CDart * AMesh1, CDart * AMesh2,
00083 std::bitset<NB_MARKS> ACopyMarks = 0);
00084 virtual void splitMeshes(int AMark1, int AMark2,
00085 std::bitset<NB_MARKS> ACopyMarks = 0);
00086 virtual void mergeMeshes();
00087 virtual void removeDoubleFaces(CDart **ADarts = NULL, int ANbDarts = 0);
00088 virtual void linkCompounds(CDart * AMesh1, CDart * AMesh2,
00089 std::bitset<NB_MARKS> ACopyMarks = 0);
00090
00091 virtual void markIntersectionEdges(int AMark, int AObjectsToMark = 3);
00092 virtual void markDoubleFaces(int AMark);
00093 virtual void spreadMarksWithoutMerging(std::bitset<NB_MARKS> AMarks);
00094
00095 virtual void clear();
00096
00097 const std::list<CDart*> & getInterEdgesList() const {return FInterEdges; }
00098 const std::list<CDart*> & getDoubleFacesList() const {return FDoubleFaces;}
00099
00100 protected:
00101
00102 virtual void splitMeshes(std::bitset<NB_MARKS> ACopyMarks = 0);
00103
00104 bool checkEdges();
00105
00106 void pointDirectInfoToData(int ADirectInfo, CDart * ADart,
00107 TOrbit AOrbit, void * AData);
00108
00109 virtual CBoundingBox initMesh(CDart * AMesh);
00110 virtual void cleanMesh(CDart * AMesh);
00111 virtual CBoundingBox initFaces(int AMark);
00112
00113 SCorefFace computeFaceInfos(CDart * AFace, int AMark);
00114 TCorefFaceList * buildFaceList(CDart * AMesh);
00115 TCorefFaceList * buildFaceList(int AMark);
00116 void reduceFaceLists(TCorefFaceList * AList1, TCorefFaceList * AList2,
00117 const CBoundingBox & ABox);
00118 void updateFaceInList(TCorefFaceList * AList, TCorefFaceList::iterator AElt,
00119 std::list<CDart*> * AFaces);
00120
00121 bool isVertexLinkedWithFace(CDart * AVertex, int AFaceMark);
00122 void markFaceVertex(CDart * AVertex, int AFaceMark, int AMark);
00123 CDart * getTwinDartOnFace(CDart * ADart, int AFaceMark);
00124 CDart * findFaceSector(CDart * AFaceVertex, const CPlane & AFacePlane,
00125 int AFaceMark, const CVertex & AVector);
00126 CDart * findNearestFaceVertex(CDart * AFace,
00127 const CPlane & ARefPlane,
00128 const CPlane & AClipPlane1,
00129 const CPlane & AClipPlane2);
00130 CVertex edgeInsideVector(CDart * AEdge, const CPlane & AFacePlane);
00131 CVertex vertexInsideVector(CDart * AVertex, const CPlane & AFacePlane);
00132
00133 void classifyFaceVertices(CDart * AFace, const CPlane & APlane,
00134 int APositiveMark, int ANegativeMark,
00135 int AFacesMark, bool AUseVerticesLinks = true,
00136 int * ANbVertices = NULL,
00137 int * ANbPositiveVertices = NULL,
00138 int * ANbNegativeVertices = NULL);
00139 void getFaceFictiveElements(CDart * AFace, int AFaceMark,
00140 std::list<CDart*> * AFictVertices,
00141 std::list<CDart*> * AFictEdges);
00142
00143
00144
00145
00146 void testPointInside(CDart * AVertex, TInterPt * APoint, int AFaceMark,
00147 const CVertex & AInterLine, const CPlane & AFacePlane);
00148 void testPointBorder(CDart * AVertex,
00149 TInterPt * ANewPoint, TInterPt * AOldPoint,
00150 const TInterPtCmp & AComparator);
00151 TInterPtSet * findIntersectionPoints(CDart * AFace,
00152 const CPlane & AFacePlane,
00153 const CPlane & AInterPlane,
00154 const CVertex & AInterLine,
00155 int APositiveMark, int ANegativeMark,
00156 int AFacesMark,
00157 const TInterPtCmp & AComparator);
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 virtual CDart * createEdge();
00168 virtual CDart * insertVertexInFace(CDart * AFace, const CVertex & APoint);
00169 virtual CDart * insertEdgeInFace(CDart * AVertex1,
00170 const CVertex & AVertex2);
00171 virtual CDart * splitEdge(CDart * AEdge, const CVertex & APoint,
00172 std::list<CDart*> * AFictiveEdges = NULL);
00173 virtual CDart * splitFace(CDart * AVertex1, CDart * AVertex2);
00174
00175 bool isUselessFictiveVertex(CDart * AVertex);
00176 bool isUselessFictiveEdge(CDart * AEdge);
00177 bool isWholeFaceMarked(CDart * AFace, int AMark);
00178 virtual CDart * copyDoubleFaceData(CDart * AFace);
00179 virtual CDart * removeFictiveVertex(CDart * AVertex, int ADeleteMark = -1);
00180 virtual CDart * removeFictiveEdge(CDart * AEdge, int ADeleteMark = -1);
00181 virtual CDart * removeDoubleFace(CDart * AFace);
00182
00183 void linkVertices(CDart * AVertex1, CDart * AVertex2);
00184 void addIntersectionPoint(CDart *AVertices[2], int AFaceNumber,
00185 int AFacesMark, int AInterMark,
00186 std::list<CDart*> * AInterList);
00187
00188 virtual bool intersectFaces(CDart * AFace1, CDart * AFace2,
00189 const CPlane & APlane1,
00190 const CPlane & APlane2,
00191 std::list<CDart*> * AFaceList1,
00192 std::list<CDart*> * AFaceList2);
00193
00194 virtual void intersectSecantFaces(CDart * AFace1, CDart * AFace2,
00195 const CPlane & APlane1,
00196 const CPlane & APlane2,
00197 int APositiveMark, int ANegativeMark,
00198 int AFacesMark,
00199 std::list<CDart*> * AFictiveVertices,
00200 std::list<CDart*> * AFictiveEdges);
00201
00202 virtual void intersectCoplanarFaces(CDart * AFace1, CDart * AFace2,
00203 const CPlane & APlane1,
00204 const CPlane & APlane2,
00205 int APositiveMark, int ANegativeMark,
00206 int AFacesMark,
00207 std::list<CDart*> * AFictiveVertices,
00208 std::list<CDart*> * AFictiveEdges);
00209
00210
00211
00212
00213
00214
00215
00216 void assignFacesPlaneInfo(int ADirectInfo, int ANegativeMark,
00217 TCorefFaceList * AList);
00218 void removeFacesPlaneInfo(int ADirectInfo, int ANegativeMark,
00219 TCorefFaceList * AList);
00220 void sortFacesAroundEdges(int AFacePlaneDI, int ANegativeMark);
00221 TFaceSet * sortFacesAroundEdges(CDart * AEdge1, CDart * AEdge2,
00222 int AFacePlaneDI, int ANegativeMark);
00223 void linkSortedFaces(TFaceSet * AFaceSet);
00224 void spreadMarksAroundEdges(TFaceSet * AFaceSet,
00225 std::bitset<NB_MARKS> AMarks);
00226
00227 bool isPointInFace(const CVertex & APoint, CDart * AFace,
00228 const CPlane & APlane);
00229
00230 protected:
00231 CCorefine3dTools *FTools;
00232 bool FCalculateOrientation;
00233 bool FLocalVertexDI;
00234 bool FOptimizeSearch;
00235 int FGridResolution;
00236 int FDisplayMessages;
00237
00238 CTime FInitialisationTime;
00239 CTime FFaceListCreationTime;
00240 CTime FFaceListReductionTime;
00241 CTime FSplitTime;
00242 CTime FMergeTime;
00243
00244 int FVertexDI;
00245 int FInterPointDI;
00246 int FLinkedVertexDI;
00247
00248 int FInterEdgeMark;
00249 int FFictiveVertexMark;
00250 int FFictiveEdgeMark;
00251 int FFaceMark;
00252 int FDoubleFaceMark;
00253
00254 TCorefFaceList *FMesh1, *FMesh2;
00255 std::list<CDart*> FInterEdges;
00256 std::list<CDart*> FDoubleFaces;
00257 };
00258
00259 }
00260
00261 #endif // COREFINE_3D_FACE_FACE_HH