shape_doc 0.1
/Users/mourrain/Devel/mmx/shape/include/shape/cell3d_list.hpp
Go to the documentation of this file.
00001 /*****************************************************************************
00002  * M a t h e m a  g i x
00003  *****************************************************************************
00004  * Cell
00005  * 2008-03-20
00006  * Julien Wintz & Bernard Mourrain
00007  *****************************************************************************
00008  *               Copyright (C) 2008 INRIA Sophia-Antipolis
00009  *****************************************************************************
00010  * Comments :
00011  ****************************************************************************/
00012 
00013 # ifndef shape_cell3d_list_hpp
00014 # define shape_cell3d_list_hpp
00015 
00016 # include <shape/cell3d.hpp>
00017 # include <shape/solver_implicit.hpp>
00018 
00019 # define TMPL template<class C, class V>
00020 # define REF  REF_OF(V)
00021 # define Point      point<C,REF>
00022 # define SELF       cell3d_list<C,V>
00023 # define Solver     solver_implicit<C,V>
00024 # undef Cell
00025 # undef Topology
00026 //====================================================================
00027 namespace mmx {
00028 namespace shape {
00029 
00030 template<class C, class V=default_env>
00031 class cell3d_list: public cell3d<C,V>  {
00032 public:
00033   typedef bounding_box<C,REF>      BoundingBox;
00034   typedef cell3d<C,REF>              Cell;
00035   typedef topology<C,V>          Topology;
00036 
00037   cell3d_list(void) ;
00038   cell3d_list(double xmin, double xmax) ;
00039   cell3d_list(double xmin, double xmax, double ymin, double ymax) ;
00040   cell3d_list(double xmin, double xmax, double ymin, double ymax, bool itr) ;
00041   cell3d_list(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax) ;
00042   cell3d_list(const BoundingBox& bx);
00043   virtual ~cell3d_list(void) ;
00044 
00045   virtual bool is_active  (void) const;
00046   virtual bool is_regular (void) ;
00047 
00048   virtual bool insert_regular(Topology*);// = 0 ;
00049   virtual bool insert_singular(Topology*);// = 0 ;
00050   
00051 
00052   void push_back(Cell *) ; 
00053   int  count(void) { return m_objects.size() ; }
00054 
00055 
00056   virtual bool is_intersected(){return true;}
00057 
00058   virtual bool topology_regular(Topology*);// = 0 ;
00059   virtual void subdivide(Cell*& left, Cell*& right, int v, double s);// = 0 ;
00060   virtual void split_position(int& v, double& s);// = 0 ;
00061 
00062 protected:
00063   Seq<Cell *>        m_objects  ;
00064   Seq<Point*>        m_singulars;
00065   mutable bool       m_intersect;
00066 };
00067     
00068 TMPL SELF::cell3d_list(void): m_intersect(false) {}
00069 TMPL SELF::cell3d_list(double xmin, double xmax) : Cell(xmin, xmax), m_intersect(true) {}
00070 TMPL SELF::cell3d_list(double xmin, double xmax, double ymin, double ymax) :  Cell(xmin, xmax, ymin, ymax), m_intersect(true) {}
00071 TMPL SELF::cell3d_list(double xmin, double xmax, double ymin, double ymax, bool itr) : Cell(xmin, xmax, ymin, ymax), m_intersect(itr) {}
00072 TMPL SELF::cell3d_list(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax) : Cell(xmin, xmax, ymin, ymax, zmin, zmax), m_intersect(false) {}
00073 TMPL SELF::cell3d_list(const BoundingBox& bx): Cell(bx), m_intersect(true)  {};
00074 
00075 TMPL SELF::~cell3d_list(void) {
00076   foreach (Cell* m, m_objects) delete m;
00077 }
00078   
00079 TMPL  bool 
00080 SELF::is_active() const {
00081   foreach (Cell* m, m_objects) 
00082     if(m->is_active()) return true;
00083   return false;
00084 }
00085 
00086 TMPL bool 
00087 SELF::insert_regular(Topology* s) {
00088   //    foreach(Point* p, m_singulars) s->insert_singular(p);
00089   foreach(Cell*  m, m_objects)   m->insert_regular(s);
00090   return true;
00091 }
00092   
00093 TMPL bool 
00094 SELF::insert_singular(Topology* s) {
00095   //s->singular(this);
00096   foreach(Cell * m, m_objects) m->insert_singular(s);
00097   return true;
00098 }
00099 
00100 TMPL void 
00101 SELF::push_back(Cell *cv) {
00102   m_objects.push_back(cv);
00103 }
00104 
00105 TMPL bool 
00106 SELF::is_regular() {
00107   foreach (Cell* m, this->m_objects) 
00108     if(!m->is_regular()) return false;
00109   
00110   if(this->m_objects.size() >1 && m_intersect) {
00111     //       for(unsigned i=0; i<m_objects.size();i++)
00112 //              for(unsigned j=i+1; j< m_objects.size(); j++)
00113 //                Solver::intersection(m_singulars, m_objects[i]->equation(), m_objects[j], (BoundingBox)*this);
00114     m_intersect = false;
00115   }
00116   
00117   if (m_singulars.size() > 1) return false;
00118   
00119   return true;
00120 }
00121 
00122 TMPL bool SELF::topology_regular (Topology* s) { 
00123   return true; 
00124 }
00125 
00126 
00127 TMPL void SELF::split_position(int& v, double& s) {
00128   double sx = (this->xmax()-this->xmin());
00129   double sy = (this->ymax()-this->ymin());
00130   double sz = (this->zmax()-this->zmin());
00131   
00132   if(sx<sy)
00133       if(sy<sz) {
00134         v=2;
00135         s=(this->zmax()+this->zmin())/2;
00136       } else {
00137         v=1;
00138         s=(this->ymax()+this->ymin())/2;
00139       }
00140     else
00141       if(sx<sz) {
00142         v=2;
00143         s=(this->zmax()+this->zmin())/2;
00144       } else {
00145         v=0;
00146         s=(this->xmax()+this->xmin())/2;
00147       }
00148 }
00149 
00150 TMPL void
00151 SELF::subdivide(Cell*& , Cell*& , int , double ) {
00152   
00153   typedef SELF Cell_t;
00154 
00155 }
00156   
00157 } ; // namesapce shape
00158 } ; // namespace mmx
00159 # undef TMPL 
00160 # undef SELF
00161 # undef REF
00162 # undef Point
00163 # undef Solver 
00164 # endif // shape_cell3d_list_hpp