/[ff3d]/ff3d/solver/SurfaceMeshGenerator.cpp
ViewVC logotype

Diff of /ff3d/solver/SurfaceMeshGenerator.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.25 by delpinux, Fri Aug 1 18:05:23 2003 UTC revision 1.26 by delpinux, Sat Aug 2 17:49:04 2003 UTC
# Line 326  private: Line 326  private:
326                            const ObjectToTreat& O1,                            const ObjectToTreat& O1,
327                            ObjectToTreat& O2);                            ObjectToTreat& O2);
328    
329    void __showObject(Structured3DMesh& SMesh,    void __generateMesh(Structured3DMesh& SMesh,
330                      const Object& object, const size_t& level,                        const Object& object, const size_t& level,
331                      std::stack<ReferenceCounting<ObjectToTreat> >& objectStack);                        std::stack<ReferenceCounting<ObjectToTreat> >& objectStack);
332    
333    ReferenceCounting<Vector<Triangle> >    ReferenceCounting<Vector<Triangle> >
334    __marchingTetrahedra(Structured3DMesh& SMesh,    __marchingTetrahedra(Structured3DMesh& SMesh,
# Line 379  public : Line 379  public :
379      return __shape;      return __shape;
380    }    }
381    
382      ReferenceCounting<Shape>& shape()
383      {
384        assert(__shape != 0);
385        return __shape;
386      }
387    
388    bool inside(const Vertex& V) const    bool inside(const Vertex& V) const
389    {    {
390      return (*__shape).inside(V);      return (*__shape).inside(V);
# Line 551  __operationBoolean(ObjectToTreat& O0, Line 557  __operationBoolean(ObjectToTreat& O0,
557      hexaList2.insert((*i).first);      hexaList2.insert((*i).first);
558    }    }
559    
560      toTreatHexahedra.clear();
561    
562    std::set_intersection (hexaList1.begin(), hexaList1.end(),    std::set_intersection (hexaList1.begin(), hexaList1.end(),
563                           hexaList2.begin(), hexaList2.end(),                           hexaList2.begin(), hexaList2.end(),
564                           inserter(toTreatHexahedra, toTreatHexahedra.begin()));                           inserter(toTreatHexahedra, toTreatHexahedra.begin()));
# Line 2847  generatesAllSufaceMeshes(const Problem& Line 2855  generatesAllSufaceMeshes(const Problem&
2855    
2856    const Scene& scene =Omega.scene();    const Scene& scene =Omega.scene();
2857    
2858    #warning SHOULD EXTRACT sub-meshes from here.
2859    for(POVRayReferences::iterator povRef = povRefList.begin();    for(POVRayReferences::iterator povRef = povRefList.begin();
2860        povRef!= povRefList.end(); ++povRef) {        povRef!= povRefList.end(); ++povRef) {
2861      for (size_t i=0; i<scene.nbObjects(); ++i) {      for (size_t i=0; i<scene.nbObjects(); ++i) {
# Line 2856  generatesAllSufaceMeshes(const Problem& Line 2865  generatesAllSufaceMeshes(const Problem&
2865          SurfaceMeshOfTriangles* surfMesh          SurfaceMeshOfTriangles* surfMesh
2866            = new SurfaceMeshOfTriangles;            = new SurfaceMeshOfTriangles;
2867    
2868          Reference::Representation ref;          this->generateSurfacicMesh(Omega,
         ref.resize(scene.nbObjects());  
   
         ref[i] = true;  
   
         this->generateSurfacicMesh(O,  
                                    Omega,  
2869                                     *surfMesh,                                     *surfMesh,
2870                                     dynamic_cast<Structured3DMesh&>(M));                                     dynamic_cast<Structured3DMesh&>(M));
2871    
# Line 3017  void plothexa(size_t ncase,std::set<cons Line 3020  void plothexa(size_t ncase,std::set<cons
3020    
3021    
3022  void SurfaceMeshGenerator::Internals::  void SurfaceMeshGenerator::Internals::
3023  __showObject(Structured3DMesh& SMesh,  __generateMesh(Structured3DMesh& SMesh,
3024               const Object& object, const size_t& level,                 const Object& object, const size_t& level,
3025               std::stack<ReferenceCounting<ObjectToTreat> >& objectStack)                 std::stack<ReferenceCounting<ObjectToTreat> >& objectStack)
3026  {  {
   for (size_t i=0; i<level; ++i)  
     std::cout << "==";  
3027    switch(object.shapeType()) {    switch(object.shapeType()) {
3028    case Shape::union_: {    case Shape::union_: {
3029      const Union& U = static_cast<const Union&>(*(object.shape()));      const Union& U = static_cast<const Union&>(*(object.shape()));
# Line 3030  __showObject(Structured3DMesh& SMesh, Line 3031  __showObject(Structured3DMesh& SMesh,
3031      size_t j=0;      size_t j=0;
3032      for(Union::const_iterator i = U.begin();      for(Union::const_iterator i = U.begin();
3033          i != U.end(); ++i,++j) {          i != U.end(); ++i,++j) {
3034        __showObject(SMesh,(*(*i)), level+1, objectStack);        __generateMesh(SMesh,(*(*i)), level+1, objectStack);
3035        if (j>0) {        if (j>0) {
         for (size_t l=0; l<level; ++l)  
           std::cout << "==";  
   
         std::cerr << "Calcule l'union\n";  
   
3036          // get first object of the intersection          // get first object of the intersection
3037          ReferenceCounting<ObjectToTreat> O1 = objectStack.top();          ReferenceCounting<ObjectToTreat> O1 = objectStack.top();
3038          objectStack.pop();          objectStack.pop();
# Line 3049  __showObject(Structured3DMesh& SMesh, Line 3045  __showObject(Structured3DMesh& SMesh,
3045          __operationBoolean<UnionTest>(*O0,*O1, *O2);          __operationBoolean<UnionTest>(*O0,*O1, *O2);
3046    
3047          // Set shape function          // Set shape function
3048          Union* u = new Union();          if (j == 1) { // create an union shape
3049          u->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0)));            Union* u = new Union();
3050          u->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0)));            u->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0)));
3051          (*O0).setShape(u);            u->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0)));
3052              (*O0).setShape(u);
3053            } else { //use the union shape contained in O2
3054              Union& u = dynamic_cast<Union&>(*(*O2).shape());
3055              u.push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0)));
3056              (*O0).setShape((*O2).shape());
3057            }
3058    
3059          objectStack.push(O0);          objectStack.push(O0);
   
         std::cerr << __LINE__ << " Push union object!\n";  
