shape_doc 0.1
/Users/mourrain/Devel/mmx/shape/include/shape/ssi_vcode.hpp
Go to the documentation of this file.
00001 #ifndef VCODE_H
00002 #define VCODE_H
00003 #include <shape/ssi_bin_pack.hpp>
00004 
00005 typedef unsigned vcode_t;
00006 
00007 
00008 #define xcode(c) ((c&0xf00000) >> 20)
00009 #define ycode(c) ((c&0x00f000) >> 12)
00010 #define zcode(c) ((c&0x0000f0) >>  4)
00011 
00012 
00013 #define Z_MASK  0xf
00014 #define Y_MASK  (Z_MASK<<4)
00015 #define X_MASK  (Y_MASK<<4)
00016 #define NZ_MASK (3 << 12)
00017 #define NY_MASK (NZ_MASK << 2)
00018 #define NX_MASK (NY_MASK << 2)
00019 #define EPS 1e-12
00020 #define gt(a,b) ((a)>(b)+EPS)
00021 #define lt(a,b) ((b)>(a)+EPS)
00022 #define ps(a)   ((a)>EPS)
00023 #define ng(a)   (EPS>(a));
00024 template<class K>
00025  vcode_t vcode( const K& p00, const K& p10, const K& p01 )
00026 {
00027 #define xu (p10[0]-p00[0])
00028 #define xv (p01[0]-p00[0])
00029 #define yu (p10[1]-p00[1])
00030 #define yv (p01[1]-p00[1])
00031 #define zu (p10[2]-p00[2])
00032 #define zv (p01[2]-p00[2])
00033   unsigned code = 0;
00034 
00035   // NX
00036   double nx,ny,nz;
00037   //  double anx,any,anz;
00038   nx = yu*zv - yv*zu;
00039   ny = xu*zv - xv*zu;
00040   nz = xu*yv - xv*yu;
00041 
00042   code |= nx > 0;
00043   code <<= 1;
00044   code |= ny > 0;
00045   code <<= 1;
00046   code |= nz > 0;
00047   code <<= 1;
00048   
00049   for ( unsigned i = 0; i < 3; i++ )
00050     {
00051       code |= gt(p10[i],p00[i]);
00052       code <<= 1;
00053       code |= lt(p10[i],p00[i]);
00054       code <<= 1;
00055       code |= gt(p01[i],p00[i]);
00056       code <<= 1;
00057       code |= lt(p01[i],p00[i]);
00058       code <<= 1;
00059     };
00060 
00061   return code;
00062 };
00063 
00064 
00065 template<class K>
00066  vcode_t vcode2( const K& p00, const K& p10, const K& p01 )
00067 {
00068 #define xu (p10[0]-p00[0])
00069 #define xv (p01[0]-p00[0])
00070 #define yu (p10[1]-p00[1])
00071 #define yv (p01[1]-p00[1])
00072 #define zu (p10[2]-p00[2])
00073 #define zv (p01[2]-p00[2])
00074   unsigned code = 0;
00075 
00076   for ( unsigned i = 0; i < 3; i++ )
00077     {
00078       code |= (p10[i] > 0);
00079       code <<= 1;
00080       code |= (p01[i] > 0);
00081       code <<= 1;
00082       code |= (p00[i] > 0);
00083       code <<= 1;
00084     };
00085 
00086   return code;
00087 };
00088 
00089 
00090 
00091 template<class Pt, class K>
00092  vcode_t vcode( Pt& n, const K& p00, const K& p10, const K& p01 )
00093 {
00094 #define xu (p10[0]-p00[0])
00095 #define xv (p01[0]-p00[0])
00096 #define yu (p10[1]-p00[1])
00097 #define yv (p01[1]-p00[1])
00098 #define zu (p10[2]-p00[2])
00099 #define zv (p01[2]-p00[2])
00100   unsigned code = 0;
00101 
00102   // NX
00103   n[0]  = yu*zv-yv*zu;
00104   code |= (n[0]>0);
00105   code <<=1;
00106   code |= (n[0]<0);
00107   code <<=1;
00108 
00109 
00110   // NY
00111   n[1]  = zu*xv-xu*zv;
00112   code |= (n[1]>0);
00113   code <<=1;  
00114   code |= (n[1]<0);
00115   code <<=1;
00116 
00117   // NZ 
00118   n[2] = xu*yv-xv*yu;
00119   code |= (n[2]>0);
00120   code <<=1;
00121   code |= (n[2]<0);
00122   code <<=1;
00123   
00124   for ( unsigned i = 0; i < 3; i++ )
00125     {
00126       code |= (p10[i] > p00[i]);
00127       code <<= 1;
00128       code |= (p10[i] < p00[i]);
00129       code <<= 1;
00130       code |= (p01[i] > p00[i]);
00131       code <<= 1;
00132       code |= (p01[i] < p00[i]);
00133       code <<= 1;
00134     };
00135 
00136   return code;
00137 };
00138 
00139 
00140 
00141 template<class Pt, class K>
00142   vcode_t vcode( Pt& n00, Pt& n10, Pt& n01,  const K& p00, const K& p10, const K& p01 )
00143 {
00144 #define xu (p10[0]-p00[0])
00145 #define xv (p01[0]-p00[0])
00146 #define yu (p10[1]-p00[1])
00147 #define yv (p01[1]-p00[1])
00148 #define zu (p10[2]-p00[2])
00149 #define zv (p01[2]-p00[2])
00150   unsigned code = 0;
00151 
00152   for ( unsigned i = 0; i < 3; i++ )
00153     {
00154       code |= (n10[i] > n00[i]-1e-6);
00155       code <<= 1;
00156       //      code |= (n10[i]-1e-6 < n00[i]);
00157       //      code <<= 1;
00158       code |= (n01[i] > n00[i]-1e-6);
00159       code <<= 1;
00160       //      code |= (n01[i]-1e-6 < n00[i]);
00161       //      code <<= 1;
00162     };
00163   
00164   for ( unsigned i = 0; i < 3; i++ )
00165     {
00166       code |= (p10[i] > p00[i]);
00167       code <<= 1;
00168       //      code |= (p10[i] < p00[i]);
00169       //      code <<= 1;
00170       //      code |= (p01[i] > p00[i]);
00171       //      code <<= 1;
00172       code |= (p01[i] < p00[i]);
00173       code <<= 1;
00174     };
00175 
00176   return code;
00177 };
00178 
00179 
00180 // a verifier !!
00181 inline bool coherent_code( vcode_t c0, vcode_t c1 )
00182 {
00183   return false;
00184   #define XY_MASK (X_MASK|Y_MASK|NZ_MASK)
00185   #define YZ_MASK (Y_MASK|Z_MASK|NX_MASK)
00186   #define ZX_MASK (Z_MASK|X_MASK|NY_MASK)
00187   
00188   #define XNZ_MASK (X_MASK|NZ_MASK)
00189   #define XNY_MASK (X_MASK|NY_MASK)
00190   #define YNZ_MASK (Y_MASK|NZ_MASK)
00191   #define YNX_MASK (Y_MASK|NX_MASK)
00192   #define ZNX_MASK (Z_MASK|NX_MASK)
00193   #define ZNY_MASK (Z_MASK|NY_MASK)
00194   
00195   unsigned denom = c0 & c1;
00196   #define CLASSIC
00197   #ifdef CLASSIC
00198   if ( denom )
00199     {
00200       return 
00201         ( (denom & XY_MASK) == (c0 & XY_MASK) )  ||
00202         ( (denom & YZ_MASK) == (c0 & YZ_MASK) )  ||
00203         ( (denom & ZX_MASK) == (c0 & ZX_MASK) ); 
00204     };
00205   #else
00206   if ( denom )
00207     {
00208       return 
00209         ((denom & X_MASK) && ( ((denom & XNZ_MASK) == (c0 & XNZ_MASK))    ||
00210                                ((denom & XNY_MASK) == (c0 & XNY_MASK)) )) ||
00211         ((denom & Y_MASK) && ( ((denom & YNZ_MASK) == (c0 & YNZ_MASK))    ||
00212                                ((denom & YNX_MASK) == (c0 & YNX_MASK)) )) ||
00213         ((denom & Z_MASK) && ( ((denom & ZNY_MASK) == (c0 & ZNY_MASK))    ||
00214                                ((denom & ZNX_MASK) == (c0 & ZNX_MASK)) ));
00215         
00216         
00217         
00218 
00219     }
00220   #endif
00221   return false;
00222   
00223 };
00224 
00225 
00226 
00227 #endif