#include <ssiqts.hpp>
Definition at line 16 of file ssiqts.hpp.
typedef double aabb3[3][2] |
Definition at line 19 of file ssiqts.hpp.
typedef double ipoint[7] |
Definition at line 20 of file ssiqts.hpp.
typedef shape::use<shape::ssi_def,C,V>::ParametricSurface ParametricSurface |
Reimplemented in ssiqtsl< C, V >.
Definition at line 21 of file ssiqts.hpp.
Reimplemented in ssiqtsl< C, V >.
Definition at line 18 of file ssiqts.hpp.
ssiqts | ( | ParametricSurface * | srfa, | |
ParametricSurface * | srfb, | |||
int | n, | |||
int | degu, | |||
int | degv | |||
) | [inline] |
Definition at line 365 of file ssiqts.hpp.
References ssiqts< C, V >::alloc(), ssiqts< C, V >::boxa, ssiqts< C, V >::boxb, ssiqts< C, V >::build(), ssiqts< C, V >::fillboxes(), sample::m_svals, mmx::sample(), ssiqts< C, V >::search(), ssiqts< C, V >::smpa, ssiqts< C, V >::smpb, ssiqts< C, V >::udeg, and ssiqts< C, V >::vdeg.
00366 { 00367 udeg = degu; 00368 vdeg = degv; 00369 int p = 0; 00370 m = 1; 00371 while( n ) { p++; n/=2; m *= 2; }; 00372 smpa = new sample(srfa,m*degu+1,m*degv+1); 00373 smpb = new sample(srfb,m*degu+1,m*degv+1); 00374 int s; 00375 int deep; 00376 boxa = alloc(deep,m,s); 00377 // std::cout << deep << " " << s << std::endl; 00378 boxb = alloc(deep,m,s); 00379 // std::cout << deep << " " << s << std::endl; 00380 // switch u interpolant 00381 // switch v interpolant 00382 fillboxes( boxa, smpa->m_svals, *this); 00383 fillboxes( boxb, smpb->m_svals, *this); 00384 build(boxa,*this); 00385 build(boxb,*this); 00386 search(boxa+s-1,boxb+s-1,*this); 00387 // std::cout << "end search\n"; 00388 };
~ssiqts< C, V > | ( | ) | [inline] |
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 };
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] |
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] |
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 };
Referenced by ssiqts< C, V >::ssiqts().
Referenced by ssiqts< C, V >::cfhunt().
Referenced by ssiqts< C, V >::build().
void search | ( | typename ssiqts< C, V >::aabb3 * | lroot, | |
typename ssiqts< C, V >::aabb3 * | rroot, | |||
ssiqts< C, V > & | ssi | |||
) | [inline, static] |
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 };
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().
int m |
Definition at line 25 of file ssiqts.hpp.
int* m_bcf |
Definition at line 47 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::cfprint().
int* m_ecf |
Definition at line 48 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::cfprint().
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().
int udeg |
Definition at line 23 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().
int vdeg |
Definition at line 24 of file ssiqts.hpp.
Referenced by ssiqts< C, V >::ssiqts().