synaps/topology/box3d.h

Go to the documentation of this file.
00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS library          *
00003 *   Author(s): L. Deschamps                                          *
00004 *              G. Gatellier                                          *
00005 *              B. Mourrain, GALAAD, INRIA                            *
00006 **********************************************************************/
00008 #ifndef synaps_topology_box3d_H
00009 #define synaps_topology_box3d_H
00010 /*********************************************************************/
00011 
00012 #include <synaps/init.h>
00013 #include <synaps/topology/point.h>
00014 
00015 #include <iostream>
00016 
00017 __BEGIN_NAMESPACE_SYNAPS
00018 
00019 namespace topology 
00020 {
00021 
00023 
00028 template < class C = double >
00029 struct box3d 
00030 {
00032   typedef C coeff_t;
00033   
00035   C x0, x1, y0, y1, z0, z1;
00036 
00038   box3d (): 
00039     x0( 0 ), x1( 1 ),
00040     y0( 0 ), y1( 1 ),
00041     z0( 0 ), z1( 1 ) {}
00042   
00044   box3d ( C xMin, C xMax, C yMin, C yMax, C zMin, C zMax ):
00045     x0( xMin ), x1( xMax ),
00046     y0( yMin ), y1( yMax ),
00047     z0( zMin ), z1( zMax ) {}
00048   
00050   box3d( const box3d & box ):
00051     x0( box.x0 ), x1( box.x1 ),
00052     y0( box.y0 ), y1( box.y1 ),
00053     z0( box.z0 ), z1( box.z1 ) {}
00054   
00056   void set( C xMin, C xMax, C yMin, C yMax, C zMin, C zMax ) 
00057     {
00058       x0 = xMin; x1 = xMax;
00059       y0 = yMin; y1 = yMax;
00060       z0 = zMin; z1 = zMax;
00061     }
00062   
00064   box3d operator= ( const box3d<C> & box ) 
00065     {
00066       x0 = box.x0; x1 = box.x1;
00067       y0 = box.y0; y1 = box.y1;
00068       z0 = box.z0; z1 = box.z1;
00069       
00070       return *this;
00071     }
00072   
00073 };
00074  
00075 } // end namespace topology
00076 
00078 template < class C >
00079 bool operator==( topology::box3d< C > &b0, topology::box3d< C > &b1 )
00080 {
00081   return ( ( b0.x0 == b1.x0 ) && 
00082            ( b0.x1 == b1.x1 ) && 
00083            ( b0.y0 == b1.y0 ) && 
00084            ( b0.y1 == b1.y1 ) && 
00085            ( b0.z0 == b1.z0 ) && 
00086            ( b0.z1 == b1.z1 ) );
00087 }
00088 
00090 template < class C >
00091 std::ostream & operator<<( std::ostream & os,
00092                            const topology::box3d< C > & b ) 
00093 {
00094   os << "[ [ [" 
00095      << b.x0 << "," << b.x1 << "] , ["
00096      << b.y0 << "," << b.y1 << "] , ["
00097      << b.z0 << "," << b.z1 
00098      << "] ] ]";
00099   
00100   return os;
00101 }
00102 
00109 template< class C >
00110 void checkbox3d( topology::box3d<C> box, 
00111                  bool &minRow, bool &minCol, bool &minHgt,
00112                  C epsRow ,C epsCol ,C epsHgt ) 
00113 {
00114   minRow = false;
00115   minCol = false;
00116   minHgt = false;
00117 
00118   if ( ( ( box.x1 - box.x0 ) ) <= epsRow ) minRow = true;
00119   if ( ( ( box.y1 - box.y0 ) ) <= epsCol ) minCol = true;
00120   if ( ( ( box.z1 - box.z0 ) ) <= epsHgt ) minHgt = true;
00121 }
00122 
00123 //--------------------------------------------------------------------
00124 template < class POINTGRAPH, class C>
00125 void build_box(POINTGRAPH& g, const topology::box3d<C>& bx)
00126 {
00127   typedef C coeff_t;
00128   typedef topology::point<coeff_t>       point_t;
00129   typedef typename POINTGRAPH::point_t       gpoint_t;
00130   int nBIdx;
00131   point_t l(3u);
00132   
00133   // form the graph representing the shape of the cell
00134   for (int i = 0; i < 8; i++)
00135     {
00136       l[0] = ((i&0x1) ? bx.x1:bx.x0);
00137       l[1] = ((i&0x2) ? bx.y1:bx.y0);
00138       l[2] = ((i&0x4) ? bx.z1:bx.z0);
00139       //nBIdx = g.push_back(shared_object(l));
00140       //nBIdx = g.push_back(intersection_ptr(new intersection_t(l,0,1)));
00141       nBIdx = g.push_back(l);
00142     }
00143   
00144   nBIdx -= 7;
00145   
00146   g.insert(nBIdx,nBIdx+1);
00147   g.insert(nBIdx,nBIdx+2);
00148   g.insert(nBIdx+1,nBIdx+3);
00149   g.insert(nBIdx+2,nBIdx+3);
00150   
00151   g.insert(nBIdx+4,nBIdx+5);
00152   g.insert(nBIdx+4,nBIdx+6);
00153   g.insert(nBIdx+5,nBIdx+7);
00154   g.insert(nBIdx+6,nBIdx+7);
00155   
00156   g.insert(nBIdx,nBIdx+4);
00157   g.insert(nBIdx+1,nBIdx+5);
00158   g.insert(nBIdx+2,nBIdx+6);
00159   g.insert(nBIdx+3,nBIdx+7);
00160 }
00161 
00162 
00163 /*********************************************************************/
00164 
00165 __END_NAMESPACE_SYNAPS
00166 
00167 #endif // synaps_topology_box3d_H

SYNAPS DOCUMENTATION
logo