3060        }        }
3061      }      }
3062      break;      break;
# Line 3067  __showObject(Structured3DMesh& SMesh, Line 3067  __showObject(Structured3DMesh& SMesh,
3067      size_t j=0;      size_t j=0;
3068      for(Intersection::const_iterator i = I.begin();      for(Intersection::const_iterator i = I.begin();
3069          i != I.end(); ++i,++j) {          i != I.end(); ++i,++j) {
3070        __showObject(SMesh,(*(*i)), level+1, objectStack);        __generateMesh(SMesh,(*(*i)), level+1, objectStack);
3071        if (j>0) {        if (j>0) {
         for (size_t l=0; l<level; ++l)  
           std::cout << "==";  
   
         std::cerr << "Calcule l'intersection\n";  
   
3072          // get first object of the intersection          // get first object of the intersection
3073          ReferenceCounting<ObjectToTreat> O1 = objectStack.top();          ReferenceCounting<ObjectToTreat> O1 = objectStack.top();
3074          objectStack.pop();          objectStack.pop();
# Line 3085  __showObject(Structured3DMesh& SMesh, Line 3080  __showObject(Structured3DMesh& SMesh,
3080          ReferenceCounting<ObjectToTreat> O0 = new ObjectToTreat();          ReferenceCounting<ObjectToTreat> O0 = new ObjectToTreat();
3081          __operationBoolean<IntersectionTest>(*O0,*O1, *O2);          __operationBoolean<IntersectionTest>(*O0,*O1, *O2);
3082    
3083          // Set shape function          if (j == 1) { // create an intersection shape
3084          Intersection* newI = new Intersection();            Intersection* newI = new Intersection();
3085          newI->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0)));            newI->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0)));
3086          newI->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0)));            newI->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0)));
3087          (*O0).setShape(newI);            (*O0).setShape(newI);
3088            } else { //use the intersection shape contained in O2
3089              Intersection& newI = dynamic_cast<Intersection&>(*(*O2).shape());
3090              newI.push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0)));
3091              (*O0).setShape((*O2).shape());
3092            }
3093          objectStack.push(O0);          objectStack.push(O0);
   
         std::cerr << __LINE__ << " Push union object!\n";  
