00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "corefinement-api.hh"
00026 #include "g-map-vertex.hh"
00027 #include "time.hh"
00028
00029
00030 #include "corefine-2d-sweeping.hh"
00031 #include "corefine-2d-propagation.hh"
00032 #include "boolean-operations-2d.hh"
00033
00034 #include "corefine-3d.hh"
00035 #include "corefine-3d-face-face.hh"
00036 #include "boolean-operations-3d.hh"
00037 using namespace std;
00038 using namespace GMap3d;
00039
00040 CCorefinementAPI::CCorefinementAPI(CGMapVertex * AMap)
00041 {
00042 assert(AMap != NULL);
00043
00044 FMap = AMap;
00045 }
00046
00047 CCorefinementAPI::~CCorefinementAPI()
00048 {
00049 }
00050
00051 void CCorefinementAPI::corefine2dMeshesSweeping(CDart * ADart1, CDart * ADart2,
00052 const CVertex& ANormal)
00053 {
00054 assert(ADart1 != NULL);
00055 assert(ADart2 != NULL);
00056
00057 CCorefineSegmentsSweeping(FMap).corefine(ADart1, ADart2, ANormal);
00058 }
00059
00060 void CCorefinementAPI::corefine2dMeshesPropagation(CDart * ADart1,
00061 CDart * ADart2,
00062 const CVertex & ANormal,
00063 bool )
00064 {
00065 assert(ADart1 != NULL);
00066 assert(ADart2 != NULL);
00067
00068 CTime start, end;
00069
00070 cout << endl << "Co-raffinement des maillages" << endl;
00071 start.updateTime();
00072
00073 CVertex * vertex = FMap->findVertex(ADart1);
00074 CPlane plane(ANormal, *vertex);
00075
00076 CCorefine2dPropagation(FMap, plane).corefine(ADart1, ADart2);
00077
00078 end.updateTime();
00079 cout << "Durée du co-raffinement : " << end - start << endl;
00080 }
00081
00082 void CCorefinementAPI::corefine3dMeshes(CDart * ADart1, CDart * ADart2)
00083 {
00084 assert(ADart1 != NULL);
00085 assert(ADart2 != NULL);
00086
00087 CTime start, end;
00088
00089 start.updateTime();
00090
00091 cout << endl << "Co-raffinement 3D des maillages" << endl;
00092
00093
00094 CCorefine3dFF coref(FMap, false);
00095 coref.splitMeshes(ADart1, ADart2);
00096
00097 end.updateTime();
00098 cout << "Durée du co-raffinement : " << end - start << endl;
00099 }
00100
00101 void CCorefinementAPI::corefineMarked3dFaces(int AMark1, int AMark2)
00102 {
00103 CTime start, end;
00104
00105 cout << endl << "Co-raffinement 3D des faces" << endl;
00106 start.updateTime();
00107
00108 CCorefine3dFF coref(FMap, false);
00109 coref.corefine(AMark1, AMark2);
00110
00111 end.updateTime();
00112 cout << "Durée du co-raffinement : " << end - start << endl;
00113 }
00114
00115 void CCorefinementAPI::corefineMarked3dMeshesWith(int AMark, CDart * ADart)
00116 {
00117 assert(ADart != NULL);
00118
00119 int vertex_di = FMap->getNewDirectInfo();
00120 CCorefine3dFF coref(FMap, false, 1E-4, vertex_di);
00121 CCorefine3dTools tools(FMap);
00122 list<CDart*> objects;
00123 CDart *d1, *d2;
00124 CTime start, end;
00125
00126 start.updateTime();
00127
00128 FMap->pointDirectInfoToAttributeVertex(vertex_di);
00129
00130 int tmp_mark = FMap->getNewMark();
00131
00132 d2 = tools.findWellOrientedDart(ADart, vertex_di);
00133 FMap->markOrbit(d2, ORBIT_CC, tmp_mark);
00134
00135 for (CDynamicCoverageAll dca(FMap); dca.cont(); ++dca) {
00136 if (FMap->isMarked(*dca, AMark) && !FMap->isMarked(*dca, tmp_mark)) {
00137 d1 = tools.findWellOrientedDart(*dca, vertex_di);
00138 FMap->markOrbit(d1, ORBIT_CC, tmp_mark);
00139 objects.push_back(d1);
00140 }
00141 }
00142
00143 FMap->unmarkAll(tmp_mark);
00144 FMap->freeMark(tmp_mark);
00145
00146 while (!objects.empty()) {
00147 d1 = objects.front(), objects.pop_front();
00148
00149 coref.corefine(d1, d2);
00150 }
00151
00152 FMap->freeDirectInfo(vertex_di);
00153
00154 end.updateTime();
00155 cout << "Durée total du calcul : " << end - start << endl;
00156 }
00157
00158 void CCorefinementAPI::booleanOperations2d(CDart * ADart1,
00159 CDart * ADart2,
00160 const CVertex & ,
00161 int ADifference1Mark,
00162 int ADifference2Mark,
00163 int AIntersectionMark,
00164 int AUnionMark)
00165 {
00166 assert(ADart1 != NULL);
00167 assert(ADart2 != NULL);
00168
00169 CTime start, end;
00170
00171 cout << endl << "Co-raffinement des maillages" << endl;
00172 start.updateTime();
00173
00174 CBooleanOperations2d ops(FMap, ADart1, ADart2, true);
00175
00176 ops.computeResults();
00177
00178 end.updateTime();
00179 cout << "Durée du co-raffinement : " << end - start << endl;
00180
00181 cout << "Extraction des opérations booléennes" << endl;
00182 start.updateTime();
00183
00184 if (ADifference1Mark >= 0) {
00185 FMap->unmarkAll(ADifference1Mark);
00186 ops.markResult(BO_Difference1, ADifference1Mark);
00187 }
00188
00189 if (ADifference2Mark >= 0) {
00190 FMap->unmarkAll(ADifference2Mark);
00191 ops.markResult(BO_Difference2, ADifference2Mark);
00192 }
00193
00194 if (AIntersectionMark >= 0) {
00195 FMap->unmarkAll(AIntersectionMark);
00196 ops.markResult(BO_Intersection, AIntersectionMark);
00197 }
00198
00199 if (AUnionMark >= 0) {
00200 FMap->unmarkAll(AUnionMark);
00201 ops.markResult(BO_Union, AUnionMark);
00202 }
00203
00204 end.updateTime();
00205 cout << "Durée de l'extraction : " << end - start << endl;
00206 }
00207
00208 void CCorefinementAPI::booleanOperations3d(CDart * ADart1, CDart * ADart2,
00209 int ADifference1Mark,
00210 int ADifference2Mark,
00211 int AIntersectionMark,
00212 int AUnionMark)
00213 {
00214 assert(ADart1 != NULL);
00215 assert(ADart2 != NULL);
00216
00217 CTime start, end;
00218
00219 cout << endl << "Co-raffinement des maillages" << endl;
00220 start.updateTime();
00221
00222 CBooleanOperations3d ops(FMap, ADart1, ADart2, false);
00223
00224 ops.computeResults();
00225
00226 end.updateTime();
00227 cout << "Durée du co-raffinement : " << end - start << endl;
00228
00229 cout << "Extraction des opérations booléennes" << endl;
00230 start.updateTime();
00231
00232 if (ADifference1Mark >= 0) {
00233 FMap->unmarkAll(ADifference1Mark);
00234 ops.markResult(BO_Difference1, ADifference1Mark);
00235 }
00236
00237 if (ADifference2Mark >= 0) {
00238 FMap->unmarkAll(ADifference2Mark);
00239 ops.markResult(BO_Difference2, ADifference2Mark);
00240 }
00241
00242 if (AIntersectionMark >= 0) {
00243 FMap->unmarkAll(AIntersectionMark);
00244 ops.markResult(BO_Intersection, AIntersectionMark);
00245 }
00246
00247 if (AUnionMark >= 0) {
00248 FMap->unmarkAll(AUnionMark);
00249 ops.markResult(BO_Union, AUnionMark);
00250 }
00251
00252 end.updateTime();
00253 cout << "Durée de l'extraction : " << end - start << endl;
00254 }
00255