00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <Information.hpp>
00021 #include <SurfaceMeshGenerator.hpp>
00022
00023 #include <MeshOfTetrahedra.hpp>
00024 #include <MeshTetrahedrizor.hpp>
00025
00026 #include <SurfaceMeshOfTriangles.hpp>
00027 #include <Structured3DMesh.hpp>
00028
00029 #include <Scene.hpp>
00030
00031 #include <Union.hpp>
00032 #include <Intersection.hpp>
00033 #include <Difference.hpp>
00034 #include <Not.hpp>
00035
00036 #include <Cube.hpp>
00037 #include <Plane.hpp>
00038 #include <Cylinder.hpp>
00039 #include <InfiniteCylinder.hpp>
00040 #include <Cone.hpp>
00041 #include <InfiniteCone.hpp>
00042 #include <ObjectTransformer.hpp>
00043
00044 #include <Mesh.hpp>
00045 #include <ConnectivityBuilder.hpp>
00046 #include <Connectivity.hpp>
00047 #include <Cell.hpp>
00048
00049 #include <WorkingMesh.hpp>
00050
00051 #include <TinyMatrix.hpp>
00052
00053 #include <triangulation.hpp>
00054 #include <set>
00055 #include <iostream>
00056 #include <fstream>
00057 #include <stack>
00058 #include <algorithm>
00059
00060 inline double SDet(const Vertex & V1, const Vertex & V2, const Vertex & V3) {
00061 return (V2[0]-V1[0]) * (V3[1]-V1[1]) - (V2[1]-V1[1]) * (V3[0]-V1[0]);
00062 }
00063
00064 inline bool checkInterbis(const Vertex &P1, const Vertex &P2, const Vertex &Q1, const Vertex &Q2) {
00065
00066 ASSERT(!(P1 == P2 || P1 == Q1 || P1 == Q2 || P2 == Q1 || P2 == Q2 || Q1 == Q2));
00067
00068
00069
00070
00071
00072
00073
00074 return ((SDet(P1,P2,Q1)*SDet(P1,P2,Q2) < 0) && (SDet(Q1,Q2,P1)*SDet(Q1,Q2,P2) < 0));
00075 }
00076 class SurfaceMeshGenerator::Internals
00077 {
00078 private:
00079 class IntersectionPoints
00080 {
00081 private:
00082 std::vector<const Vertex* > __listOfPoints;
00083 TinyVector<3, size_t> __cutTriangle1;
00084 TinyVector<3, size_t> __cutTriangle2;
00085
00086 public:
00087
00088 TinyVector<3, size_t>& cutTriangle1()
00089 {
00090 return __cutTriangle1;
00091 }
00092
00093 std::vector<const Vertex*>& listOfPoints()
00094 {
00095 return __listOfPoints;
00096 }
00097
00098 TinyVector<3, size_t>& cutTriangle2()
00099 {
00100 return __cutTriangle2;
00101 }
00102
00103 const TinyVector<3, size_t>& cutTriangle1() const
00104 {
00105 return __cutTriangle1;
00106 }
00107
00108 const TinyVector<3, size_t>& cutTriangle2() const
00109 {
00110 return __cutTriangle2;
00111 }
00112
00113 inline size_t size() const
00114 {
00115 return __listOfPoints.size();
00116 }
00117
00118 const Vertex*& operator[](const size_t& i)
00119 {
00120 ASSERT(i<__listOfPoints.size());
00121 return __listOfPoints[i];
00122 }
00123
00124 void addPoint(const Vertex*& V)
00125 {
00126 __listOfPoints.push_back( V );
00127 }
00128 const IntersectionPoints& operator=(const IntersectionPoints& P)
00129 {
00130 __listOfPoints=P.__listOfPoints;
00131 __cutTriangle1=P.__cutTriangle1;
00132 __cutTriangle2=P.__cutTriangle2;
00133 return *this;
00134 }
00135
00136
00137 IntersectionPoints()
00138 : __cutTriangle1(0),
00139 __cutTriangle2(0)
00140 {
00141 ;
00142 }
00143
00144
00145 IntersectionPoints(const IntersectionPoints& P)
00146 : __listOfPoints(P.__listOfPoints),
00147 __cutTriangle1(P.__cutTriangle1),
00148 __cutTriangle2(P.__cutTriangle2)
00149
00150 {
00151 ;
00152 }
00153
00155 ~IntersectionPoints()
00156 {
00157 ;
00158 }
00159 };
00160
00161 struct IntersectionTest
00162 {
00163 static bool compute(const Cell& C)
00164 {
00165 for (size_t i=0; i<C.numberOfVertices(); ++i) {
00166 if(C(i).reference()==0)
00167 return false;
00168 }
00169 return true;
00170 }
00171 };
00172
00173 struct UnionTest
00174 {
00175 static bool compute(const Cell& C)
00176 {
00177 for (size_t i=0; i<C.numberOfVertices(); ++i) {
00178 if(C(i).reference()==2) {
00179 return false;
00180 }
00181 }
00182 return true;
00183 }
00184 };
00185
00186 class TriangleCut;
00187 class MeshedObject;
00188 friend class SurfaceMeshGenerator;
00189
00190 typedef std::list<TinyVector<3,Edge::Pair> > EdgePairList;
00191 typedef std::list<const Cell*> MotherCellList;
00192
00193 typedef std::map<TinyVector<3>, Object*> ObjectReferences;
00194
00196 typedef std::map<Edge::Pair, size_t> EdgesRef;
00197
00199 typedef std::map<Edge::Pair, Vertex*> VerticesList;
00200
00201 typedef std::vector<ReferenceCounting<MeshedObject > > ListOfMeshedObject;
00202
00203 typedef std::map<const Cell*, std::list<Triangle*> > MapCellTriangle;
00204
00205 typedef std::pair<const Triangle*,const Triangle*> PairTriangleNew;
00206
00207
00208 typedef std::map<std::pair<const Vertex*,const Vertex*> ,
00209 TinyVector<2,const Vertex* > > PIntersection;
00210
00211 typedef std::map< PairTriangleNew , IntersectionPoints> PairTriangleToIntersectionPoints;
00212
00213 std::map<const Vertex*, const Vertex*> listOfVertexMesh;
00214 std::map<const Triangle*, const Triangle*> listOfTriangleMeshFront;
00215
00216 PairTriangleToIntersectionPoints pairTriangleToIntersectionPoints;
00217
00218 std::vector<ReferenceCounting< std::map<const Vertex*,size_t> > > edgesRefVertex;
00219
00220 std::map<const Vertex*,TinyVector<2,const Triangle*> > vertexInTriangles;
00221 std::map<const Vertex*,std::vector<const Triangle*> > vertexVectTriangles;
00222 std::map<const Triangle*,TinyVector<2,const Vertex*> > triangleWithVertex;
00223
00224 TinyVector<3> __splitEdge(const Edge& e,
00225 const Shape& S);
00226
00227 void __dataStructureConvertion(MeshedObject& O,
00228 EdgePairList& triangleListes,
00229 VerticesList& verticesListes,
00230 MotherCellList& cellListObject);
00231
00232 void __constructionVerticesList(const MeshedObject& O0);
00233
00234 void __constructionFinalMesh(const MeshedObject& O0,
00235 SurfaceMeshOfTriangles& s_mesh);
00236
00237 void __calculatePointsIntersection(const MeshedObject& O1,
00238 const MeshedObject& O2,
00239 const std::set<const Cell*>& toTreatHexahedra,
00240 PIntersection& listVertexIntersectionNew);
00241
00242 void __InTriangle(const Vertex& P,
00243 TinyVector<3,const Vertex *> & V,
00244 size_t& ncompt);
00245
00246 void __inout(const size_t& numobject,
00247 const int& ttn0,
00248 const Vertex*& V0,
00249 const Vertex*& V1);
00250
00251 TinyVector<4, real_t> __EquationPlan(const TinyVector<3,const Vertex *> & V);
00252
00253 void __DeterminatePoint(const size_t& ncase,
00254 const Vertex* & Vo0,
00255 const Vertex* & Vo1,
00256 TinyVector<3, const Vertex* > & V,
00257 IntersectionPoints& Pinter,
00258 PIntersection& listVertexIntersectionNew);
00259
00260 void __CalculPoint(std::list<Triangle*>::iterator & currentTriangle,
00261 std::list<Triangle*>::iterator & currentTriangle1,
00262 IntersectionPoints & Pinter,
00263 PIntersection& listVertexIntersectionNew);
00264
00265 void __createPointIntersection(std::list<Triangle*>::iterator currentTriangle1,
00266 std::list<Triangle*>::iterator currentTriangle2,
00267 PIntersection& listVertexIntersectionNew);
00268
00269 const Vertex& __determinateNumber(const int& p,
00270 const TinyVector<3,TinyVector<2,const Vertex*> >& pointsint);
00271
00272 void __determinateCase(const int& ncase,
00273 const TriangleCut & K,
00274 TinyVector<3,int>& tt,
00275 TinyVector<3,int>& pp);
00276
00277 void __addTriangle(const Triangle& T,
00278 const Cell* cell,
00279 std::vector<Triangle>& triangleListIntersectionNew);
00280
00281 void __createLocalListIntersection(const size_t& objectNumber,
00282 const MeshedObject& O2,
00283 const Triangle*& currentTriangle,
00284 TriangleCut & K,
00285 const Cell* cell);
00286
00287 TinyVector<3,TinyVector<2,int> > __determinateEdgeCut(const size_t& numobject,
00288 const MeshedObject& O1,
00289 const MeshedObject& O2,
00290 const Triangle*& currentTriangle,
00291 const Cell* cell);
00292
00293 void __putEdgeRef(const Triangle*& Tmesh,
00294 const Triangle*& T,
00295 const size_t numobject,
00296 const MeshedObject& O1,
00297 const MeshedObject& O2);
00298
00299 void __putRefByFront(const size_t numobject,
00300 const MeshedObject& O1,
00301 const MeshedObject& O2,
00302 const SurfaceMeshOfTriangles& surfmesh,
00303 const std::set<const Cell*>& toTreatHexahedra);
00304
00305 void __createCase(const TriangleCut& K ,
00306 size_t& in, size_t& in1,
00307 TinyVector<3,size_t>& place);
00308
00309 void __transformVertex(const TriangleCut& K,
00310 std::vector<const Vertex*>& points,
00311 std::vector<Vertex> &pointstrian);
00312 void __addPoints(const Vertex*& Pcut,
00313 size_t& stopcut,
00314 std::vector<const Vertex*>& pointslist1,
00315 std::vector<const Vertex*>& pointslist2);
00316
00317 void __addList(const TriangleCut& K);
00318 void __createList(const TriangleCut& K,
00319 std::vector<const Vertex*>& points,
00320 size_t& in,
00321 size_t& in1,
00322 TinyVector<3,size_t> place);
00323
00324 bool __verifExist(const Vertex* Ptemp,
00325 std::vector<const Vertex*>& points);
00326 bool __findOneEdge(const TriangleCut& K,
00327 const size_t & number,
00328 TinyVector<2,const Vertex*>& P);
00329
00330 void __findInEdges(const TriangleCut& K,
00331 TinyVector<2,const Vertex*>& P,
00332 TinyVector<2,const Triangle*>& T,
00333 size_t& iInter,
00334 size_t& stop,
00335 size_t& in,
00336 size_t& in1,
00337 TinyVector<3,size_t> place,
00338 std::vector<const Vertex*>& points);
00339
00340 void __findVertex(const TriangleCut& K,
00341 TinyVector<2,const Vertex*>& P,
00342 TinyVector<2,const Triangle*>& T,
00343 size_t& iCut,
00344 size_t& iInter,
00345 size_t& stop,
00346 size_t& in,
00347 size_t& in1,
00348 TinyVector<3,size_t> place,
00349 std::vector<const Vertex*>& points);
00350
00351 void __findTriangle(TinyVector<2,const Vertex*>& P,
00352 TinyVector<2,const Triangle*>& T,
00353 size_t& stop);
00354
00355 void __createGeneral(const TriangleCut& K,const Cell* cell,
00356 std::vector<Triangle>& triangleListIntersectionNew);
00357
00358 void __create2SD(const TriangleCut& K,const Cell* cell,
00359 std::vector<const Vertex*>& points,
00360 std::vector<Vertex> &pointstrian,
00361 const TinyVector<3,size_t>& place,
00362 std::vector<Triangle>& triangleListIntersectionNew);
00363
00364 void __create3in(const TriangleCut& K,const Cell* cell,
00365 std::vector<const Vertex*>& points,
00366 const size_t in,const size_t in1,
00367 const TinyVector<3,size_t>& place,
00368 std::vector<Triangle>& triangleListIntersectionNew);
00369
00370 void __createTriangle(const TriangleCut& K,const Cell* cell,
00371 std::vector<Triangle>& triangleListIntersectionNew,
00372 std::vector<const Vertex*>& points,
00373 std::vector<Vertex>& pointtrian);
00374
00375 template <typename booleanTest>
00376 void __createTrianglesIntersection(const size_t numobject,
00377 const MeshedObject& O1,
00378 const MeshedObject& O2,
00379 const std::set<const Cell*>& toTreatHexahedra,
00380 std::vector<Triangle>& triangleListIntersectionNew,
00381 PIntersection& listVertexIntersectionNew);
00382
00383 bool __createTriangleSurface(VerticesList& verticesListes,
00384 EdgePairList& localTriangleList,
00385 const Shape& S ,
00386 std::vector<const Edge*>& cutEdges,
00387 const Cell& currentCell);
00388
00389 void __createSurface(MeshedObject& O,
00390 EdgePairList& triangleListes,
00391 EdgePairList& localTriangleListesEdges,
00392 VerticesList& verticesListes,
00393 MotherCellList& cellListObject);
00394
00395 bool __isDegenerate(const Triangle& T);
00396
00397 template <typename booleanTest>
00398 void __calculateIntersection(MeshedObject& O0,
00399 const MeshedObject& O1,
00400 const MeshedObject& O2,
00401 const std::set<const Cell*>& toTreatHexahedra);
00402
00403 template <typename booleanTest>
00404 void __operationBoolean(MeshedObject& O0,
00405 const MeshedObject& O1,
00406 const MeshedObject& O2);
00407
00408 void __generateMesh(const Domain& omega, const Object& object, const size_t& level,
00409 std::stack<ReferenceCounting<MeshedObject> >& objectStack);
00410
00411 void __generateCoarseMesh(const Domain& omega, const Object& object);
00412
00413 void __setMotherCells(SurfaceMeshOfTriangles& surfmesh);
00414
00415 ReferenceCounting<Vector<Triangle> >
00416 __marchingTetrahedra(MeshedObject& O);
00417
00419 static void __getIntersectionReferences(const Intersection& I,
00420 std::map<TinyVector<3>, Object*>& otherReferences);
00421
00422 void plotini(size_t nobjectToTreat);
00423
00424 ReferenceCounting<MeshTetrahedrizor::CellMapping>
00425 __motherCells;
00427 ReferenceCounting<MeshOfTetrahedra>
00428 __backgroundMesh;
00430 const Mesh*
00431 __lastBackgoundMesh;
00433 public:
00434 Internals()
00435 : __motherCells(0),
00436 __backgroundMesh(0),
00437 __lastBackgoundMesh(0)
00438 {
00439 ;
00440 }
00441 };
00442
00443 class SurfaceMeshGenerator::Internals::MeshedObject
00444 {
00445 private:
00446 ReferenceCounting<Shape> __shape;
00447
00448 public :
00449
00450 void setShape(ReferenceCounting<Shape> s)
00451 {
00452 __shape = s;
00453 }
00454
00455 ReferenceCounting<Shape> shapeReference() const
00456 {
00457 ASSERT(__shape != 0);
00458 return __shape;
00459 }
00460
00461 const Shape& shape() const
00462 {
00463 return *__shape;
00464 }
00465
00466 bool inside(const Vertex& V) const
00467 {
00468 return __shape->inside(V);
00469 }
00470
00471 ReferenceCounting<Vector<Triangle> > trianglelist;
00472 ReferenceCounting<Vector<Vertex*> > verticeslist;
00473 ReferenceCounting< MapCellTriangle > hexalist;
00474
00475 private:
00476
00477 const MeshedObject& operator=(const MeshedObject& O);
00478 MeshedObject(const MeshedObject& O);
00479 public:
00480
00481 MeshedObject()
00482 : __shape(0)
00483 {
00484 ;
00485 }
00486
00491 ~MeshedObject()
00492 {
00493 ;
00494 }
00495 };
00496
00497 class SurfaceMeshGenerator::Internals::TriangleCut
00498 : public Triangle
00499 {
00500 public :
00501 TinyVector<3,TinyVector<2,int> > edgecut;
00502 TinyVector<3,size_t> isInTriangle;
00503 TinyVector<3,TinyVector<2,const Vertex*> > pointsIntersection;
00504 std::map< const Vertex* ,const Vertex*> pointsin;
00505 size_t numobject;
00506 size_t otherobject;
00507
00508
00509 TriangleCut()
00510 {
00511 ;
00512 }
00513
00514 TriangleCut(const TriangleCut& K) {
00515 edgecut=K.edgecut;
00516 isInTriangle=K.isInTriangle;
00517 pointsIntersection=K.pointsIntersection;
00518 pointsin=K.pointsin;
00519 numobject=K.numobject;
00520 otherobject=K.otherobject;
00521 }
00522
00523 TriangleCut(const Vertex& v0,
00524 const Vertex& v1,
00525 const Vertex& v2,
00526 size_t num,
00527 size_t num2)
00528 : Triangle(v0,v1,v2)
00529 {
00530 numobject=num;
00531 otherobject=num2;
00532 edgecut=0;
00533 isInTriangle=0;
00534 }
00535
00537 ~TriangleCut()
00538 {
00539 ;
00540 }
00541 };
00542
00543
00544 TinyVector<3, real_t>
00545 SurfaceMeshGenerator::Internals::
00546 __splitEdge(const Edge& e,
00547 const Shape& S)
00548 {
00549 int in = -1;
00550 int out = -1;
00551
00552 for (int j=0; j<2; j++) {
00553 if (e(j).reference() != 1) {
00554 out = j;
00555 } else {
00556 in = j;
00557 }
00558 }
00559
00560 ASSERT((in != -1)&&(out != -1));
00561
00562 TinyVector<3> vi = e(in);
00563 TinyVector<3> vo = e(out);
00564 TinyVector<3> vs = 0.5*(vi+vo);
00565
00566 for (int l = 0; l<20; l++) {
00567 if(S.inside(vs)) {
00568 vi = vs;
00569 vs = 0.5*(vo+vi);
00570 } else {
00571 vo = vs;
00572 vs = 0.5*(vo+vi);
00573 }
00574 }
00575
00576 return vs;
00577 }
00578
00579 template <typename booleanTest>
00580 void SurfaceMeshGenerator::Internals::
00581 __operationBoolean(MeshedObject& O0,
00582 const MeshedObject& O1,
00583 const MeshedObject& O2)
00584 {
00585 std::set<const Cell*> hexaList1;
00586 std::set<const Cell*> hexaList2;
00587
00588 for (MapCellTriangle::const_iterator i=(*O1.hexalist).begin(); i!= (*O1.hexalist).end(); ++i) {
00589 hexaList1.insert((*i).first);
00590 }
00591 for (MapCellTriangle::const_iterator i=(*O2.hexalist).begin(); i!= (*O2.hexalist).end(); ++i) {
00592 hexaList2.insert((*i).first);
00593 }
00594
00595 std::set<const Cell*> toTreatHexahedra;
00596
00597 if (not(Information::instance().coarseMesh())) {
00598 std::set_intersection (hexaList1.begin(), hexaList1.end(),
00599 hexaList2.begin(), hexaList2.end(),
00600 inserter(toTreatHexahedra, toTreatHexahedra.begin()));
00601 ffout(4)<<"nb hexa to treat "<<toTreatHexahedra.size()<<"\n";
00602 }
00603
00604 __calculateIntersection<booleanTest>(O0,O1,O2, toTreatHexahedra);
00605 }
00606
00607 template <typename booleanTest>
00608 void SurfaceMeshGenerator::Internals::
00609 __calculateIntersection(MeshedObject& O0,
00610 const MeshedObject& O1,
00611 const MeshedObject& O2,
00612 const std::set<const Cell*>& toTreatHexahedra)
00613 {
00614 PIntersection listVertexIntersectionNew;
00615 std::vector<Triangle> triangleListIntersectionNew;
00616
00617
00618 __calculatePointsIntersection(O1, O2, toTreatHexahedra, listVertexIntersectionNew);
00619
00620
00621
00622 __createTrianglesIntersection<booleanTest>(0, O1, O2, toTreatHexahedra,
00623 triangleListIntersectionNew, listVertexIntersectionNew);
00624 ffout(4)<<"nb triangles in intersection 0 "<<triangleListIntersectionNew.size()<<'\n';
00625 __createTrianglesIntersection<booleanTest>(1, O2, O1, toTreatHexahedra,
00626 triangleListIntersectionNew, listVertexIntersectionNew);
00627 ffout(4)<<"nb triangles in intersection 1 "<<triangleListIntersectionNew.size()<<'\n';
00628
00629 pairTriangleToIntersectionPoints.clear();
00630
00631
00632 size_t sizeinter=triangleListIntersectionNew.size();
00633
00634 O0.trianglelist = new Vector<Triangle> (sizeinter);
00635 O0.hexalist = new std::map<const Cell*, std::list<Triangle*> >;
00636 for(size_t size=0 ; size<sizeinter ; ++size) {
00637 (*O0.trianglelist)[size]=triangleListIntersectionNew[size];
00638 (*O0.hexalist)[&(*O0.trianglelist)[size].mother()].push_back(&(*O0.trianglelist)[size]);
00639 }
00640 triangleListIntersectionNew.clear();
00641 listVertexIntersectionNew.clear();
00642 }
00643
00644
00645 void SurfaceMeshGenerator::Internals::__constructionVerticesList(const MeshedObject& O0) {
00646
00647 const Vector<Triangle>& triangleList=(*O0.trianglelist);
00648
00649 for(size_t size=0 ; size< triangleList.size() ; ++size) {
00650 const Triangle& T=triangleList[size];
00651 if (listOfVertexMesh.find(&T(0))==listOfVertexMesh.end()) {
00652 listOfVertexMesh[&T(0)] = new Vertex(T(0));;
00653 }
00654 if (listOfVertexMesh.find(&T(1))==listOfVertexMesh.end()) {
00655 listOfVertexMesh[&T(1)] = new Vertex(T(1));;
00656 }
00657 if (listOfVertexMesh.find(&T(2))==listOfVertexMesh.end()) {
00658 listOfVertexMesh[&T(2)] = new Vertex(T(2));;
00659 }
00660 }
00661 }
00662
00663 void SurfaceMeshGenerator::Internals::__constructionFinalMesh(const MeshedObject& O0,
00664 SurfaceMeshOfTriangles& s_mesh) {
00665
00666 __constructionVerticesList(O0);
00667
00668 size_t ntr=0;
00669
00670 ntr+=listOfVertexMesh.size();
00671
00672 s_mesh.setNumberOfVertices(ntr);
00673 ffout(4)<<"nb tot vertices "<<s_mesh.numberOfVertices()<<'\n';
00675 int i = 0;
00676
00677
00678
00679
00680
00681
00682 std::set<const Vertex*> newVertices;
00683 std::set<const Vertex*> oldVertices;
00684
00685 for(std::map<const Vertex*, const Vertex*>::iterator it=listOfVertexMesh.begin() ;
00686 it!=listOfVertexMesh.end() ; it++) {
00687 s_mesh.vertex(i) = *((*it).second);
00688
00689 delete ((*it).second);
00690 ((*it).second) = &s_mesh.vertex(i);
00691 i++;
00692 }
00693
00694 const Vector<Triangle>& triangleList=(*O0.trianglelist);
00695 i = 0;
00696 size_t ncell=0;
00697
00698 ncell+=triangleList.size();
00699
00700
00701
00702 s_mesh.setNumberOfCells(ncell);
00703 ffout(4)<<"nb tot cells "<<s_mesh.numberOfCells()<<'\n';
00704
00705 for(size_t size=0 ; size< triangleList.size() ; ++size) {
00706 const Triangle& T=triangleList[size];
00707 std::map<const Vertex*, const Vertex*>::iterator
00708 it0=listOfVertexMesh.find(&T(0));
00709 const Vertex& V0=*((*it0).second);
00710 std::map<const Vertex*, const Vertex*>::iterator
00711 it1=listOfVertexMesh.find(&T(1));
00712 const Vertex& V1=*((*it1).second);
00713 std::map<const Vertex*, const Vertex*>::iterator
00714 it2=listOfVertexMesh.find(&T(2));
00715 const Vertex& V2=*((*it2).second);
00716 s_mesh.cell(i) = Triangle(V0,V1,V2, T.reference());
00717 s_mesh.cell(i).setMother(&T.mother(),
00718 std::numeric_limits<size_t>::max());
00719 listOfTriangleMeshFront[&s_mesh.cell(i)]=&T;
00720 i++;
00721
00722 }
00723
00724
00725 }
00726
00727 void SurfaceMeshGenerator::Internals::
00728 __dataStructureConvertion(MeshedObject& O,
00729 EdgePairList& triangleListes,
00730 VerticesList& verticesListes,
00731 MotherCellList& cellListObject)
00732 {
00733
00734
00735 {
00736 #warning keep this ?
00737 size_t n=0;
00738 O.verticeslist
00739 = new Vector<Vertex*>(verticesListes.size());
00740 Vector<Vertex*>& vertexListbis = (*O.verticeslist);
00741 for (SurfaceMeshGenerator::Internals::VerticesList::iterator
00742 i = verticesListes.begin();
00743 i != verticesListes.end(); ++i, ++n) {
00744 vertexListbis[n] = (*i).second;
00745 }
00746 }
00747
00748 {
00749 size_t n=0;
00750 O.hexalist
00751 = new std::map<const Cell*, std::list<Triangle*> >;
00752 std::map<const Cell*, std::list<Triangle*> >& hexaToTrianglebis=(*O.hexalist);
00753
00754 O.trianglelist
00755 = new Vector<Triangle> (triangleListes.size());
00756 Vector<Triangle>& triangleListbis = (*O.trianglelist);
00757 SurfaceMeshGenerator::Internals::MotherCellList::iterator
00758 itcell=cellListObject.begin();
00759
00760 for (SurfaceMeshGenerator::Internals::EdgePairList::iterator
00761 i = triangleListes.begin();
00762 i != triangleListes.end(); ++i, ++n) {
00763 SurfaceMeshGenerator::Internals::VerticesList& V = verticesListes;
00764 Triangle T(* V[(*i)[0]],
00765 * V[(*i)[1]],
00766 * V[(*i)[2]], 1);
00767
00768 T.setMother(*itcell,
00769 std::numeric_limits<size_t>::max());
00770 triangleListbis[n] = T;
00771 hexaToTrianglebis[*itcell].push_back(&triangleListbis[n]);
00772 ++itcell;
00773 }
00774 }
00775
00776 verticesListes.clear();
00777 triangleListes.clear();
00778
00779 }
00780
00781 void SurfaceMeshGenerator::Internals::
00782 __calculatePointsIntersection(const MeshedObject& O1,
00783 const MeshedObject& O2,
00784 const std::set<const Cell*>& toTreatHexahedra,
00785 PIntersection& listVertexIntersectionNew)
00786 {
00787
00788 const MapCellTriangle& hexaToTriangle0=*(O1.hexalist);
00789 const MapCellTriangle& hexaToTriangle1=*(O2.hexalist);
00790
00791 for(std::set<const Cell*>::const_iterator i=toTreatHexahedra.begin();
00792 i!=toTreatHexahedra.end(); ++i) {
00793 MapCellTriangle::const_iterator it0=hexaToTriangle0.find(*i);
00794 MapCellTriangle::const_iterator it1=hexaToTriangle1.find(*i);
00795
00796 ASSERT(it0!=hexaToTriangle0.end() and it1!=hexaToTriangle1.end());
00797
00798 std::list<Triangle*> listTriangle0=(*it0).second;
00799 std::list<Triangle*> listTriangle1=(*it1).second;
00800
00801 for(std::list<Triangle*>::iterator jt0=listTriangle0.begin() ;
00802 jt0!=listTriangle0.end() ; ++jt0) {
00803 for(std::list<Triangle*>::iterator jt1=listTriangle1.begin() ;
00804 jt1!=listTriangle1.end() ; ++jt1) {
00805 __createPointIntersection(jt0,jt1,listVertexIntersectionNew);
00806 }
00807 }
00808 }
00809 }
00810
00811 bool SurfaceMeshGenerator::Internals::__isDegenerate(const Triangle& T)
00812 {
00813 return (&(T(0))==&(T(1)) or &(T(0))==&(T(2)) or &(T(1))==&(T(2)));
00814 }
00815
00816 void SurfaceMeshGenerator::Internals::
00817 __InTriangle(const Vertex& P,
00818 TinyVector<3,const Vertex* > & V,
00819 size_t& compt)
00820 {
00821 compt=0;
00822 TinyVector<3,TinyVector<3,real_t> > triangleVector;
00823 triangleVector[0]= -(*V[2]) + (*V[0]);
00824 triangleVector[1]= -(*V[2]) + (*V[1]);
00825 triangleVector[2]= P - (*V[2]);
00826
00827 TinyMatrix<3,3, real_t> A;
00828 for (unsigned i=0; i<3; ++i) {
00829 for (unsigned j=0; j<3; ++j) {
00830 A(i,j)=(*V[j])[i];
00831 }
00832 }
00833
00834 TinyVector<3, real_t> lambda;
00835
00836 gaussPivot(A,P,lambda);
00837
00838 bool ok=true;
00839 for (size_t i=0; i<3; ++i) {
00840 ok = (lambda[i]>-1e-7)?ok:false;
00841 }
00842
00843 compt = (ok) ? 3 : 0;
00844 }
00845
00846 TinyVector<4, real_t> SurfaceMeshGenerator::Internals::
00847 __EquationPlan(const TinyVector<3,const Vertex *> & V){
00848
00849
00850 TinyVector<3> V01=(*V[1])-(*V[0]);
00851 TinyVector<3> V12=(*V[2])-(*V[1]);
00852 TinyVector<3> V02=(*V[2])-(*V[0]);
00853
00854 TinyVector<3> coeffo;
00855 coeffo=V01^V02;
00856 real_t d2 = -(coeffo*(*V[0]));
00857
00858 TinyVector<4> coeff;
00859 coeff[0]=coeffo[0];
00860 coeff[1]=coeffo[1];
00861 coeff[2]=coeffo[2];
00862 coeff[3]=d2;
00863
00864 return coeff;
00865 }
00866
00867 void SurfaceMeshGenerator::Internals::
00868 __DeterminatePoint(const size_t& ncase,
00869 const Vertex* & Vo0,
00870 const Vertex* & Vo1,
00871 TinyVector<3,const Vertex* > & V,
00872 IntersectionPoints& Pinter,
00873 PIntersection& listVertexIntersectionNew)
00874 {
00875
00876
00877
00878 std::pair<const Vertex*,const Vertex*> pV(Vo0,Vo1);
00879 std::pair<const Vertex*,const Vertex*> pV2(Vo1,Vo0);
00880
00881
00882 real_t epsilon=1e-10;
00883 real_t eps=1e-6;
00884 real_t pscalar,k;
00885 size_t num;
00886 Vertex P;
00887 TinyVector<4> coeffo=__EquationPlan(V);
00888 TinyVector<3> coeff;
00889 coeff[0]=coeffo[0];
00890 coeff[1]=coeffo[1];
00891 coeff[2]=coeffo[2];
00892 real_t d=coeffo[3];
00893
00894 TinyVector<3> Vo01 = (*Vo1) - (*Vo0);
00895 TinyVector<3> V01 = (*V[1]) - (*V[0]);
00896 TinyVector<3> V12 = (*V[2]) - (*V[1]);
00897 TinyVector<3> V02 = (*V[2]) - (*V[0]);
00898
00899 real_t norm1=Norm(Vo01);
00900 pscalar=coeff*Vo01;
00901 num=0;
00902 if(std::abs(pscalar)>1e-10) {
00903 k=-(coeff*(*Vo0)+d)/pscalar;
00904 P=(*Vo0)+k*Vo01;
00905
00906 TinyVector<3> V0P=P-(*V[0]);
00907 TinyVector<3> V1P=P-(*V[1]);
00908 TinyVector<3> V2P=P-(*V[2]);
00909
00910 real_t norm2=Norm(P-(*Vo0));
00911 real_t norm3=Norm(P-(*Vo1));
00912 real_t inV01=Norm(V01^V0P);
00913 real_t inV12=Norm(V12^V1P);
00914 real_t inV02=Norm(V02^V2P);
00915
00916 if(std::abs((norm2+norm3)-norm1) < epsilon ) {
00917 if(ncase<3) {
00918 __InTriangle(P,V,num);
00919 if(num==3) {
00920 if(!(norm2>epsilon)) {
00921
00922 Pinter.addPoint(Vo0);
00923 } else
00924 if(!(norm3>epsilon)) {
00925
00926 Pinter.addPoint(Vo1);
00927 } else {
00928
00929 if(listVertexIntersectionNew.find(pV)==listVertexIntersectionNew.end()
00930 and listVertexIntersectionNew.find(pV2)==listVertexIntersectionNew.end()) {
00931 listVertexIntersectionNew[pV][0]=new Vertex (P);
00932 listVertexIntersectionNew[pV][1]=new Vertex (P);
00933 Pinter.addPoint(listVertexIntersectionNew[pV][0]);
00934 } else {
00935 if(listVertexIntersectionNew.find(pV)!=listVertexIntersectionNew.end()) {
00936 if(Norm((*(*listVertexIntersectionNew.find(pV)).second[0])
00937 -P)<eps) {
00938 Pinter.addPoint((*listVertexIntersectionNew.find(pV)).second[0]);
00939 } else
00940 if(Norm((*(*listVertexIntersectionNew.find(pV)).second[1]) - P) < eps) {
00941 Pinter.addPoint((*listVertexIntersectionNew.find(pV)).second[1]);
00942 } else {
00943 listVertexIntersectionNew[pV][1]=new Vertex (P);
00944 Pinter.addPoint(listVertexIntersectionNew[pV][1]);
00945 }
00946 } else {
00947 if(Norm((*(*listVertexIntersectionNew.find(pV2)).second[0]) - P) < eps) {
00948 Pinter.addPoint((*listVertexIntersectionNew.find(pV2)).second[0]);
00949 } else
00950 if(Norm((*(*listVertexIntersectionNew.find(pV2)).second[1]) - P) < eps) {
00951 Pinter.addPoint((*listVertexIntersectionNew.find(pV2)).second[1]);
00952 } else {
00953 listVertexIntersectionNew[pV2][1]=new Vertex (P);
00954 Pinter.addPoint(listVertexIntersectionNew[pV2][1]);
00955 }
00956 }
00957 }
00958 }
00959 Pinter.cutTriangle1()[ncase]=Pinter.size();
00960 }
00961 } else {
00962
00963 if(inV01 > epsilon and inV02 > epsilon and inV12 > epsilon ) {
00964 __InTriangle(P,V,num);
00965 if(num==3) {
00966
00967
00968
00969 PIntersection PIn;
00970 if(!(norm2>epsilon)) {
00971 Pinter.addPoint(Vo0);
00972 } else {
00973 if(!(norm3>epsilon)) {
00974 Pinter.addPoint(Vo1);
00975 } else
00976 {
00977 if(listVertexIntersectionNew.find(pV)==listVertexIntersectionNew.end()
00978 and listVertexIntersectionNew.find(pV2)==listVertexIntersectionNew.end()) {
00979 listVertexIntersectionNew[pV][0]=new Vertex (P);
00980 listVertexIntersectionNew[pV][1]=new Vertex (P);
00981 Pinter.addPoint(listVertexIntersectionNew[pV][0]);
00982 } else {
00983 if(listVertexIntersectionNew.find(pV)!=listVertexIntersectionNew.end()) {
00984 if(Norm((*(*listVertexIntersectionNew.find(pV)).second[0])
00985 -P)<eps) {
00986 Pinter.addPoint((*listVertexIntersectionNew.find(pV)).second[0]);
00987 } else {
00988 if(Norm((*(*listVertexIntersectionNew.find(pV)).second[1])
00989 -P)<eps) {
00990 Pinter.addPoint((*listVertexIntersectionNew.find(pV)).second[1]);
00991 } else {
00992 listVertexIntersectionNew[pV][1]=new Vertex (P);
00993 Pinter.addPoint(listVertexIntersectionNew[pV][1]);
00994 }
00995 }
00996 } else {
00997 if(Norm((*(*listVertexIntersectionNew.find(pV2)).second[0])
00998 -P)<eps) {
00999 Pinter.addPoint((*listVertexIntersectionNew.find(pV2)).second[0]);
01000 } else {
01001 if(Norm((*(*listVertexIntersectionNew.find(pV2)).second[1])
01002 -P)<eps) {
01003 Pinter.addPoint((*listVertexIntersectionNew.find(pV2)).second[1]);
01004 } else {
01005 listVertexIntersectionNew[pV2][1]=new Vertex (P);
01006 Pinter.addPoint(listVertexIntersectionNew[pV2][1]);
01007 }
01008 }
01009 }
01010 }
01011 }
01012 }
01013
01014 }
01015 }
01016 }
01017 }
01018 }
01019 }
01020
01021 void SurfaceMeshGenerator::Internals::
01022 __CalculPoint(std::list<Triangle*>::iterator & currentTriangle,
01023 std::list<Triangle*>::iterator & currentTriangle1,
01024 IntersectionPoints& Pinter,
01025 PIntersection& listVertexIntersectionNew)
01026 {
01027
01028
01029
01030
01031
01032 TinyVector<3,const Vertex * > V012;
01033 const Triangle& T0=*(*currentTriangle1);
01034 V012[0] = &T0(0);
01035 V012[1] = &T0(1);
01036 V012[2] = &T0(2);
01037 TinyVector<3,const Vertex* > Vo012;
01038 Triangle& To0=*(*currentTriangle);
01039 Vo012[0] = &To0(0);
01040 Vo012[1] = &To0(1);
01041 Vo012[2] = &To0(2);
01042
01043 __DeterminatePoint(0,(V012[0]),(V012[1]),Vo012,Pinter, listVertexIntersectionNew);
01044 __DeterminatePoint(1,(V012[0]),(V012[2]),Vo012,Pinter, listVertexIntersectionNew);
01045 __DeterminatePoint(2,(V012[1]),(V012[2]),Vo012,Pinter, listVertexIntersectionNew);
01046
01047 __DeterminatePoint(3,(Vo012[0]),(Vo012[1]),V012,Pinter, listVertexIntersectionNew);
01048 __DeterminatePoint(3,(Vo012[0]),(Vo012[2]),V012,Pinter, listVertexIntersectionNew);
01049 __DeterminatePoint(3,(Vo012[1]),(Vo012[2]),V012,Pinter, listVertexIntersectionNew);
01050 }
01051
01052 void SurfaceMeshGenerator::Internals::
01053 __inout(const size_t& numobject,
01054 const int & edgeCut,
01055 const Vertex*& V0,
01056 const Vertex*& V1)
01057 {
01058 size_t& refVertex0=(*edgesRefVertex[numobject])[V0];
01059 size_t& refVertex1=(*edgesRefVertex[numobject])[V1];
01060
01061 if(refVertex0+refVertex1==4 and edgeCut==1) {
01062 ffout(4)<<"warning edge ref 2 cut \n";
01063 ffout(4)<<(*V0)[0]<<" "<<(*V0)[1]<<" "<<(*V0)[2]<<" \n";
01064 ffout(4)<<(*V1)[0]<<" "<<(*V1)[1]<<" "<<(*V1)[2]<<" \n";
01065 refVertex0=0;
01066 refVertex1=0;
01067 } else {
01068
01069 if(refVertex0+refVertex1==2 and edgeCut==0) {
01070 refVertex0=2;
01071 refVertex1=2;
01072 }
01073 }
01074 }
01075
01076 void SurfaceMeshGenerator::Internals::
01077 __createPointIntersection(std::list<Triangle*>::iterator currentTriangle1,
01078 std::list<Triangle*>::iterator currentTriangle,
01079 PIntersection& listVertexIntersectionNew)
01080 {
01081
01082
01083
01084 PairTriangleNew pTriangle;
01085 pTriangle.first=(*currentTriangle1);
01086 pTriangle.second=(*currentTriangle);
01087
01088 IntersectionPoints Pinter;
01089
01090 __CalculPoint(currentTriangle, currentTriangle1, Pinter, listVertexIntersectionNew);
01091
01092
01093
01094 if(Pinter.size()!=0) {
01095
01096 pairTriangleToIntersectionPoints[pTriangle] = Pinter;
01097 }
01098
01099 if(pairTriangleToIntersectionPoints.find(pTriangle)!= pairTriangleToIntersectionPoints.end()) {
01100 TinyVector<3,size_t >& cutTr2= pairTriangleToIntersectionPoints[pTriangle].cutTriangle2();
01101
01102 for(size_t i=0 ; i<Pinter.size() ; ++i) {
01103 real_t epsilon=1e-7;
01104 const Triangle& To=(*(*currentTriangle));
01105 const Vertex& Vo0 = To(0);
01106 const Vertex& Vo1 = To(1);
01107 const Vertex& Vo2 = To(2);
01108 const Vertex& P=*(pairTriangleToIntersectionPoints[pTriangle][i]);
01109
01110
01111
01112 real_t Vo01=Norm(Vo1-Vo0);
01113 real_t Vo12=Norm(Vo2-Vo1);
01114 real_t Vo02=Norm(Vo2-Vo0);
01115 real_t norm0=Norm(P-Vo0);
01116 real_t norm1=Norm(P-Vo1);
01117 real_t norm2=Norm(P-Vo2);
01118
01119
01120 if(std::abs((norm0+norm1)-Vo01)<epsilon) {
01121 cutTr2[0]=i+1;
01122 }
01123 if(std::abs((norm0+norm2)-Vo02)<epsilon) {
01124 cutTr2[1]=i+1;
01125 }
01126 if(std::abs((norm2+norm1)-Vo12)<epsilon) {
01127 cutTr2[2]=i+1;
01128 }
01129 }
01130 }
01131 }
01132
01133
01134 const Vertex& SurfaceMeshGenerator::Internals::
01135 __determinateNumber(const int& place,
01136 const TinyVector<3,TinyVector<2,const Vertex*> >& pointsint)
01137 {
01138 if(place<=2) {
01139 return *pointsint[place][0];
01140 } else {
01141 return *pointsint[2][0];
01142 }
01143 }
01144
01145 void SurfaceMeshGenerator::Internals::
01146 __addTriangle(const Triangle& t,
01147 const Cell* cell,
01148 std::vector<Triangle>& triangleListIntersectionNew)
01149 {
01150 Triangle T(t);
01151 T.setMother(cell,
01152 std::numeric_limits<size_t>::max());
01153 if(!__isDegenerate(T)) {
01154 triangleListIntersectionNew.push_back(T);
01155 } else {
01156 fferr(3) << "\t\tTriangle dégénéré :"
01157 << &T(0) << ':' << &T(1) << ':' << &T(2) << '\n';
01158 fferr(3)
01159 << T(0) << ':' << T(1) << ':' << T(2) << '\n';
01160
01161 }
01162 }
01163
01164 void SurfaceMeshGenerator::Internals::
01165 __determinateCase(const int& ncase,
01166 const TriangleCut & K,
01167 TinyVector<3,int>& edgesCut,
01168 TinyVector<3,int>& vertexNum)
01169 {
01170
01171 const TinyVector<3,TinyVector<2,int> >& edgesCut2=K.edgecut;
01172 switch(ncase) {
01173 case 0: {
01174 edgesCut[0]=edgesCut2[0][0];
01175 edgesCut[1]=edgesCut2[1][0];
01176 edgesCut[2]=edgesCut2[2][0];
01177 vertexNum[0]=0;
01178 vertexNum[1]=1;
01179 vertexNum[2]=2;
01180 break;
01181 }
01182 case 1: {
01183 edgesCut[0]=edgesCut2[0][0];
01184 edgesCut[1]=edgesCut2[2][0];
01185 edgesCut[2]=edgesCut2[1][0];
01186 vertexNum[0]=0;
01187 vertexNum[1]=2;
01188 vertexNum[2]=1;
01189 break;
01190 }
01191 case 2: {
01192 edgesCut[0]=edgesCut2[1][0];
01193 edgesCut[1]=edgesCut2[2][0];
01194 edgesCut[2]=edgesCut2[0][0];
01195 vertexNum[0]=1;
01196 vertexNum[1]=2;
01197 vertexNum[2]=0;
01198 break;
01199 }
01200 }
01201 }
01202
01203 void SurfaceMeshGenerator::Internals::
01204 __createLocalListIntersection(const size_t& objectNumber,
01205 const MeshedObject& O2,
01206 const Triangle*& currentTriangle,
01207 TriangleCut & K,
01208 const Cell* cell)
01209 {
01210
01211
01212
01213
01214 TinyVector<3,TinyVector<2,int> >& edgesCut=K.edgecut;
01215 TinyVector<3,TinyVector<2,const Vertex*> > & pointsIntersection=K.pointsIntersection;
01216 std::map<const Vertex* ,const Vertex*>& pointsInterior=K.pointsin;
01217
01218 int numberPointsInterior=pointsInterior.size();
01219 const size_t& numobject=K.numobject;
01220 const MapCellTriangle& hexaToTriangle1=*(O2.hexalist);
01221
01222 MapCellTriangle::const_iterator it1=hexaToTriangle1.find(cell);
01223 if(it1!=hexaToTriangle1.end()) {
01224 std::list<Triangle*> listTriangle1=(*it1).second;
01225 for(std::list<Triangle*>::iterator jt0=listTriangle1.begin() ;
01226 jt0!=listTriangle1.end() ; ++jt0) {
01227
01228 PairTriangleNew pairTriangle;
01229 if(numobject<objectNumber) {
01230 pairTriangle.first=(currentTriangle);
01231 pairTriangle.second=(*jt0);
01232 } else {
01233 pairTriangle.second=(currentTriangle);
01234 pairTriangle.first=(*jt0);
01235 }
01236 size_t temp=0;
01237
01238 if(pairTriangleToIntersectionPoints.find(pairTriangle)!=pairTriangleToIntersectionPoints.end()) {
01239 TinyVector<3,size_t > cutTriangle;
01240 if(numobject<objectNumber) {
01241 cutTriangle=(pairTriangleToIntersectionPoints[pairTriangle]).cutTriangle1();
01242 } else {
01243 cutTriangle=(pairTriangleToIntersectionPoints[pairTriangle]).cutTriangle2();
01244 }
01245
01246 size_t isDegenerate=0;
01247 if(__isDegenerate(*(*jt0))) {
01248
01249 isDegenerate=1;
01250 }
01251 if(pairTriangleToIntersectionPoints[pairTriangle].size()==2 and isDegenerate==0) {
01252 const Vertex*& V0=pairTriangleToIntersectionPoints[pairTriangle][0];
01253 const Vertex*& V1=pairTriangleToIntersectionPoints[pairTriangle][1];
01254 const Triangle T=(*(*jt0));
01255 if((V0==&(*(*jt0))(0) or V0==&(*(*jt0))(1) or V0==&(*(*jt0))(2))
01256 and (V1==&(*(*jt0))(0) or V1==&(*(*jt0))(1) or V1==&(*(*jt0))(2))) {
01257
01258 isDegenerate=0;
01259 }
01260 }
01261 if(pairTriangleToIntersectionPoints[pairTriangle].size()>=2 and isDegenerate==0) {
01262 for(size_t b=0; b<pairTriangleToIntersectionPoints[pairTriangle].size() ; ++b) {
01263 const Vertex*& V=pairTriangleToIntersectionPoints[pairTriangle][b];
01264 const Triangle T=(*(*jt0));
01265
01266 if(!(V==&(*(*jt0))(0) or V==&(*(*jt0))(1) or V==&(*(*jt0))(2)) and
01267 Norm(*V-(*(*jt0))(0))>1e-6 and Norm(*V-(*(*jt0))(1))>1e-6 and Norm(*V-(*(*jt0))(2))>1e-6
01268 ) {
01269 vertexVectTriangles[V].push_back(*jt0);
01270 if(vertexInTriangles.find(V)==vertexInTriangles.end()) {
01271 TinyVector<2,const Triangle*> triangles;
01272 triangles[0]=*jt0;
01273 triangles[1]=*jt0;
01274 vertexInTriangles[V]=triangles;
01275 } else {
01276 (*vertexInTriangles.find(V)).second[1]=*jt0;
01277 }
01278 if(triangleWithVertex.find(*jt0)==triangleWithVertex.end()) {
01279 TinyVector<2,const Vertex*> vertexTriangle;
01280 vertexTriangle[0]=V;
01281 vertexTriangle[1]=V;
01282 triangleWithVertex[*jt0]=vertexTriangle;
01283 } else {
01284 (*triangleWithVertex.find(*jt0)).second[1]=V;
01285 }
01286 } else {
01287
01288 vertexVectTriangles[V].push_back(*jt0);
01289 }
01290 }
01291 } else {
01292 if(pairTriangleToIntersectionPoints[pairTriangle].size()!=0) {
01293
01294
01295
01296
01297
01298 vertexVectTriangles[pairTriangleToIntersectionPoints[pairTriangle][0]].push_back(*jt0);
01299
01300 }
01301 }
01302
01303 for (size_t n=0; n < cutTriangle.size(); ++n) {
01304 if(cutTriangle[n]!=0) {
01305 temp+=1;
01306 if(edgesCut[n][0]==0) {
01307 edgesCut[n][0]=1;
01308 pointsIntersection[n][0]=
01309 (pairTriangleToIntersectionPoints[pairTriangle][cutTriangle[n]-1]);
01310 } else {
01311 edgesCut[n][1]=1;
01312 pointsIntersection[n][1]=
01313 (pairTriangleToIntersectionPoints[pairTriangle][cutTriangle[n]-1]);
01314 }
01315 }
01316 }
01317
01318 if(temp<pairTriangleToIntersectionPoints[pairTriangle].size()) {
01319 numberPointsInterior+=1;
01320 size_t r=0;
01321 size_t sum=cutTriangle[0]+cutTriangle[1]+cutTriangle[2];
01322 if(sum>5) {
01323 ffout(4)<<"sum "<<sum<<'\n';
01324 }
01325
01326 switch (sum) {
01327 case 0: {
01328 r=0;
01329 for(size_t i=1 ; i<pairTriangleToIntersectionPoints[pairTriangle].size() ;++i)
01330 pointsInterior[(pairTriangleToIntersectionPoints[pairTriangle][i])]=
01331 (pairTriangleToIntersectionPoints[pairTriangle][i]);
01332 break;
01333 }
01334 case 2:
01335 case 5: {
01336 r=0;
01337 break;
01338 case 4:
01339 case 1:
01340 r=1;
01341 break;
01342 }
01343 case 3: {
01344 r=2;
01345 break;
01346 }
01347 default: {
01348 ffout(4) << "pbs sum = "<<sum<<" size "
01349 << pairTriangleToIntersectionPoints[pairTriangle].size()<<" \n";
01350 ffout(4) << K(0) << "\n";
01351 ffout(4) << K(1) << "\n";
01352 ffout(4) << K(2) << "\n";
01353 ffout(4) << "cutTriangle "<<cutTriangle[0] << " " << cutTriangle[1] << " " << cutTriangle[2] << "\n";
01354 ffout(4) << "edgesCut "<<edgesCut[0] << " " << edgesCut[1] << " " << edgesCut[2] << "\n";
01355
01356
01357
01358
01359 }
01360 }
01361 if(pointsInterior.find(pairTriangleToIntersectionPoints[pairTriangle][r])
01362 ==pointsInterior.end() and sum<=5) {
01363 pointsInterior[(pairTriangleToIntersectionPoints[pairTriangle][r])]
01364 =(pairTriangleToIntersectionPoints[pairTriangle][r]);
01365 }
01366 }
01367 } else {
01368
01369 }
01370 }
01371 }
01372 }
01373
01374 TinyVector<3,TinyVector<2,int> > SurfaceMeshGenerator::Internals::
01375 __determinateEdgeCut(const size_t& numobject,
01376 const MeshedObject& O1,
01377 const MeshedObject& O2,
01378 const Triangle*& currentTriangle,
01379 const Cell* cell)
01380 {
01381
01382 TinyVector<3,TinyVector<2,int> > edgesCut;
01383 edgesCut=0;
01384 size_t objectNumber=0;
01385 if(numobject==0)
01386 objectNumber=1;
01387 const MapCellTriangle& hexaToTriangle1=*(O2.hexalist);
01388
01389 MapCellTriangle::const_iterator it1=hexaToTriangle1.find(cell);
01390
01391 if(it1!=hexaToTriangle1.end()) {
01392 std::list<Triangle*> listTriangle1=(*it1).second;
01393 for(std::list<Triangle*>::iterator jt0=listTriangle1.begin() ;
01394 jt0!=listTriangle1.end() ; ++jt0) {
01395
01396 PairTriangleNew pairTriangle;
01397 if(numobject<objectNumber) {
01398 pairTriangle.first=(currentTriangle);
01399 pairTriangle.second=(*jt0);
01400 } else {
01401 pairTriangle.second=(currentTriangle);
01402 pairTriangle.first=(*jt0);
01403 }
01404
01405 std::map< PairTriangleNew , IntersectionPoints>::iterator i = pairTriangleToIntersectionPoints.find(pairTriangle);
01406 if(i != pairTriangleToIntersectionPoints.end()) {
01407 TinyVector<3,size_t> cutTriangle;
01408 if(numobject<objectNumber) {
01409 cutTriangle=(*i).second.cutTriangle1();
01410 } else {
01411 cutTriangle=(*i).second.cutTriangle2();
01412 }
01413
01414 for (size_t n=0; n<3; ++n) {
01415 if(cutTriangle[n]!=0) {
01416 edgesCut[n]=1;
01417 }
01418 }
01419 }
01420 else {
01421
01422 }
01423 }
01424 }
01425 return edgesCut;
01426 }
01427
01428 void SurfaceMeshGenerator::Internals::
01429 __putRefByFront(const size_t numobject,
01430 const MeshedObject& O1,
01431 const MeshedObject& O2,
01432 const SurfaceMeshOfTriangles& surfmesh,
01433 const std::set<const Cell*>& toTreatHexahedra) {
01434
01435 std::map<const Triangle*,size_t> listTreat;
01436
01437 std::list<const Triangle*> front;
01438 int frontSize = 0;
01439
01440 size_t objectNumber=0;
01441 if(numobject==0)
01442 objectNumber=1;
01443 size_t nbcell=surfmesh.numberOfCells();
01444
01445 ffout(4)<<"taille de totreatHexahedra = "<<toTreatHexahedra.size()<<"\n";
01446 size_t i=0;
01447 while(i<nbcell) {
01448 const Triangle* T=&(surfmesh.cell(i));
01449 const Cell* cell=&((*T).mother());
01450 if(toTreatHexahedra.find(cell)!=toTreatHexahedra.end()
01451 and ((*edgesRefVertex[numobject])[&(*T)(0)]==2
01452 or (*edgesRefVertex[numobject])[&(*T)(1)]==2
01453 or (*edgesRefVertex[numobject])[&(*T)(2)]==2)) {
01454 front.push_front(T);
01455 listTreat[T]=1;
01456 frontSize++;
01457 const Triangle*& TT=(*listOfTriangleMeshFront.find(T)).second;
01458
01459 __putEdgeRef(T,TT,numobject,O1,O2);
01460 }
01461 ++i;
01462 }
01463
01464 size_t iter=0;
01465 ffout(4)<<"taille initial du front ="<< frontSize <<"\n";
01466
01467 if(nbcell != 0) {
01468 ffout(4)<<"ref de surfmesh = "<<surfmesh.cell(0).reference()<<"\n";
01469 }
01470
01471 size_t erase=0;
01472
01473 const Connectivity<SurfaceMeshOfTriangles>& connect
01474 = surfmesh.connectivity();
01475
01476 while(frontSize !=0 and iter<nbcell) {
01477 std::list<const Triangle*>::iterator er=front.begin() ;
01478 for(std::list<const Triangle*>::iterator jt0=front.begin() ;
01479 jt0!=front.end() ; ++jt0) {
01480 if(jt0!=front.begin() and erase==1) {
01481 er=front.erase(er);
01482 frontSize--;
01483 }
01484 er=jt0;
01485 erase=0;
01486 const Triangle* T=*jt0;
01487 const Triangle*& TTo=(*listOfTriangleMeshFront.find(T)).second;
01488 const Vertex& Vo0 = (*TTo)(0);
01489 const Vertex& Vo1 = (*TTo)(1);
01490 const Vertex& Vo2 = (*TTo)(2);
01491 TriangleCut Kneigho(Vo0,Vo1,Vo2,numobject,objectNumber);
01492 const Cell* cello=&((*TTo).mother());
01493 Kneigho.edgecut =__determinateEdgeCut(numobject,O1,O2,TTo,cello);
01494 TinyVector<2,int> edgeo0=Kneigho.edgecut[0];
01495 TinyVector<2,int> edgeo1=Kneigho.edgecut[1];
01496 TinyVector<2,int> edgeo2=Kneigho.edgecut[2];
01497
01498 size_t& refo0=(*edgesRefVertex[numobject])[&(*T)(0)];
01499 size_t& refo1=(*edgesRefVertex[numobject])[&(*T)(1)];
01500 size_t& refo2=(*edgesRefVertex[numobject])[&(*T)(2)];
01501 if(((refo0==2 or refo1==2 or refo2==2) and refo0+refo1+refo2<6 and edgeo0+edgeo1+edgeo2==0)
01502
01503
01504
01505 ) {
01506
01507 refo0=2;
01508 refo1=2;
01509 refo2=2;
01510
01511 } else {
01512 erase=1;
01513 }
01514
01515 const TinyVector<3,const Triangle*>& V=connect.cells(*T);
01516
01517 for(size_t j=0 ; j<3 ; ++j) {
01518
01519 if(V[j]!=0){
01520 const Triangle* triangle=V[j];
01521 const Triangle*& TT=(*listOfTriangleMeshFront.find(triangle)).second;
01522 const Vertex& V0 = (*TT)(0);
01523 const Vertex& V1 = (*TT)(1);
01524 const Vertex& V2 = (*TT)(2);
01525 TriangleCut Kneigh(V0,V1,V2,numobject,objectNumber);
01526 const Cell* cell=&((*TT).mother());
01527 Kneigh.edgecut =__determinateEdgeCut(numobject,O1,O2,TT,cell);
01528 size_t& ref0=(*edgesRefVertex[numobject])[&(*triangle)(0)];
01529 size_t& ref1=(*edgesRefVertex[numobject])[&(*triangle)(1)];
01530 size_t& ref2=(*edgesRefVertex[numobject])[&(*triangle)(2)];
01531 if(ref0+ref1+ref2!=6) {
01532
01533
01534 size_t test=0;
01535 TinyVector<2,int> edge0=Kneigh.edgecut[0];
01536 TinyVector<2,int> edge1=Kneigh.edgecut[1];
01537 TinyVector<2,int> edge2=Kneigh.edgecut[2];
01538 size_t sum=edge0[0]+edge1[0]+edge2[0];
01539 if((ref0==2 or ref1==2 or ref2==2) and
01540 (ref0!=1 and ref1!=1 and ref2!=1) and sum==0) {
01541
01542 test=1;
01543 ref0=2;
01544 ref1=2;
01545 ref2=2;
01546 } else {
01547 if(((ref1==2) xor (ref0==2)) and (edge0==0) and (ref1!=1) and (ref0!=1)) {
01548 ref1=2;
01549 ref0=2;
01550 test=1;
01551 }
01552 if(((ref2==2) xor (ref0==2)) and (edge1==0) and (ref2!=1) and (ref0!=1)) {
01553 ref2=2;
01554 ref0=2;
01555 test=1;
01556 }
01557 if(((ref1==2) xor (ref2==2)) and (edge2==0) and (ref1!=1) and (ref2!=1)) {
01558 ref1=2;
01559 ref2=2;
01560 test=1;
01561 }
01562 if(((ref1==2) xor (ref0==2)) and (edge0==1) and (sum>1)){
01563
01564
01565 if(ref1+ref0!=3) {
01566 test=1;
01567 }
01568 if(ref0==2) {
01569 ref1=1;
01570 } else {
01571 ref0=1;
01572 }
01573 }
01574 if(((ref2==2) xor (ref0==2)) and (edge1==1) and (sum>1)) {
01575
01576
01577 if(ref2+ref0!=3) {
01578 test=1;
01579 }
01580 if(ref0==2) {
01581 ref2=1;
01582 } else {
01583 ref0=1;
01584 }
01585 }
01586 if(((ref2==2) xor (ref1==2)) and (edge2==1) and (sum>1)) {
01587
01588
01589 if(ref1+ref2!=3) {
01590 test=1;
01591 }
01592 if(ref2==2) {
01593 ref1=1;
01594 } else {
01595 ref2=1;
01596 }
01597 }
01598 }
01599 if(test==1) {
01600 front.push_front(triangle);
01601 listTreat[triangle]=1;
01602 frontSize++;
01603 } else if(listTreat.find(triangle)==listTreat.end()) {
01604
01605 front.push_front(triangle);
01606 listTreat[triangle]=1;
01607 frontSize++;
01608 }
01609
01610 }
01611 }
01612 }
01613 }
01614 if(erase==1 and frontSize==1) {
01615 er=front.erase(er);
01616 frontSize--;
01617 }
01618 ++iter;
01619 ffout(4)<<"taille du front = "<<front.size()<<" "<<iter<<" "<<nbcell<<"\n";
01620 }
01621
01622 }
01623
01624 void SurfaceMeshGenerator::Internals::
01625 __putEdgeRef(const Triangle*& Tmesh,
01626 const Triangle*& T,
01627 const size_t numobject,
01628 const MeshedObject& O1,
01629 const MeshedObject& O2 )
01630 {
01631
01632
01633
01634 TinyVector<3,TinyVector<2,int> > edgecut;
01635 const Cell* cell=&((*T).mother());
01636 edgecut =__determinateEdgeCut(numobject,O1,O2,T,cell);
01637 size_t& ref0=(*edgesRefVertex[numobject])[&(*Tmesh)(0)];
01638 size_t& ref1=(*edgesRefVertex[numobject])[&(*Tmesh)(1)];
01639 size_t& ref2=(*edgesRefVertex[numobject])[&(*Tmesh)(2)];
01640
01641 if(ref0+ref1+ref2!=6) {
01642 TinyVector<2,int> edge0=edgecut[0];
01643 TinyVector<2,int> edge1=edgecut[1];
01644 TinyVector<2,int> edge2=edgecut[2];
01645 size_t sum=edge0[0]+edge1[0]+edge2[0];
01646 if((ref0==2 or ref1==2 or ref2==2) and sum==0) {
01647 ref0=2;
01648 ref1=2;
01649 ref2=2;
01650 } else {
01651 if((ref1==2 xor ref0==2) and edge0==1 and sum>1){
01652 if(ref0==2) {
01653 ref1=1;
01654 } else {
01655 ref0=1;
01656 }
01657 }
01658 if((ref2==2 xor ref0==2) and edge1==1 and sum>1 ){
01659 if(ref0==2) {
01660 ref2=1;
01661 } else {
01662 ref0=1;
01663 }
01664 }
01665 if((ref2==2 xor ref1==2) and edge2==1 and sum>1 ){
01666 if(ref2==2) {
01667 ref1=1;
01668 } else {
01669 ref2=1;
01670 }
01671 }
01672 }
01673 }
01674 }
01675
01676 void SurfaceMeshGenerator::Internals::
01677 __createCase(const TriangleCut& K ,
01678 size_t& in, size_t& in1,
01679 TinyVector<3,size_t>& place)
01680 {
01681 size_t numberIn=K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2];
01682
01683 switch (numberIn) {
01684 case 0: {
01685 if(K.edgecut[0][0]==1) {
01686 place[0]=0;
01687 if(K.edgecut[1][0]==1) {
01688 place[1]=1;
01689 place[2]=2;
01690 } else {
01691 place[1]=2;
01692 place[2]=1;
01693 }
01694 } else {
01695 if(K.edgecut[1][0]==1) {
01696 place[0]=1;
01697 place[1]=2;
01698 place[2]=0;
01699 } else {
01700 place[0]=2;
01701 place[1]=0;
01702 place[2]=1;
01703 }
01704 }
01705 break;
01706 }
01707 case 1: {
01708 if(K.isInTriangle[1]==1) {
01709 in=1;
01710 in1=in;
01711 place[0]=2;
01712 place[1]=0;
01713 place[2]=1;
01714 } else if(K.isInTriangle[2]==1) {
01715 in=2;
01716 in1=in;
01717 place[0]=1;
01718 place[1]=2;
01719 place[2]=0;
01720 } else {
01721 in1=in;
01722 place[0]=0;
01723 place[1]=1;
01724 place[2]=2;
01725 }
01726 break;
01727 }
01728 case 2: {
01729 if(K.isInTriangle[1]==1 and K.isInTriangle[0]==1) {
01730 in=1;
01731 in1=0;
01732 place[0]=2;
01733 place[1]=1;
01734 place[2]=0;
01735 } else if(K.isInTriangle[2]==1 and K.isInTriangle[1]==1) {
01736 in=2;
01737 in1=1;
01738 place[0]=1;
01739 place[1]=0;
01740 place[2]=2;
01741 } else {
01742 in=0;
01743 in1=2;
01744 place[0]=0;
01745 place[1]=2;
01746 place[2]=1;
01747 }
01748 break;
01749 }
01750 case 3: {
01751 if(K.edgecut[0]==1) {
01752 place[0]=0;
01753 in1=2;
01754 in=0;
01755 if(K.edgecut[1]==1) {
01756 place[1]=1;
01757 place[2]=2;
01758 } else {
01759 place[1]=2;
01760 place[2]=1;
01761 }
01762 } else if(K.edgecut[1]==1) {
01763 in1=1;
01764 in=2;
01765 place[0]=1;
01766 place[1]=2;
01767 place[2]=0;
01768 } else {
01769 in1=0;
01770 in=1;
01771 place[0]=2;
01772 place[1]=1;
01773 place[2]=0;
01774 }
01775 break;
01776 }
01777 }
01778
01779 }
01780
01781 void SurfaceMeshGenerator::Internals::
01782 __transformVertex(const TriangleCut& K,
01783 std::vector<const Vertex*>& points,
01784 std::vector<Vertex> &pointstrian)
01785 {
01786 size_t taille=points.size();
01787 for(unsigned ie=0;ie<taille;++ie) {
01788 const Vertex& P=*points[ie];
01789 TinyMatrix<3,3, real_t> A;
01790 for (size_t i=0; i<3; ++i) {
01791 for (size_t j=0; j<3; ++j) {
01792 A(i,j)=(K(j))[i];
01793 }
01794 }
01795 TinyVector<3, real_t> lambda;
01796 gaussPivot(A,P,lambda);
01797 Vertex Pi;
01798 Pi[0]=lambda[0];
01799 Pi[1]=lambda[1];
01800 Pi[2]=0;
01801 pointstrian[ie]=Pi;
01802 }
01803
01804 }
01805 void SurfaceMeshGenerator::Internals::
01806 __addPoints(const Vertex*& Pcut,
01807 size_t& stopcut,
01808 std::vector<const Vertex*>& pointslist1,
01809 std::vector<const Vertex*>& pointslist2)
01810 {
01811 if(stopcut==0) {
01812
01813 pointslist1.push_back(Pcut);
01814 stopcut=3;
01815 } else {
01816
01817 pointslist2.push_back(Pcut);
01818 }
01819 }
01820
01821 void SurfaceMeshGenerator::Internals::
01822 __addList(const TriangleCut& K)
01823 {
01824
01825
01826
01827
01828 size_t nbInter=vertexInTriangles.size();
01829
01830
01831
01832
01833
01834
01835 if(nbInter<vertexVectTriangles.size()) {
01836
01837 for(std::map<const Vertex*,std::vector<const Triangle*> >::iterator it=vertexVectTriangles.begin()
01838 ; it!=vertexVectTriangles.end() ; ++it) {
01839 const Vertex* PP=(*it).first;
01840
01841
01842
01843 std::vector<const Triangle*> VT=(*it).second;
01844 if(vertexInTriangles.find(PP)==vertexInTriangles.end()) {
01845
01846
01847
01848 if(nbInter==0) {
01849 TinyVector<2,const Triangle*> triangles;
01850 triangles[0]=VT[0];
01851 triangles[1]=VT[0];
01852 vertexInTriangles[PP]=triangles;
01853 } else {
01854 size_t nn=0,stop2=0;
01855 size_t taille=VT.size();
01856
01857 if(K.isInTriangle[0]==1 and Norm(K(0)-*PP)<1e-6) {
01858 ffout(4)<<"trop proche 1\n";
01859 stop2=1;
01860 }
01861 if(K.isInTriangle[1]==1 and Norm(K(1)-*PP)<1e-6) {
01862 ffout(4)<<"trop proche 2\n";
01863 stop2=1;
01864 }
01865 if(K.isInTriangle[2]==1 and Norm(K(2)-*PP)<1e-6) {
01866 ffout(4)<< Norm(K(2)-*PP)<<" trop proche 3\n";
01867 ffout(4)<<*PP<<"\n";
01868 ffout(4)<<K(2)<<"\n";
01869 stop2=1;
01870 }
01871 while(nn<taille and stop2==0) {
01872 const Triangle* TT=VT[nn];
01873 if(triangleWithVertex.find(TT)!=triangleWithVertex.end()) {
01874 (*triangleWithVertex.find(TT)).second[1]=PP;
01875 TinyVector<2,const Triangle*> triangles;
01876 triangles[0]=TT;
01877 triangles[1]=TT;
01878 vertexInTriangles[PP]=triangles;
01879 stop2=1;
01880 }
01881 ++nn;
01882 }
01883 if(nn==taille and stop2==0) {
01884 (*triangleWithVertex.find(&K)).second[0]=PP;
01885 TinyVector<2,const Triangle*> triangles;
01886 triangles[0]=&K;
01887 triangles[1]=&K;
01888 vertexInTriangles[PP]=triangles;
01889 ffout(4)<<"bizarreeeeee on a pas trouve le tr\n";
01890
01891
01892
01893
01894
01895 }
01896 }
01897 } else {
01898
01899 }
01900 }
01901 }
01902 }
01903
01904 void SurfaceMeshGenerator::Internals::
01905 __createList(const TriangleCut& K,
01906 std::vector<const Vertex*>& points,
01907 size_t& in,
01908 size_t& in1,
01909 TinyVector<3,size_t> place)
01910 {
01911 TinyVector<2,const Vertex*> P;
01912 TinyVector<2,const Triangle*> T;
01913 size_t nbInter=vertexInTriangles.size();
01914 size_t nbCut=K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0];
01915 size_t numberIn=K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2];
01916 size_t stop=0,iInter=0,iCut=0;
01917
01918
01919
01920
01921
01922 if((numberIn==3 or numberIn==2) and stop==0) {
01923 points.push_back(&K(in1));
01924 }
01925 const Vertex* A=&K(in);
01926 if(numberIn>0) {
01927 points.push_back(A);
01928
01929 }
01930 if(nbCut>0) {
01931 P[0]=K.pointsIntersection[place[0]][0];
01932
01933 if(K.edgecut[place[0]][1]!=0) {
01934 P[1]=K.pointsIntersection[place[0]][1];
01935 if(numberIn>0) {
01936 real_t norm0=Norm(*A-*P[0]);
01937 real_t norm1=Norm(*A-*P[1]);
01938 if(norm1<norm0) {
01939 ffout(4)<<"--------------- cas inverse\n";
01940 P[0]=P[1];
01941 }
01942 }
01943 }
01944 if(P[0]!=A and nbInter!=0) {
01945 points.push_back(P[0]);
01946 }
01947 } else if(nbCut!=0) {
01948 if(P[0]==A) {
01949 ffout(4)<<"pbs point confondu A\n";
01950 }
01951 std::map<const Vertex*,TinyVector<2,const Triangle*> >::iterator itvert=vertexInTriangles.begin();
01952 P[0]=(*itvert).first;
01953 }
01954 if(nbCut!=0) {
01955 if(vertexInTriangles.find(P[0])!=vertexInTriangles.end()) {
01956 T[0]=(*vertexInTriangles.find(P[0])).second[0];
01957 iInter=1;
01958 } else {
01959 ffout(4)<<"******\n";
01960 ffout(4)<<"nb Inter "<<nbInter<<"\n";
01961 ffout(4)<<"P0 = "<<P[0]<<*P[0]<<"\n";
01962 ffout(4)<<"K(2) = "<<K(2)<<&K(2)<<"\n";
01963 ffout(4)<<"pbs 0 existe pas\n";
01964 ffout(4)<<place<<"\n";
01965
01966
01967 ffout(4)<<K(0)<<"\n";
01968 ffout(4)<<K(1)<<"\n";
01969 ffout(4)<<K(2)<<"\n";
01970 points.clear();
01971 stop=1;
01972 }
01973 }
01974
01975
01976 if(stop==0 and nbCut==2 ) {
01977 if(K.edgecut[place[1]][0]==1 and K.edgecut[place[0]][0]==1) {
01978 if(Norm(*K.pointsIntersection[place[1]][0]-*K.pointsIntersection[place[0]][0])<1e-12) {
01979 ffout(4)<<"les points sont confondus\n";
01980 ffout(4)<<*K.pointsIntersection[place[0]][0]<<"\n";
01981 stop=1;
01982 }
01983 }
01984 }
01985
01986 if(iInter==nbInter and nbInter==1 and numberIn==1) {
01987
01988 if(nbCut>1) {
01989 const Vertex* PP=K.pointsIntersection[place[1]][0];
01990 if(PP!=P[0]) {
01991 points.push_back(PP);
01992 } else {
01993 if(K.edgecut[place[2]]!=0) {
01994 const Vertex* PP1=K.pointsIntersection[place[2]][0];
01995 if(PP1!=P[0]) {
01996 points.push_back(PP1);
01997 }
01998 }
01999 }
02000 }
02001 }
02002
02003 while(iInter<nbInter and stop==0) {
02004
02005
02006 __findVertex(K,P,T,iCut,iInter,stop,in,in1,place,points);
02007
02008
02009 size_t k=0;
02010 while(stop==3 or k==0) {
02011
02012 __findTriangle(P,T,stop);
02013 if(stop==3) {
02014
02015 __findInEdges(K,P,T,iInter,stop,in,in1,place,points);
02016 }
02017 ++k;
02018 }
02019
02020 }
02021
02022 }
02023
02024 bool SurfaceMeshGenerator::Internals::
02025 __verifExist(const Vertex* Pt,
02026 std::vector<const Vertex*>& points)
02027 {
02028 bool exist=false;
02029 for(size_t k=0 ; k<points.size() ; ++k) {
02030 if(points[k]==Pt) {
02031
02032 exist=true;
02033 }
02034 }
02035 return exist;
02036 }
02037
02038 bool SurfaceMeshGenerator::Internals::
02039 __findOneEdge(const TriangleCut& K,
02040 const size_t & number,
02041 TinyVector<2,const Vertex*>& P)
02042 { bool find=false;
02043 if(K.edgecut[number][0]!=0) {
02044 if(P[0]==K.pointsIntersection[number][0]) {
02045
02046 find=true;
02047 }
02048 }
02049 if(K.edgecut[number][1]!=0 and find==false) {
02050 if(P[0]==K.pointsIntersection[number][1]) {
02051
02052 find=true;
02053 }
02054 }
02055 return find;
02056 }
02057
02058
02059 void SurfaceMeshGenerator::Internals::
02060 __findInEdges(const TriangleCut& K,
02061 TinyVector<2,const Vertex*>& P,
02062 TinyVector<2,const Triangle*>& T,
02063 size_t& iInter,
02064 size_t& stop,
02065 size_t& in,
02066 size_t& in1,
02067 TinyVector<3,size_t> place,
02068 std::vector<const Vertex*>& points)
02069 {
02070
02071 size_t nbInter=vertexInTriangles.size();
02072 size_t iCut=0;
02073
02074
02075 bool find=false;
02076 while(find==false and iCut<3) {
02077 find=__findOneEdge(K,iCut,P);
02078 ++iCut;
02079 }
02080 if(iCut==3 and find==false) {
02081 if(iInter!=iInter) {
02082 ffout(4)<<iInter<<" "<<iInter<<"\n";
02083 ffout(4)<<"pbs on a plus 3\n";
02084 }
02085 stop=1;
02086 iCut=0;
02087 } else {
02088 --iCut;
02089 }
02090
02091
02092 if(K.edgecut[iCut][1]!=0 and stop!=1) {
02093
02094 const Vertex* Ptemp=K.pointsIntersection[iCut][1];
02095 bool exist=__verifExist(Ptemp,points);
02096 if(!exist) {
02097 P[0]=Ptemp;
02098 points.push_back(P[0]);
02099
02100
02101 ++iInter;
02102 } else {
02103 exist=__verifExist(K.pointsIntersection[iCut][0],points);
02104 if(!exist) {
02105 P[0]=K.pointsIntersection[iCut][0];
02106 points.push_back(P[0]);
02107
02108
02109 ++iInter;
02110 } else {
02111 if(nbInter!=iInter) {
02112 ffout(4)<<"pbs on a plus de points\n";
02113 ffout(4)<<nbInter<<" "<<iInter<<"\n";
02114 ffout(4)<<K(0)<<"\n";
02115 ffout(4)<<K(1)<<"\n";
02116 ffout(4)<<K(2)<<"\n";
02117 ffout(4)<<"dernier "<<iCut<<" "<<*K.pointsIntersection[iCut][0]<<"\n";
02118 }
02119 stop=1;
02120 }
02121 }
02122 } else {
02123 if(nbInter!=iInter) {
02124 ffout(4)<<stop<<" pbs on a plus de points2\n";
02125 ffout(4)<<nbInter<<" "<<iInter<<"\n";
02126 ffout(4)<<K(0)<<"\n";
02127 ffout(4)<<K(1)<<"\n";
02128 ffout(4)<<K(2)<<"\n";
02129 }
02130 stop=1;
02131 }
02132 }
02133
02134 void SurfaceMeshGenerator::Internals::
02135 __findVertex(const TriangleCut& K,
02136 TinyVector<2,const Vertex*>& P,
02137 TinyVector<2,const Triangle*>& T,
02138 size_t& iCut,
02139 size_t& iInter,
02140 size_t& stop,
02141 size_t& in,
02142 size_t& in1,
02143 TinyVector<3,size_t> place,
02144 std::vector<const Vertex*>& points)
02145 {
02146
02147
02148
02149 if(triangleWithVertex.find(T[0])!=triangleWithVertex.end()) {
02150 TinyVector<2,const Vertex*> VV=(*triangleWithVertex.find(T[0])).second;
02151 if(VV[0]==P[0]) {
02152 if(VV[1]==P[0]) {
02153
02154 ffout(4)<<"cas findinedges\n";
02155 __findInEdges(K,P,T,iInter,stop,in,in1,place,points);
02156 } else {
02157
02158 P[1]=VV[1];
02159 P[0]=P[1];
02160
02161
02162 points.push_back(P[0]);
02163 ++iInter;
02164 }
02165 } else {
02166
02167 P[1]=VV[0];
02168 P[0]=P[1];
02169
02170
02171 bool exist=__verifExist(P[0],points);
02172 if(!exist) {
02173 points.push_back(P[0]);
02174 ++iInter;
02175 } else {
02176 ffout(4)<<"on a un pbs le point existe deja!!\n";
02177 stop=1;
02178 }
02179
02180
02181 }
02182 }
02183 }
02184
02185 void SurfaceMeshGenerator::Internals::
02186 __findTriangle(TinyVector<2,const Vertex*>& P,
02187 TinyVector<2,const Triangle*>& T,
02188 size_t& stop)
02189 {
02190 if(stop==3) {
02191 stop=0;
02192 }
02193 TinyVector<2,const Triangle*> T2;
02194 if(vertexInTriangles.find(P[0])!=vertexInTriangles.end()) {
02195 T2[0]=(*vertexInTriangles.find(P[0])).second[0];
02196 T2[1]=(*vertexInTriangles.find(P[0])).second[1];
02197 } else {
02198 ffout(4)<<"pbs tr existe pas\n";
02199 stop=1;
02200 }
02201
02202 if(T2[0]==T[0]) {
02203 if(T2[1]==T[0]) {
02204 stop=3;
02205 } else {
02206 T[0]=T2[1];
02207 }
02208 } else {
02209 T[0]=T2[0];
02210 }
02211
02212 }
02213
02214 void SurfaceMeshGenerator::Internals::
02215 __createTriangle(const TriangleCut& K,const Cell* cell,
02216 std::vector<Triangle>& triangleListIntersectionNew,
02217 std::vector<const Vertex*>& points,
02218 std::vector<Vertex>& pointstrian) {
02219
02220 size_t taille=points.size();
02221 Triangulation trgen;
02222 Triangulation::CurveVertex envVertex(taille+1);
02223 std::ofstream sortie("testy2mb");
02224 sortie.precision(30);
02225 sortie<<taille<<" 0 0 \n";
02226 for(unsigned ie=0;ie<taille;++ie) {
02227 sortie<<pointstrian[ie][0]<<" "<<pointstrian[ie][1]<<"\n";
02228
02229
02230
02231
02232 envVertex[ie] = &pointstrian[ie];
02233 }
02234 envVertex[taille] = envVertex[0];
02235 sortie<<taille<<" ";
02236 for(unsigned ie=0;ie<taille;++ie) {
02237 sortie<<envVertex[ie]-envVertex[0]<<" ";
02238 }
02239
02240 sortie.close();
02241
02242
02243 std::vector<Triangulation::CurveVertex> holes(0);
02244 std::vector<Triangulation::CurveVertex> curves(0);
02245
02246 if(taille>3) {
02247
02248
02249
02250 bool isOK=false;
02251
02252 size_t ie=1;
02253 while(ie<taille-2 and !isOK) {
02254 isOK=checkInterbis(pointstrian[0],pointstrian[taille-1],pointstrian[ie],pointstrian[ie+1]);
02255 ++ie;
02256 }
02257 if(!isOK) {
02258
02259 ie=0;
02260 while(ie<taille-1 and !isOK) {
02261 const Vertex& A=pointstrian[ie];
02262 const Vertex& B=pointstrian[ie+1];
02263 real_t norm=Norm(A-B);
02264 isOK=(norm<1e-6);
02265 ++ie;
02266 }
02267 }
02268 if(isOK) {
02269 ffout(4)<<"isok est vraie-----------\n";
02270 }
02271 if(!isOK) {
02272
02273 trgen.triangulize(pointstrian,
02274 envVertex,
02275 holes,
02276 curves);
02277
02278 std::ofstream o("full.mesh");
02279 trgen.export_mesh(o);
02280 o.close();
02281 std::list<ConnectedTriangle> L=trgen.getTriangles();
02282 for(std::list<ConnectedTriangle>::iterator itL=L.begin() ; itL!= L.end() ; itL++) {
02283 Triangle T=(*itL);
02284 Vertex* P0=&T(0);
02285 Vertex* P1=&T(1);
02286 Vertex* P2=&T(2);
02287 __addTriangle(Triangle(*points[P0-&pointstrian[0]],
02288 *points[P1-&pointstrian[0]],
02289 *points[P2-&pointstrian[0]],
02290 K.reference()),cell,triangleListIntersectionNew);
02291 }
02292 } else {
02293 ffout(4)<<"isOK est vraie on a un pbs.....\n";
02294 ffout(4)<<K(0)<<"\n";
02295 ffout(4)<<K(1)<<"\n";
02296 ffout(4)<<K(2)<<"\n";
02297 }
02298
02299 } else if(taille==3) {
02300
02301
02302
02303
02304 __addTriangle(Triangle(*points[0],
02305 *points[1],
02306 *points[2],
02307 K.reference()),cell,triangleListIntersectionNew);
02308 } else {
02309 ffout(4)<<"la taille est inferieur a 3 = "<<taille<<"\n";
02310 ffout(4)<<K(0)<<"\n";
02311 ffout(4)<<K(1)<<"\n";
02312 ffout(4)<<K(2)<<"\n";
02313 ffout(4)<<"¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡\n";
02314 }
02315 }
02316
02317 void SurfaceMeshGenerator::Internals::
02318 __create3in(const TriangleCut& K,const Cell* cell,
02319 std::vector<const Vertex*>& points,
02320 const size_t in,const size_t in1,
02321 const TinyVector<3,size_t>& place,
02322 std::vector<Triangle>& triangleListIntersectionNew)
02323 {
02324 size_t taille=points.size();
02325 size_t number=K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0];
02326 TinyVector<2,const Vertex*> P;
02327 size_t numberP=K.edgecut[place[0]][0]+K.edgecut[place[0]][1];
02328 switch (numberP) {
02329 case 1: {
02330 P[0]=K.pointsIntersection[place[0]][0];
02331 break;
02332 }
02333 case 2: {
02334 P[0]=K.pointsIntersection[place[0]][0];
02335 P[1]=K.pointsIntersection[place[0]][1];
02336 break;
02337 }
02338 }
02339 std::vector<const Vertex*> pointslist1;
02340 std::vector<const Vertex*> pointslist2;
02341 size_t stopcut=0;
02342 for(unsigned ie=1;ie<taille;++ie) {
02343 const Vertex* Pcut=points[ie];
02344
02345 if(Pcut==P[0]) {
02346 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02347 if(stopcut==3) {
02348 stopcut=1;
02349 }
02350 } else {
02351 if(number==2) {
02352 if(Pcut==P[1]) {
02353 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02354 if(stopcut==3) {
02355 stopcut=1;
02356 }
02357 } else {
02358 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02359 if(stopcut==3) {
02360 stopcut=0;
02361 }
02362 }
02363 } else {
02364 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02365 if(stopcut==3) {
02366 stopcut=0;
02367 }
02368 }
02369 }
02370 }
02371
02372
02373 size_t in2=0;
02374 if(in+in1==1) {
02375 in2=2;
02376 } else if(in+in1==2) {
02377 in2=1;
02378 }
02379 pointslist2.push_back(&K(in2));
02380
02381 pointslist2.push_back(points[0]);
02382 pointslist1.push_back(points[0]);
02383
02384 if(!__verifExist(P[0],pointslist2)) {
02385 pointslist2.push_back(P[0]);
02386 } else {
02387 pointslist2.push_back(P[1]);
02388 }
02389
02390
02391 ffout(4)<<"taille de list1 = "<<pointslist1.size()<<"\n";
02392 for(unsigned ie=0;ie<pointslist1.size();++ie) {
02393 ffout(4)<<*pointslist1[ie]<<"\n";
02394 }
02395 ffout(4)<<"taille de list2 = "<<pointslist2.size()<<"\n";
02396 for(unsigned ie=0;ie<pointslist2.size();++ie) {
02397 ffout(4)<<*pointslist2[ie]<<"\n";
02398 }
02399
02400
02401 if(pointslist1.size()>=3) {
02402 std::vector<Vertex> pointslist1plan(pointslist1.size());
02403 __transformVertex(K,pointslist1,pointslist1plan);
02404 __createTriangle(K,cell,triangleListIntersectionNew,pointslist1,pointslist1plan);
02405 }
02406 if(pointslist2.size()>=3) {
02407 std::vector<Vertex> pointslist2plan(pointslist2.size());
02408 __transformVertex(K,pointslist2,pointslist2plan);
02409 __createTriangle(K,cell,triangleListIntersectionNew,pointslist2,pointslist2plan);
02410 }
02411
02412 }
02413
02414 void SurfaceMeshGenerator::Internals::
02415 __create2SD(const TriangleCut& K,const Cell* cell,
02416 std::vector<const Vertex*>& points,
02417 std::vector<Vertex> &pointstrian,
02418 const TinyVector<3,size_t>& place,
02419 std::vector<Triangle>& triangleListIntersectionNew)
02420 {
02421
02422 size_t number=K.edgecut[place[2]][0]+K.edgecut[place[2]][1];
02423 size_t taille=points.size();
02424
02425
02426 TinyVector<2,const Vertex*> P;
02427 switch (number) {
02428 case 1: {
02429 P[0]=K.pointsIntersection[place[2]][0];
02430 break;
02431 }
02432 case 2: {
02433 P[0]=K.pointsIntersection[place[2]][0];
02434 P[1]=K.pointsIntersection[place[2]][1];
02435 break;
02436 }
02437 }
02438 std::vector<const Vertex*> pointslist1;
02439 std::vector<const Vertex*> pointslist2;
02440
02441 size_t stopcut=0;
02442 for(unsigned ie=1;ie<taille;++ie) {
02443 const Vertex* Pcut=points[ie];
02444
02445
02446 if(Pcut==P[0]) {
02447 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02448 if(stopcut==3) {
02449 stopcut=1;
02450 }
02451 } else {
02452 if(number==2) {
02453 if(Pcut==P[1]) {
02454 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02455 if(stopcut==3) {
02456 stopcut=1;
02457 }
02458 } else {
02459 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02460 if(stopcut==3) {
02461 stopcut=0;
02462 }
02463 }
02464 } else {
02465 __addPoints(Pcut,stopcut,pointslist1,pointslist2);
02466 if(stopcut==3) {
02467 stopcut=0;
02468 }
02469 }
02470 }
02471 }
02472 pointslist2.push_back(points[0]);
02473
02474
02475
02476
02477
02478
02479
02480
02481
02482
02483 if(pointslist1.size()>=3) {
02484 std::vector<Vertex> pointslist1plan(pointslist1.size());
02485 __transformVertex(K,pointslist1,pointslist1plan);
02486 __createTriangle(K,cell,triangleListIntersectionNew,pointslist1,pointslist1plan);
02487 }
02488 if(pointslist2.size()>=3) {
02489 std::vector<Vertex> pointslist2plan(pointslist2.size());
02490 __transformVertex(K,pointslist2,pointslist2plan);
02491 __createTriangle(K,cell,triangleListIntersectionNew,pointslist2,pointslist2plan);
02492 }
02493
02494 }
02495
02496 void SurfaceMeshGenerator::Internals::
02497 __createGeneral(const TriangleCut& K,const Cell* cell,
02498 std::vector<Triangle>& triangleListIntersectionNew)
02499 {
02500
02501
02502 size_t in=0,in1=1;
02503 TinyVector<3,size_t> place;
02504 std::vector<const Vertex*> points;
02505
02506 real_t epsilon=1e-6;
02507 real_t norm01=Norm(K(0)-K(1));
02508 real_t norm02=Norm(K(0)-K(2));
02509 real_t norm21=Norm(K(2)-K(1));
02510
02511 if(norm01<epsilon or norm02<epsilon or norm21<epsilon) {
02512 ffout(4)<<"le triangle est tres tres tres plat\n";
02513 } else {
02514
02515 __createCase(K,in,in1,place);
02516
02517
02518 if(K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0]==3 and
02519 K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2]==1) {
02520 size_t temp=place[1];
02521 place[1]=place[2];
02522 place[2]=temp;
02523 }
02524
02526
02527
02528
02529
02530
02531
02532
02533
02534
02535
02536
02538
02539
02540 __addList(K);
02541
02542
02543 size_t numberOfPoints=vertexInTriangles.size()+K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2];
02544 if(numberOfPoints>3) {
02545 __createList(K,points,in,in1,place);
02546 } else if(numberOfPoints==3) {
02547
02548
02549 std::vector<const Vertex*> PP;
02550 for(std::map<const Vertex*,TinyVector<2,const Triangle*> >::iterator jt=vertexInTriangles.begin()
02551 ; jt!=vertexInTriangles.end() ; jt++) {
02552 PP.push_back((*jt).first);
02553
02554 }
02555 for(size_t i=0 ; i<3 ; ++i) {
02556 if(K.isInTriangle[i]==1) {
02557 PP.push_back(&K(i));
02558 }
02559 }
02560 ASSERT(PP.size()==3);
02561 real_t norm0=Norm(*PP[0]-*PP[1]);
02562 real_t norm1=Norm(*PP[0]-*PP[2]);
02563 real_t norm2=Norm(*PP[2]-*PP[1]);
02564 if(norm0>1e-6 and norm1>1e-6 and norm2>1e-6) {
02565 __addTriangle(Triangle(*PP[0],*PP[1],*PP[2],K.reference()),cell,triangleListIntersectionNew);
02566 }
02567
02568 } else {
02569 ffout(4)<<"moins de 3 points\n";
02570 }
02571
02572 size_t taille=points.size();
02573
02574 std::vector<Vertex> pointstrian(taille);
02575
02576
02577
02578
02579 __transformVertex(K,points,pointstrian);
02580
02581 if(K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2]==2 and
02582 K.edgecut[place[2]][0]!=0 and taille!=0) {
02583 ffout(4)<<"on est dans un cas a traiter pour le mailleur\n";
02584 ffout(4)<<K(0)<<"\n";
02585 ffout(4)<<K(1)<<"\n";
02586 ffout(4)<<K(2)<<"\n";
02587
02588 __create2SD(K,cell,points,pointstrian,place,triangleListIntersectionNew);
02589
02590 } else if(K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2]==3) {
02591 ffout(4)<<"----------------- cas 3 in\n";
02592 ffout(4)<<"place "<<place<<"\n";
02593 ffout(4)<<K(0)<<"\n";
02594 ffout(4)<<K(1)<<"\n";
02595 ffout(4)<<K(2)<<"\n";
02596
02597 size_t number=K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0];
02598 if(number==1) {
02599 __create3in(K,cell,points,in,in1,place,triangleListIntersectionNew);
02600
02601 } else {
02602 ffout(4)<<"il faut le traiter\n";
02603 }
02604
02605
02606
02607 } else if(taille!=0) {
02608 __createTriangle(K,cell,triangleListIntersectionNew,points,pointstrian);
02609 }
02610 }
02611 }
02612
02613 template <typename booleanTest>
02614 void SurfaceMeshGenerator::Internals::
02615 __createTrianglesIntersection(const size_t numobject,
02616 const MeshedObject& O1,
02617 const MeshedObject& O2,
02618 const std::set<const Cell*>& toTreatHexahedra,
02619 std::vector<Triangle>& triangleListIntersectionNew,
02620 PIntersection& listVertexIntersectionNew)
02621 {
02622
02623
02624 size_t nbcell=(*O1.trianglelist).size();
02625 SurfaceMeshOfTriangles surfmesh(nbcell);
02626
02627
02628 __constructionFinalMesh(O1,surfmesh);
02629
02630 ConnectivityBuilder<SurfaceMeshOfTriangles> builder(surfmesh);
02631 builder.generates(Connectivity<SurfaceMeshOfTriangles>::CellToCells);
02632
02633 size_t objectNumber=0;
02634 if(numobject==0)
02635 objectNumber=1;
02636
02637 const MapCellTriangle& hexaToTriangle0=*(O1.hexalist);
02638
02639
02640 std::set<const Cell*> hexaList1;
02641 std::set<const Cell*> hexaListIn;
02642
02643 for (MapCellTriangle::const_iterator i=(*O1.hexalist).begin(); i!= (*O1.hexalist).end(); ++i) {
02644 hexaList1.insert((*i).first);
02645 }
02646
02647 std::set_difference (hexaList1.begin(), hexaList1.end(),
02648 toTreatHexahedra.begin(), toTreatHexahedra.end(),
02649 inserter(hexaListIn, hexaListIn.begin()));
02650
02651 ffout(4)<<"taille hexalistIn "<<hexaListIn.size()<<"\n";
02652 for (std::set<const Cell*>::iterator icell = hexaListIn.begin(); icell != hexaListIn.end(); ++icell) {
02653
02654 MapCellTriangle::const_iterator it0=hexaToTriangle0.find(*icell);
02655
02656 if(it0!=hexaToTriangle0.end()) {
02657
02658 Cell& C = const_cast<Cell&>(*(*icell));
02659 for (size_t i=0; i<C.numberOfVertices(); ++i) {
02660 C(i).reference() = (O1.shape().inside(C(i))?1:0)
02661 + (O2.shape().inside(C(i))?1:0);
02662 }
02663
02664 size_t ref;
02665 if (booleanTest::compute(C)) {
02666 ref=2;
02667 } else {
02668 ref=0;
02669 }
02670
02671 std::list<Triangle*> listTriangle0=(*it0).second;
02672 for(std::list<Triangle*>::iterator jt0=listTriangle0.begin() ;
02673 jt0!=listTriangle0.end() ; ++jt0) {
02674
02675 Triangle& T = (*(*jt0));
02676 for (size_t n=0; n<3; ++n) {
02677
02678
02679 (*edgesRefVertex[numobject])[&T(n)]=ref;
02680
02681 const Vertex* P0=(*listOfVertexMesh.find(&T(n))).second;
02682 (*edgesRefVertex[numobject])[P0]=ref;
02683 }
02684
02685 if((*edgesRefVertex[numobject])[&T(0)]==2
02686 and (*edgesRefVertex[numobject])[&T(1)]==2
02687 and (*edgesRefVertex[numobject])[&T(2)]==2) {
02688
02689 __addTriangle(T, &T.mother(),triangleListIntersectionNew);
02690 }
02691 }
02692 }
02693 }
02694
02695
02696 __putRefByFront(numobject,O1,O2,surfmesh,toTreatHexahedra);
02697
02698 size_t nbinters=listVertexIntersectionNew.size();
02699 ffout(4)<<"size listVertexIntersectionNew "<<nbinters<<'\n';
02700
02701 for(std::set<const Cell*>::iterator i=toTreatHexahedra.begin();
02702 i!=toTreatHexahedra.end() ; ++i) {
02703 MapCellTriangle::const_iterator it0=hexaToTriangle0.find(*i);
02704
02705 if(it0!=hexaToTriangle0.end()) {
02706 std::list<Triangle*> listTriangle0=(*it0).second;
02707 for(std::list<Triangle*>::iterator jt0=listTriangle0.begin() ;
02708 jt0!=listTriangle0.end() ; ++jt0) {
02709 const Triangle* T=(*jt0);
02710 const Vertex& V0 = (*T)(0);
02711 const Vertex& V1 = (*T)(1);
02712 const Vertex& V2 = (*T)(2);
02713 TriangleCut K(V0,V1,V2,numobject,objectNumber);
02714 K.reference()=(*T).reference();
02715 triangleWithVertex.clear();
02716 vertexInTriangles.clear();
02717 vertexVectTriangles.clear();
02718
02719
02720
02721
02722
02723 __createLocalListIntersection(objectNumber,O2,T,K,*i);
02724 std::map< const Vertex* ,const Vertex*> pointsin=K.pointsin;
02725
02726 const Vertex* P0=(*listOfVertexMesh.find(&K(0))).second;
02727 const Vertex* P1=(*listOfVertexMesh.find(&K(1))).second;
02728 const Vertex* P2=(*listOfVertexMesh.find(&K(2))).second;
02729 (*edgesRefVertex[numobject])[&K(0)]=(*edgesRefVertex[numobject])[P0];
02730 (*edgesRefVertex[numobject])[&K(1)]=(*edgesRefVertex[numobject])[P1];
02731 (*edgesRefVertex[numobject])[&K(2)]=(*edgesRefVertex[numobject])[P2];
02732 for(size_t k=0 ; k<3 ; ++k) {
02733 if((*edgesRefVertex[numobject])[&K(k)]==2) {
02734 K.isInTriangle[k]=1;
02735 } else {
02736 K.isInTriangle[k]=0;
02737 }
02738 }
02739 if( K.isInTriangle[0]+ K.isInTriangle[1]+ K.isInTriangle[2]!=0 and
02740 K.isInTriangle[0]+ K.isInTriangle[1]+ K.isInTriangle[2]!=3
02741 and K.edgecut[0]+ K.edgecut[1]+ K.edgecut[2]==0) {
02742
02743 ffout(4)<<"cas pbssssss\n";
02744 ffout(4)<<(*edgesRefVertex[numobject])[&K(0)]<<" "<<(*edgesRefVertex[numobject])[&K(1)]<<
02745 " "<<(*edgesRefVertex[numobject])[&K(2)]<<" "<<K.edgecut<<"\n";
02746 ffout(4)<<K(0)<<"\n";
02747 ffout(4)<<K(1)<<"\n";
02748 ffout(4)<<K(2)<<"\n";
02749
02750
02751
02752 }
02753 if(K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0]>=6) {
02754 ffout(4)<<"on veut rien faire car triangle plat\n";
02755 ffout(4)<<"K.isInTriangle "<< K.isInTriangle[0]<<" "<< K.isInTriangle[1]<<" "<< K.isInTriangle[2]<<"\n";
02756 ffout(4)<<K(0)<<"\n";
02757 ffout(4)<<K(1)<<"\n";
02758 ffout(4)<<K(2)<<"\n";
02759 ffout(4)<<"edge cut "<<K.edgecut<<"\n";
02760 K.isInTriangle[0]=1;
02761 K.isInTriangle[1]=1;
02762 K.isInTriangle[2]=1;
02763
02764 }
02766 size_t numberVertexInDomain=K.isInTriangle[0]+K.isInTriangle[1]+K.isInTriangle[2];
02767 switch (numberVertexInDomain) {
02768 case 0: {
02769 if(K.edgecut[0]+K.edgecut[1]+K.edgecut[2]==3 and vertexVectTriangles.size()<3) {
02770 ffout(4)<<"tous les points d'inter ne sont pas dans la liste\n";
02771 } else {
02772
02773 __createGeneral(K,*i,triangleListIntersectionNew);
02774 }
02775 break;
02776 }
02777 case 1: {
02778 if(K.edgecut[0]+K.edgecut[1]+K.edgecut[2]==0) {
02779 ffout(4)<<"pbbbbbbbbbbbbbbb\n";
02780 }
02781 if(K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0]==3) {
02782 if(K.pointsIntersection[0][0]!=K.pointsIntersection[1][0]
02783 and K.pointsIntersection[1][0]!=K.pointsIntersection[2][0]
02784 and K.pointsIntersection[2][0]!=K.pointsIntersection[0][0]) {
02785
02786 __createGeneral(K,*i,triangleListIntersectionNew);
02787 } else {
02788
02789
02790 __createGeneral(K, *i, triangleListIntersectionNew);
02791 }
02792 } else {
02793
02794
02795 __createGeneral(K, *i, triangleListIntersectionNew);
02796 }
02797 break;
02798 }
02799 case 2: {
02800 if(K.edgecut[0][0]+K.edgecut[1][0]+K.edgecut[2][0]<2) {
02801 ffout(4)<<"pbs pas assez d'edge cut \n";
02802 } else {
02803
02804
02805 __createGeneral(K, *i, triangleListIntersectionNew);
02806 }
02807 break;
02808 }
02809 case 3: {
02810 if(K.edgecut[0]+K.edgecut[1]+K.edgecut[2]==0) {
02811 __addTriangle(*T,*i,triangleListIntersectionNew);
02812 } else {
02813
02814
02815 __createGeneral(K, *i, triangleListIntersectionNew);
02816 }
02817 break;
02818 }
02819 }
02821
02822
02823
02824 }
02825 }
02826 }
02827 (*edgesRefVertex[numobject]).clear();
02828 listOfVertexMesh.clear();
02829 listOfTriangleMeshFront.clear();
02830 }
02831
02832 bool SurfaceMeshGenerator::Internals::
02833 __createTriangleSurface(VerticesList& verticesListes,
02834 EdgePairList& localTriangleList,
02835 const Shape& S ,
02836 std::vector<const Edge*>& cutEdges,
02837 const Cell& currentCell)
02838 {
02839 bool jobDone=true;
02840 switch (cutEdges.size()) {
02841 case 3: {
02843
02844 for (size_t i=0; i<cutEdges.size(); ++i) {
02845 TinyVector<3> V=__splitEdge(*cutEdges[i], S);
02846 verticesListes[*cutEdges[i]]
02847 = new Vertex(V);
02848 }
02849
02851 localTriangleList.push_front(TinyVector<3,Edge::Pair>());
02852
02853
02854 std::vector<TinyVector<3> > V(cutEdges.size());
02855 for(size_t i=0; i<cutEdges.size(); ++i) {
02856 const Edge& e = *cutEdges[i];
02857 if(e(0).reference() == 1) {
02858 V[i] = (e(0) - e(1));
02859 } else {
02860 V[i] = (e(1) - e(0));
02861 }
02862 }
02863
02864 if ((V[0]^V[1])*V[2] < 0) {
02865 std::swap(cutEdges[1], cutEdges[2]);
02866 }
02867
02869 SurfaceMeshGenerator::Internals::EdgePairList::iterator currentTriangle
02870 = localTriangleList.begin();
02871
02872 for(size_t i=0; i<cutEdges.size(); ++i) {
02873 (*currentTriangle)[i] = (Edge::Pair)(*cutEdges[i]);
02874 }
02875
02876 break;
02877 }
02878
02879 case 4: {
02880 for (size_t i=0; i<4; ++i) {
02881 TinyVector<3> V=__splitEdge(*cutEdges[i], S);
02882 verticesListes[*cutEdges[i]]
02883 = new Vertex(V);
02884 }
02885
02887 std::map<Edge::Pair, const Edge*> cutEdgesMap;
02888 for(size_t ie=0; ie<cutEdges.size(); ++ie) {
02889 cutEdgesMap[(Edge::Pair)*(cutEdges[ie])] = (cutEdges[ie]);
02890 }
02891
02893 localTriangleList.push_front(TinyVector<3,Edge::Pair>());
02894
02895
02896 std::vector<TinyVector<3> > V(cutEdges.size());
02897 std::map<Edge::Pair, const Edge*>::iterator currentCutEdge=cutEdgesMap.begin();
02898 for (size_t i=0; i<V.size(); ++i) {
02899 const Edge& e = *(*currentCutEdge).second;
02900 if(e(0).reference() == 1) {
02901 V[i] = (e(0) - e(1));
02902 } else {
02903 V[i] = (e(1) - e(0));
02904 }
02905 ++currentCutEdge;
02906 }
02907
02908 bool swapEdge = ((V[0]^V[1])*V[2] > 0);
02909
02911 SurfaceMeshGenerator::Internals::EdgePairList::iterator currentTriangle
02912 = localTriangleList.begin();
02913
02914 currentCutEdge = cutEdgesMap.begin();
02915 if (!swapEdge) {
02916 for(size_t i=0; i<3; ++i) {
02917 (*currentTriangle)[i] = (Edge::Pair)(currentCutEdge->first);
02918 ++currentCutEdge;
02919 }
02920 } else {
02921 for(int i=2; i>=0; --i) {
02922 (*currentTriangle)[i] = (Edge::Pair)(currentCutEdge->first);
02923 ++currentCutEdge;
02924 }
02925 }
02926
02928 localTriangleList.push_front(TinyVector<3,Edge::Pair>());
02929
02930
02931 currentTriangle = localTriangleList.begin();
02932
02934 currentCutEdge = cutEdgesMap.begin();
02935 if (!swapEdge) {
02936 for(int i=2; i>=0; --i) {
02937 ++currentCutEdge;
02938 (*currentTriangle)[i] = (Edge::Pair)(currentCutEdge->first);
02939 }
02940 } else {
02941 for(size_t i=0; i<3; ++i) {
02942 ++currentCutEdge;
02943 (*currentTriangle)[i] = (Edge::Pair)(currentCutEdge->first);
02944 }
02945 }
02946 break;
02947 }
02948 case 1:
02949 case 2: {
02950
02951 break;
02952 }
02953 }
02954
02955 return jobDone;
02956 }
02957
02958 void SurfaceMeshGenerator::Internals::
02959 __createSurface(MeshedObject& O,
02960 EdgePairList& triangleListes,
02961 EdgePairList& localTriangleListesEdges,
02962 VerticesList& verticesListes,
02963 MotherCellList& cellListObject)
02964 {
02965 MeshOfTetrahedra& tetrahedraMesh = (*__backgroundMesh);
02966 const Shape& S = O.shape();
02967
02968
02969 for (size_t i=0; i<tetrahedraMesh.numberOfVertices(); ++i) {
02970 Vertex& V = tetrahedraMesh.vertex(i);
02971 V.reference() = S.inside(V);
02972 }
02973
02974 for (size_t i = 0; i<tetrahedraMesh.numberOfEdges(); i++) {
02975 Edge& e = tetrahedraMesh.edge(i);
02976 #warning THIS TEST IS NOT ENOUGH! THINK TO THE BORDER!
02977 if(e(0).reference() != e(1).reference()) {
02978 verticesListes[e] = new Vertex(__splitEdge(e, S));
02979 e.reference() = 1;
02980 } else {
02981 e.reference() = 0;
02982 }
02983 }
02984
02985 if (verticesListes.size()==0) {
02986 fferr(1) << "\nwarning :\n"
02987 << "meshing object " << S << " a problem occured ...\n"
02988 << "Check that:\n"
02989 << "- the object is not to small compare to the background mesh\n"
02990 << "- the object intersects the background mesh\n\n";
02991 }
02992
02993 #warning A garder ?
02994 EdgePairList localTriangleList;
02995
02996 for (MeshOfTetrahedra::iterator i(tetrahedraMesh);
02997 not(i.end()); ++i) {
02998 Tetrahedron& T = (*i);
02999 size_t numberInside
03000 = T(0).reference()
03001 + T(1).reference()
03002 + T(2).reference()
03003 + T(3).reference();
03004
03005 bool jobDone = true;
03006 if ((numberInside)%4 != 0) {
03007 std::vector<const Edge*> cutEdges;
03008 const Connectivity<MeshOfTetrahedra>::CellToEdgesType&
03009 tetrahedronEdge = tetrahedraMesh.connectivity().edges(T);
03010
03011 for (unsigned l=0; l<Tetrahedron::NumberOfEdges; ++l) {
03012 const Edge& e = *(tetrahedronEdge[l]);
03013 if (e.reference() == 1) {
03014 cutEdges.push_back(&e);
03015 }
03016 }
03017
03018 bool jobDone2=__createTriangleSurface(verticesListes,
03019 localTriangleList,
03020 S, cutEdges,
03021 T);
03022
03023 if(!(jobDone2)) {
03024 jobDone=jobDone2;
03025 }
03026 }
03027
03028 if(jobDone) {
03029 for (SurfaceMeshGenerator::Internals::EdgePairList::iterator t
03030 = localTriangleList.begin();
03031 t != localTriangleList.end(); ++t) {
03032 triangleListes.push_front(*t);
03033 cellListObject.push_front(&T);
03034 }
03035 } else {
03036 throw ErrorHandler(__FILE__,__LINE__,
03037 "jobDone false",
03038 ErrorHandler::unexpected);
03039 }
03040 localTriangleList.clear();
03041 }
03042 }
03043
03044 #warning REMOVE THIS NOW !
03045 void plot(const SurfaceMeshOfTriangles& s,
03046 std::set<const Cell*>& hlist,
03047 Structured3DMesh& SMesh);
03048 void plot2(const SurfaceMeshOfTriangles& s,
03049 std::set<const Cell*>& hlist,
03050 Structured3DMesh& SMesh);
03051
03052 void plotmedit(const size_t& nobject,
03053 const SurfaceMeshOfTriangles& s_mesh,
03054 std::set<const Cell*>& toTreatHexahedra,
03055 size_t n0,size_t n1);
03056
03057 void plothexa(size_t ncase,std::set<const Cell*>& cuttedHexahedra);
03058
03059 void SurfaceMeshGenerator::Internals::
03060 __setMotherCells(SurfaceMeshOfTriangles& surfaceMesh)
03061 {
03062 for (SurfaceMeshOfTriangles::iterator i(surfaceMesh);
03063 not(i.end()); ++i) {
03064 Triangle& triangle = *i;
03065 const Tetrahedron& tetrahedron
03066 = static_cast<const Tetrahedron&>(triangle.mother());
03067
03068 const size_t tetrahedronNumber
03069 = (*__backgroundMesh).cellNumber(tetrahedron);
03070
03071 triangle.setMother((*__motherCells)[tetrahedronNumber],
03072 std::numeric_limits<size_t>::max());
03073 }
03074 }
03075
03076
03077 void SurfaceMeshGenerator::Internals::
03078 __generateMesh(const Domain& omega,
03079 const Object& object, const size_t& level,
03080 std::stack<ReferenceCounting<MeshedObject> >& objectStack)
03081 {
03082 if(Information::instance().coarseMesh() and object.hasReference()) {
03083 ReferenceCounting<MeshedObject> o = new MeshedObject();
03084 (*o).setShape(object.shape()->getCopy());
03085 __marchingTetrahedra(*o);
03086
03087 objectStack.push(o);
03088 ffout(4) << "Marching cube sur " << objectStack.top() << '\n';
03089 } else {
03090 switch ((*object.shape()).type()) {
03091 case Shape::union_: {
03092 const Union& U = static_cast<const Union&>(*(object.shape()));
03093
03094 size_t j=0;
03095 ObjectTransformer objectTransformer(U.transformationsList());
03096 for (Union::const_iterator i = U.begin();
03097 i != U.end(); ++i,++j) {
03098 ReferenceCounting<Object> s = objectTransformer(*(*i));
03099 __generateMesh(omega, *s, level+1, objectStack);
03100 if (j>0) {
03101
03102 ReferenceCounting<MeshedObject> O1 = objectStack.top();
03103 objectStack.pop();
03104
03105
03106 ReferenceCounting<MeshedObject> O2 = objectStack.top();
03107 objectStack.pop();
03108
03109 ReferenceCounting<MeshedObject> O0 = new MeshedObject();
03110 __operationBoolean<UnionTest>(*O0,*O1, *O2);
03111
03112
03113 if (j == 1) {
03114 Union* u = new Union();
03115 u->push_back(new Object((*O1).shapeReference()));
03116 u->push_back(new Object((*O2).shapeReference()));
03117 (*O0).setShape(u);
03118 } else {
03119 Union& u = dynamic_cast<Union&>(*(*O2).shapeReference());
03120 u.push_back(new Object((*O1).shapeReference()));
03121 (*O0).setShape((*O2).shapeReference());
03122 }
03123
03124 objectStack.push(O0);
03125 }
03126 }
03127 break;
03128 }
03129 case Shape::intersection: {
03130 const Intersection& I = static_cast<const Intersection&>(*(object.shape()));
03131
03132 size_t j=0;
03133 ObjectTransformer objectTransformer(I.transformationsList());
03134 for(Intersection::const_iterator i = I.begin();
03135 i != I.end(); ++i,++j) {
03136 ReferenceCounting<Object> s = objectTransformer(*(*i));
03137 __generateMesh(omega, *s, level+1, objectStack);
03138 if (j>0) {
03139
03140 ReferenceCounting<MeshedObject> O1 = objectStack.top();
03141 objectStack.pop();
03142
03143
03144 ReferenceCounting<MeshedObject> O2 = objectStack.top();
03145 objectStack.pop();
03146
03147 ReferenceCounting<MeshedObject> O0 = new MeshedObject();
03148 __operationBoolean<IntersectionTest>(*O0,*O1, *O2);
03149
03150 if (j == 1) {
03151 Intersection* newI = new Intersection();
03152 newI->push_back(new Object((*O1).shapeReference()));
03153 newI->push_back(new Object((*O2).shapeReference()));
03154 (*O0).setShape(newI);
03155 } else {
03156 Intersection& newI = dynamic_cast<Intersection&>(*(*O2).shapeReference());
03157 newI.push_back(new Object((*O1).shapeReference()));
03158 (*O0).setShape((*O2).shapeReference());
03159 }
03160 objectStack.push(O0);
03161 }
03162 }
03163 break;
03164 }
03165 case Shape::difference: {
03166 const Difference& D = static_cast<const Difference&>(*(object.shape()));
03167
03168 ObjectTransformer objectTransformer(D.transformationsList());
03169 Intersection* I = new Intersection;
03170
03171 Difference::const_iterator i = D.begin();
03172 ReferenceCounting<Object> s = objectTransformer(*(*i));
03173 I->push_back(s);
03174
03175 Union* U = new Union;
03176 ++i;
03177 for(; i != D.end(); ++i) {
03178 s = objectTransformer(*(*i));
03179 U->push_back(s);
03180 }
03181
03182 I->push_back(new Object(new Not(new Object(U))));
03183 Object o(I);
03184 __generateMesh(omega, o, level+1, objectStack);
03185 break;
03186 }
03187 case Shape::not_: {
03188 const Object& notObject = *(static_cast<const Not&>(*object.shape()).object());
03189
03190 __generateMesh(omega, notObject, level+1, objectStack);
03191
03192 MeshedObject& o = (*objectStack.top());
03193 ReferenceCounting<Shape> s = o.shapeReference();
03194 o.setShape(new Not(new Object(s)));
03195
03196 break;
03197 }
03198 case Shape::cube: {
03199 if (not(Information::instance().coarseMesh())) {
03200 const Cube& c = static_cast<const Cube&>(*object.shape());
03201 Intersection* I = new Intersection;
03202 for (size_t i=0; i<6; ++i) {
03203 I->push_back(new Object(new Plane(c, i)));
03204 }
03205
03206 Object o(I);
03207 __generateMesh(omega, o, level+1, objectStack);
03208 break;
03209 }
03210 }
03211 case Shape::cylinder: {
03212 if (not(Information::instance().coarseMesh())) {
03213 const Cylinder& c = static_cast<const Cylinder&>(*object.shape());
03214 Intersection* I = new Intersection;
03215 I->push_back(new Object(new InfiniteCylinder(c)));
03216 I->push_back(new Object(new Plane(c, 0)));
03217 I->push_back(new Object(new Plane(c, 1)));
03218
03219 Object o(I);
03220 __generateMesh(omega, o, level+1, objectStack);
03221 break;
03222 }
03223 }
03224 case Shape::cone: {
03225 if (not(Information::instance().coarseMesh())) {
03226 const Cone& c = static_cast<const Cone&>(*object.shape());
03227 Intersection* I = new Intersection;
03228 I->push_back(new Object(new InfiniteCone(c)));
03229 I->push_back(new Object(new Plane(c, 0)));
03230 I->push_back(new Object(new Plane(c, 1)));
03231
03232 Object o(I);
03233 __generateMesh(omega, o, level+1, objectStack);
03234 break;
03235 }
03236 }
03237 default: {
03238 ReferenceCounting<MeshedObject> o = new MeshedObject();
03239 (*o).setShape(object.shape()->getCopy());
03240 __marchingTetrahedra(*o);
03241
03242 objectStack.push(o);
03243 ffout(4) << "Marching cube sur " << objectStack.top() << '\n';
03244 }
03245 }
03246 }
03247 MeshedObject& o = (*objectStack.top());
03248 if(object.hasReference()) {
03249 const size_t ref = omega.reference(object.reference());
03250 for (size_t i=0; i<(*o.trianglelist).size(); ++i) {
03251 Triangle& t = (*o.trianglelist)[i];
03252 t.reference()=ref;
03253 }
03254 }
03255 }
03256
03257 ReferenceCounting<Vector<Triangle> >
03258 SurfaceMeshGenerator::Internals::
03259 __marchingTetrahedra(MeshedObject& O)
03260 {
03261 ffout(3) << "Marching tetrahedra\n";
03262 EdgePairList triangleListes;
03263 EdgePairList localTriangleListesEdges;
03264 VerticesList verticesListes;
03265 MotherCellList cellListObject;
03266
03267 __createSurface(O, triangleListes, localTriangleListesEdges,
03268 verticesListes, cellListObject);
03269
03270 __dataStructureConvertion(O, triangleListes, verticesListes, cellListObject);
03271 ffout(3) << "Marching tetrahedra: done\n";
03272 return 0;
03273 }
03274
03280 void SurfaceMeshGenerator::
03281 generateSurfacicMesh(const Domain& omega,
03282 const Mesh& M,
03283 SurfaceMeshOfTriangles& s_mesh)
03284 {
03285 switch (M.type()) {
03286 case Mesh::cartesianHexahedraMesh: {
03287 break;
03288 }
03289 default: {
03290 throw ErrorHandler(__FILE__,__LINE__,
03291 "only cartesian meshes are supported for surface mesh generation",
03292 ErrorHandler::unexpected);
03293 }
03294 }
03295
03296 Internals& internals = (*__internals);
03297
03298
03299 if (&M != internals.__lastBackgoundMesh) {
03300
03301 internals.__lastBackgoundMesh = &M;
03302
03303
03304 MeshTetrahedrizor tetrahedrizor(&M);
03305
03306
03307 tetrahedrizor.run(false);
03308
03309 internals.__backgroundMesh
03310 = & static_cast<MeshOfTetrahedra&>(*tetrahedrizor.mesh());
03311
03312
03313 internals.__motherCells
03314 = tetrahedrizor.motherCells();
03315
03316 ConnectivityBuilder<MeshOfTetrahedra> builder(*internals.__backgroundMesh);
03317 builder.generates(Connectivity<MeshOfTetrahedra>::CellToEdges);
03318 }
03319
03320 const Object& object = omega.object();
03321
03322
03323
03324 (*__internals).edgesRefVertex.resize(2);
03325
03326 for(size_t no=0 ; no<2 ; ++no) {
03327 (*__internals).edgesRefVertex[no] = new std::map<const Vertex*,size_t> ;
03328 }
03329
03330 std::stack<ReferenceCounting<SurfaceMeshGenerator::Internals::MeshedObject> > objectStack;
03331
03332 (*__internals).__generateMesh(omega, object, 0, objectStack);
03333
03334 SurfaceMeshGenerator::Internals::MeshedObject& o = (*objectStack.top());
03335 std::set<int> refset;
03336 for (size_t i=0; i<(*o.trianglelist).size(); ++i) {
03337 const Triangle& t = (*o.trianglelist)[i];
03338 refset.insert(t.reference());
03339 }
03340
03341 ffout(0) << "Sets " << refset.size() << " References\n";
03342
03343
03344 (*__internals).__constructionFinalMesh((*objectStack.top()),
03345 s_mesh);
03346
03347 (*__internals).__setMotherCells(s_mesh);
03348
03349 s_mesh.setBackgroundMesh(&M);
03350 }
03351
03352 SurfaceMeshGenerator::SurfaceMeshGenerator()
03353 : __internals(new SurfaceMeshGenerator::Internals())
03354 {
03355 ;
03356 }
03357
03358 SurfaceMeshGenerator::~SurfaceMeshGenerator()
03359 {
03360 ;
03361 }