3094        }        }
3095      }      }
3096      break;      break;
# Line 3107  __showObject(Structured3DMesh& SMesh, Line 3104  __showObject(Structured3DMesh& SMesh,
3104    }    }
3105    case Shape::not_: {    case Shape::not_: {
3106      const Object& notObject = *(static_cast<const Not&>(*object.shape()).object());      const Object& notObject = *(static_cast<const Not&>(*object.shape()).object());
3107      __showObject(SMesh, notObject,      __generateMesh(SMesh, notObject,
3108                   level+1, objectStack);                     level+1, objectStack);
3109    
3110      ObjectToTreat& o = (*objectStack.top());      ObjectToTreat& o = (*objectStack.top());
3111      ReferenceCounting<Shape> s = o.shape();      ReferenceCounting<Shape> s = o.shape();
3112  #warning NE PAS APPELER 'new Object'  #warning DO NOT CALL 'new Object'
3113      o.setShape(new Not(new Object(s, TinyVector<3,real_t>(0,0,0))));      o.setShape(new Not(new Object(s, TinyVector<3,real_t>(0,0,0))));
3114    
3115      break;      break;
# Line 3158  __marchingTetrahedra(Structured3DMesh& S Line 3155  __marchingTetrahedra(Structured3DMesh& S
3155    \warning Implementation could be improved and function size reduced.    \warning Implementation could be improved and function size reduced.
3156  */  */
3157  void SurfaceMeshGenerator::  void SurfaceMeshGenerator::
3158  generateSurfacicMesh(const Object& O,  generateSurfacicMesh(const Domain& Omega,
                      const Domain& Omega,  
3159                       SurfaceMeshOfTriangles& s_mesh,                       SurfaceMeshOfTriangles& s_mesh,
3160                       Structured3DMesh& SMesh)                       Structured3DMesh& SMesh)
3161  {  {
   const Shape& S = *(O.shape());  
       
3162    typedef std::map<TinyVector<3>, Object*,    typedef std::map<TinyVector<3>, Object*,
3163      SurfaceMeshGenerator::Internals::__ltv> ObjectReferences;      SurfaceMeshGenerator::Internals::__ltv> ObjectReferences;
3164    
# Line 3178  generateSurfacicMesh(const Object& O, Line 3172  generateSurfacicMesh(const Object& O,
3172    }    }
3173    
3174    std::stack<ReferenceCounting<SurfaceMeshGenerator::Internals::ObjectToTreat> > objectStack;    std::stack<ReferenceCounting<SurfaceMeshGenerator::Internals::ObjectToTreat> > objectStack;
3175    (*__internals).__showObject(SMesh,object, 0, objectStack);    (*__internals).__generateMesh(SMesh,object, 0, objectStack);
3176    
3177    //construction of s_mesh    //construction of s_mesh
3178    (*__internals).__constructionFinalMesh((*objectStack.top()),    (*__internals).__constructionFinalMesh((*objectStack.top()),

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.26

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26