ssiqts< C, V > Struct Template Reference

#include <ssiqts.hpp>

Inheritance diagram for ssiqts< C, V >:
ssiqtsl< C, V >

List of all members.

Classes

Public Types

Public Member Functions

Static Public Member Functions

Public Attributes


Detailed Description

template<class C, class V = shape::default_env>
struct mmx::ssiqts< C, V >

Definition at line 16 of file ssiqts.hpp.


Member Typedef Documentation

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.

Reimplemented in ssiqtsl< C, V >.

Definition at line 21 of file ssiqts.hpp.

typedef fxv<double,3> vector3

Reimplemented in ssiqtsl< C, V >.

Definition at line 18 of file ssiqts.hpp.


Constructor & Destructor Documentation

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 388 of file ssiqts.hpp.

00392 {
00393   if ( smpa ) delete   smpa;
00394   if ( smpb ) delete   smpb;
00395   if ( boxa ) delete[] boxa;
00396   if ( boxb ) delete[] boxb;
00397 };


Member Function Documentation

ssiqts< C, V >::aabb3 * alloc ( int &  l,
int  m,
int &  s 
) [inline, static]

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]

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 };

static void fillboxes ( aabb3 qta,
const vector3 base,
ssiqts< C, V > &  ssi 
) [static]

Referenced by ssiqts< C, V >::ssiqts().

static void fillpatchbox ( aabb3 b,
const vector3 a,
ssiqts< C, V > &  ssi 
) [static]
static bool intersectp ( const aabb3 a,
const aabb3 b 
) [static]

Referenced by ssiqts< C, V >::cfhunt().

static void merge ( aabb3 box,
const aabb3 a,
const aabb3 b 
) [static]

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 };

static void update ( aabb3 box,
const aabb3 a,
const aabb3 b 
) [static]

Referenced by ssiqts< C, V >::build().


Member Data Documentation

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().


The documentation for this struct was generated from the following file:

Generated on 6 Dec 2012 for shape by  doxygen 1.6.1