shape_doc 0.1
|
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