00001
00002
00003
00004
00005
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 }
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
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
00140
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