00001 #ifndef VCODE_H
00002 #define VCODE_H
00003 #include <shape/ssi/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
00036 double nx,ny,nz;
00037
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
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
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
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
00157
00158 code |= (n01[i] > n00[i]-1e-6);
00159 code <<= 1;
00160
00161
00162 };
00163
00164 for ( unsigned i = 0; i < 3; i++ )
00165 {
00166 code |= (p10[i] > p00[i]);
00167 code <<= 1;
00168
00169
00170
00171
00172 code |= (p01[i] < p00[i]);
00173 code <<= 1;
00174 };
00175
00176 return code;
00177 };
00178
00179
00180
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