#include <ssiqtsl.hpp>
Definition at line 19 of file ssiqtsl.hpp.
typedef double aabb3[3][2] [inherited] |
Definition at line 19 of file ssiqts.hpp.
typedef double ipoint[7] [inherited] |
Definition at line 20 of file ssiqts.hpp.
typedef shape::use<shape::ssi_def,C,V>::ParametricSurface ParametricSurface |
Reimplemented from ssiqts< C, V >.
Definition at line 22 of file ssiqtsl.hpp.
Definition at line 23 of file ssiqtsl.hpp.
Reimplemented from ssiqts< C, V >.
Definition at line 21 of file ssiqtsl.hpp.
ssiqtsl | ( | ParametricSurface * | srfa, | |
ParametricSurface * | srfb, | |||
int | n | |||
) | [inline] |
Definition at line 339 of file ssiqtsl.hpp.
References ssiqtsl< C, V >::sample_curve3d(), and ssiqtsl< C, V >::solve().
00341 : SSIQTS(srfa,srfb,n,1,1) 00342 { 00343 solve(*this); 00344 sample_curve3d( srfa, srfb, *this ); 00345 // std::cout << errmax << std::endl; 00346 // gmvdump(); 00347 };
Definition at line 87 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().
00088 { 00089 int c = m*m; 00090 s = 0; 00091 l = 0; 00092 while ( c ) { s += c; c /= 4; l ++; }; 00093 return new typename SSIQTS::aabb3[s]; 00094 };
void build | ( | typename ssiqts< C, V >::aabb3 * | base, | |
const ssiqts< C, V > & | ssi | |||
) | [inline, static, inherited] |
Definition at line 174 of file ssiqts.hpp.
References ssiqts< C, V >::merge(), mmx::N(), and ssiqts< C, V >::update().
Referenced by ssiqts< C, V >::ssiqts().
00175 { 00176 int N = ssi.m; 00177 typename SSIQTS::aabb3 * cptr,*eptr,*next,*enext; 00178 cptr = base; 00179 eptr = base + N; 00180 next = base + N*N; 00181 enext = next + (N/2*N/2); 00182 00183 while ( next < enext ) 00184 { 00185 base = next; 00186 do 00187 { 00188 for ( ;cptr < eptr; cptr += 2, next++ ) 00189 { 00190 merge(*next,*cptr,*(cptr+1)); 00191 update(*next,*(cptr+N),*(cptr+1+N)); 00192 }; 00193 00194 cptr += N; 00195 eptr = cptr + N; 00196 } 00197 while ( next < enext ); 00198 cptr = base; 00199 N /= 2; 00200 eptr = cptr + N; 00201 enext = next + (N/2)*(N/2); 00202 }; 00203 };
int cfhunt | ( | typename ssiqts< C, V >::aabb3 * | lbb, | |
typename ssiqts< C, V >::aabb3 * | rbb, | |||
int * | bcf, | |||
int * | ecf | |||
) | [inline, static, inherited] |
Definition at line 209 of file ssiqts.hpp.
References ssiqts< C, V >::intersectp().
Referenced by ssiqts< C, V >::search().
00214 { 00215 int s = 0; 00216 int * rqp; // right-quad pointer 00217 int * cf; 00218 int * lrqp; // the last right-quad pointer... 00219 00220 /* pour tous les conflits encore presents a la resolution actuelle */ 00221 for ( cf = bcf; cf != ecf; cf += *cf ) 00222 { 00223 const int lq = cf[cflq_]; // addresse de l'element de la surface "gauche" 00224 lrqp = cf+cfbg_; // debut de la liste des elements de "droite" 00225 /* pour tout les elements de droite test d'intersection avec l'element de gauche */ 00226 for ( rqp = lrqp; rqp != cf + *cf; rqp ++ ) 00227 { 00228 /* si les boites s'intersectent, tassement de la liste */ 00229 if ( intersectp(*(lbb+lq),*(rbb+*rqp)) ) { *lrqp++ = *rqp; }; 00230 }; 00231 if ( lrqp != rqp ) *lrqp = -1; // marque la fin de liste 00232 int nc = lrqp-(cf+cfbg_); // nombre de collisions restantes 00233 s += (nc)?4*(cfhsz+4*nc):0; // taille necessaire pour leurs subdivisions 00234 }; 00235 return s; // taille totale necessaire apres traitement d'un niveau de subdivision 00236 }
void cfprint | ( | std::ostream & | gpr, | |
std::ostream & | gpl | |||
) | [inline, inherited] |
Definition at line 359 of file ssiqts.hpp.
References ssiqts< C, V >::m_bcf, and ssiqts< C, V >::m_ecf.
00360 { 00361 mmx::cfprint(gp, gpl, m_bcf, m_ecf, m ); 00362 };
static void fillboxes | ( | aabb3 * | qta, | |
const vector3 * | base, | |||
ssiqts< C, V > & | ssi | |||
) | [static, inherited] |
Referenced by ssiqts< C, V >::ssiqts().
void gmvdump | ( | ) | [inline] |
Definition at line 283 of file ssiqtsl.hpp.
References sample::m_svals, ssiqts< C, V >::smpa, ssiqts< C, V >::smpb, and ssiqtsl< C, V >::spcs.
00284 { 00285 std::ofstream o("SSIQTSL.gmv"); 00286 o << "LIST\n"; 00287 float colora[] = { 0.0, 0.0, 1.0 }; 00288 float colorb[] = { 0.0, 1.0, 0.0 }; 00289 o << "appearance {\n material{\n diffuse " << 00290 colora[0] << " " << colora[1] << " " << colora[2] << "\n"; 00291 o << "}\n}\n"; 00292 UVSMP(o,&(this->smpa->m_svals[0][0]),this->m+1,this->m+1); 00293 o << "appearance {\n material{\n diffuse " << 00294 colorb[0] << " " << colorb[1] << " " << colorb[2] << "\n"; 00295 o << "}\n}\n"; 00296 UVSMP(o,&(this->smpb->m_svals[0][0]),this->m+1,this->m+1); 00297 float color[] = { 1.0, 0.0, 0.0, 1.0 }; 00298 for ( unsigned i = 0; i < spcs.size(); i += 2 ) 00299 { 00300 color[1] = double(i % 2); 00301 color[2] = double((i+1)%2); 00302 POLYLINE(o,&(spcs[i][0]),2,color,1); 00303 }; 00304 };
void gpdump | ( | ) | [inline] |
Definition at line 271 of file ssiqtsl.hpp.
References ssiqtsl< C, V >::lpts, and ssiqtsl< C, V >::rpts.
00272 { 00273 std::ofstream gpl("SSIQTSL-L.dat"); 00274 std::ofstream gpr("SSIQTSL-R.dat"); 00275 00276 for ( unsigned i = 0; i < lpts.size(); i ++ ) 00277 gpl << lpts[i][0] << " " << lpts[i][1] << std::endl; 00278 for ( unsigned i = 0; i < rpts.size(); i ++ ) 00279 gpr << rpts[i][0] << " " << rpts[i][1] << std::endl; 00280 };
Referenced by ssiqts< C, V >::cfhunt().
Referenced by ssiqts< C, V >::build().
void merge | ( | typename ssiqts< C, V >::aabb3 & | box, | |
const typename ssiqts< C, V >::aabb3 & | a, | |||
const typename ssiqts< C, V >::aabb3 & | b | |||
) | [inline, static] |
Definition at line 181 of file ssiqtsl.hpp.
References mmx::max(), and mmx::min().
Referenced by ssiqtsl< C, V >::solve_cf().
void sample_curve3d | ( | ParametricSurface * | srfa, | |
ParametricSurface * | srfb, | |||
ssiqtsl< C, V > & | ssi | |||
) | [inline, static] |
Definition at line 307 of file ssiqtsl.hpp.
References mmx::eval(), and max_abs().
Referenced by ssiqtsl< C, V >::ssiqtsl().
00309 { 00310 // std::cout << " left = " << ssi.lpts.size() << std::endl; 00311 int nl = ssi.lpts.size(); 00312 // std::cout << " right = " << ssi.rpts.size() << std::endl; 00313 ssi.spcs.resize( nl ); 00314 std::vector<typename SSIQTSL::vector3> srfb_samples(nl); 00315 shape::use<shape::ssi_def,C,V>::eval(srfa, (double*)(&(ssi.spcs[0])), (const double*)(&ssi.lpts[0]), ssi.lpts.size() ); 00316 shape::use<shape::ssi_def,C,V>::eval(srfb, (double*)(&(srfb_samples[0])), (const double*)(&ssi.rpts[0]), ssi.rpts.size() ); 00317 // std::vector<double> errs; 00318 // ssi.errs.resize( ssi.lpts.size() ); 00319 ssi.errmax = 0; 00320 for ( unsigned i = 0; i < ssi.lpts.size(); i ++ ) 00321 { 00322 00323 // int lk0, lk1, stat; 00324 // SSIQTSL::vector3 pa,pb; 00325 typename SSIQTSL::vector3 delta; 00326 double s = 0; 00327 // std::cout << ssi.spcs[i] << std::endl; 00328 // std::cout << srfb_samples[i] << std::endl; 00329 for ( int k =0; k < 3; k ++ ) 00330 delta[k] = ssi.spcs[i][k]-srfb_samples[i][k]; 00331 s = max_abs( delta ); 00332 for ( int k = 0; k < 3; k ++ ) 00333 ssi.spcs[i][k] = (ssi.spcs[i][k]+srfb_samples[i][k])/2; 00334 if ( s > ssi.errmax ) ssi.errmax = s; 00335 }; 00336 };
void search | ( | typename ssiqts< C, V >::aabb3 * | lroot, | |
typename ssiqts< C, V >::aabb3 * | rroot, | |||
ssiqts< C, V > & | ssi | |||
) | [inline, static, inherited] |
Definition at line 298 of file ssiqts.hpp.
References ssiqts< C, V >::cfhunt().
Referenced by ssiqts< C, V >::ssiqts().
00299 { 00300 int S, M; 00301 int * bcf, * ecf, * ncf; 00302 00303 // nxt,ext,lq,b0,b1... 00304 /* conflits de depart: (0, 0) */ 00305 bcf = new int[cfhsz+1]; 00306 bcf[cfsz_] = cfhsz+1; 00307 bcf[cflq_] = 0; 00308 bcf[cfbg_] = 0; 00309 ecf = bcf + bcf[cfsz_]; 00310 int s = 0; 00311 00312 typename SSIQTS::aabb3 *lbb = lroot; /* represente le niveau courant dans le quadtree "gauche" */ 00313 typename SSIQTS::aabb3 *rbb = rroot; /* represente le niveau courant dans le quadtree "droit" */ 00314 00315 /* pour toutes resolutions M = 1 .. m=2^p */ 00316 for ( S = 1, M = 1, lbb = lroot, rbb = rroot; M != ssi.m; M *= 2, S *= 4, lbb -= S, rbb -= S ) 00317 { 00318 /* traitement des collisions pour chaque conflit */ 00319 s = cfhunt( lbb, rbb, bcf, ecf ); 00320 /* si pas de collisions retour */ 00321 if ( !s ) { delete[] bcf; return; }; 00322 /* sinon allocation de l'espace necessaire */ 00323 ncf = new int[ s ]; 00324 /* definition des nouveaux conflits a tester */ 00325 // std::cout << "cfforward\n"; 00326 cfforward(ncf,bcf,ecf,M); 00327 /* suppression des anciens conflits */ 00328 delete[] bcf; 00329 bcf = ncf; 00330 ecf = ncf + s; 00331 }; 00332 00333 /* traitement du dernier niveau */ 00334 s = cfhunt(lbb,rbb,bcf,ecf); 00335 ecf = cfsimplify(bcf,ecf); 00336 ssi.m_bcf = bcf; 00337 ssi.m_ecf = ecf; 00338 };
void solve | ( | ssiqtsl< C, V > & | ssi | ) | [inline, static] |
Definition at line 235 of file ssiqtsl.hpp.
References ssiqtsl< C, V >::solve_cf().
Referenced by ssiqtsl< C, V >::ssiqtsl().
00236 { 00237 typename SSIQTSL::vector3 * sleft = (typename SSIQTSL::vector3*)(&(ssi.smpa->m_svals)[0]); 00238 typename SSIQTSL::vector3 * sright = (typename SSIQTSL::vector3*)(&(ssi.smpb->m_svals)[0]); 00239 00240 00241 for( int * cf = ssi.m_bcf; cf != ssi.m_ecf; cf += *cf ) 00242 { 00243 if ( cf[cfbg_] != -1 ) 00244 { 00245 int lu = cf[cflq_]/ssi.m; 00246 int lv = cf[cflq_]%ssi.m; 00247 typename SSIQTSL::vector3 * qpl[4]; 00248 qpl[0] = sleft + lu*(ssi.m+1)+lv; 00249 qpl[1] = sleft + (lu+1)*(ssi.m+1)+lv; 00250 qpl[2] = qpl[1] + 1; 00251 qpl[3] = qpl[0] + 1; 00252 int * rpq = cf+cfbg_; 00253 while ( *rpq != -1 && rpq != cf+*cf ) 00254 { 00255 int ru = (*rpq/ssi.m); 00256 int rv = (*rpq%ssi.m); 00257 typename SSIQTSL::vector3 * qpr[4]; 00258 qpr[0] = sright + ru*(ssi.m+1)+rv; 00259 qpr[1] = sright + (ru+1)*(ssi.m+1)+rv; 00260 qpr[2] = qpr[1] + 1; 00261 qpr[3] = qpr[0] + 1; 00262 solve_cf(qpl,qpr,cf[cflq_],*rpq,ssi); 00263 rpq++; 00264 }; 00265 } 00266 }; 00267 };
void solve_cf | ( | typename ssiqtsl< C, V >::vector3 ** | qpa, | |
typename ssiqtsl< C, V >::vector3 ** | qpb, | |||
int | a, | |||
int | b, | |||
ssiqtsl< C, V > & | ssi | |||
) | [inline, static] |
Definition at line 192 of file ssiqtsl.hpp.
References __down__, __ssiqtsl__triangle_triangle_case__, __up__, mmx::intersection(), and ssiqtsl< C, V >::merge().
Referenced by ssiqtsl< C, V >::solve().
00193 { 00194 // scaling 00195 typename SSIQTSL::aabb3 zoom; 00196 double mx = 0; 00197 merge(zoom,ssi.boxa[a],ssi.boxb[b]); 00198 /* 00199 std::cout << "boxa\n"; 00200 for ( int i = 0; i < 3; i ++ ) 00201 std::cout << boxa[a][i][0] << " " << boxa[a][i][1] << std::endl; 00202 std::cout << "boxb\n"; 00203 for ( int i = 0; i < 3; i ++ ) 00204 std::cout << boxb[b][i][0] << " " << boxb[b][i][1] << std::endl; 00205 */ 00206 for ( int k = 0; k < 3; k ++ ) { 00207 zoom[k][1] -= zoom[k][0]; 00208 if ( zoom[k][1] > mx ) mx = zoom[k][1]; 00209 }; 00210 00211 double sc = double(1.0)/mx; 00212 typename SSIQTSL::vector3 qa[4]; 00213 typename SSIQTSL::vector3 qb[4]; 00214 00215 for ( int i = 0; i < 4; i ++ ) 00216 for ( int k = 0; k < 3; k ++ ) 00217 { 00218 qa[i][k] = ((*(qpa[i]))[k] - zoom[k][0]) * sc; 00219 qb[i][k] = ((*(qpb[i]))[k] - zoom[k][0]) * sc; 00220 }; 00221 00222 typename SSIQTSL::vector3 seg [2]; 00223 typename SSIQTSL::vector2 seg0[2]; 00224 typename SSIQTSL::vector2 seg1[2]; 00225 bool coplanar = false; 00226 bool intersection; 00227 __ssiqtsl__triangle_triangle_case__(__up__,__up__); 00228 __ssiqtsl__triangle_triangle_case__(__up__,__down__); 00229 __ssiqtsl__triangle_triangle_case__(__down__,__up__); 00230 __ssiqtsl__triangle_triangle_case__(__down__,__down__); 00231 };
void space2prm | ( | ssiqtsl< C, V >::vector2 & | pa, | |
ssiqtsl< C, V >::vector2 & | pb, | |||
const ssiqtsl< C, V >::vector3 & | sa, | |||
const ssiqtsl< C, V >::vector3 & | sb, | |||
const ssiqtsl< C, V >::vector3 & | base, | |||
const ssiqtsl< C, V >::vector3 & | pu, | |||
const ssiqtsl< C, V >::vector3 & | pv | |||
) | [inline, static] |
Definition at line 135 of file ssiqtsl.hpp.
00142 { 00143 /* T(u,v) = base + u*bu +v*bv 00144 => 00145 spc[0] - base[0] = delta[0] = / bu[0] bv[0]\ / u \ 00146 spc[1] - base[1] = delta[1] = | bu[1] bv[1]| | | 00147 spc[2] - base[2] = delta[2] = \ bu[2] bv[2]/ \ v / 00148 */ 00149 typename SSIQTSL::vector3 bu; 00150 for ( int i = 0; i < 3; i ++ ) bu[i] = pu[i]-base[i]; 00151 typename SSIQTSL::vector3 bv; 00152 for ( int i = 0; i < 3; i ++ ) bv[i] = pv[i]-base[i]; 00153 double muu, mvv, muv; 00154 muu = 0; 00155 for ( int i = 0; i < 3; i ++ ) muu += bu[i]*bu[i]; 00156 mvv = 0; 00157 for ( int i = 0; i < 3; i ++ ) mvv += bv[i]*bv[i]; 00158 muv = 0; 00159 for ( int i = 0; i < 3; i ++ ) muv += bu[i]*bv[i]; 00160 double detm = muu*mvv - muv*muv; 00161 typename SSIQTSL::vector3 delta; 00162 double x, y; 00163 for ( int k = 0; k < 3; k ++ ) delta[k] = sa[k]-base[k]; 00164 x = 0; 00165 for ( int k = 0; k < 3; k ++ ) x += bu[k]*delta[k]; 00166 y = 0; 00167 for ( int k = 0; k < 3; k ++ ) y += bv[k]*delta[k]; 00168 pa[0] = (mvv * x - muv * y)/detm; 00169 pa[1] = (muu * y - muv * x)/detm; 00170 for ( int k = 0; k < 3; k ++ ) delta[k] = sb[k]-base[k]; 00171 x = 0; 00172 for ( int k = 0; k < 3; k ++ ) x += bu[k]*delta[k]; 00173 y = 0; 00174 for ( int k = 0; k < 3; k ++ ) y += bv[k]*delta[k]; 00175 pb[0] = (mvv * x - muv * y)/detm; 00176 pb[1] = (muu * y - muv * x)/detm; 00177 };
Referenced by ssiqts< C, V >::build().
Definition at line 44 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().
Definition at line 45 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().
double errmax |
Definition at line 30 of file ssiqtsl.hpp.
std::vector< double > errs |
Definition at line 28 of file ssiqtsl.hpp.
Definition at line 25 of file ssiqtsl.hpp.
Referenced by ssiqtsl< C, V >::gpdump().
int m [inherited] |
Definition at line 25 of file ssiqts.hpp.
int* m_bcf [inherited] |
Definition at line 47 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::cfprint().
int* m_ecf [inherited] |
Definition at line 48 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::cfprint().
Definition at line 26 of file ssiqtsl.hpp.
Referenced by ssiqtsl< C, V >::gpdump().
Definition at line 41 of file ssiqts.hpp.
Referenced by ssiqtsl< C, V >::gmvdump(), and ssiqts< C, V >::ssiqts().
Definition at line 42 of file ssiqts.hpp.
Referenced by ssiqtsl< C, V >::gmvdump(), and ssiqts< C, V >::ssiqts().
Definition at line 27 of file ssiqtsl.hpp.
Referenced by ssiqtsl< C, V >::gmvdump(), and mmx::shape::intersection().
Definition at line 29 of file ssiqtsl.hpp.
int udeg [inherited] |
Definition at line 23 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().
int vdeg [inherited] |
Definition at line 24 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().