ssiqtsl< C, V > Struct Template Reference

#include <ssiqtsl.hpp>

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

List of all members.

Public Types

Public Member Functions

Static Public Member Functions

Public Attributes


Detailed Description

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

Definition at line 19 of file ssiqtsl.hpp.


Member Typedef Documentation

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.

Reimplemented from ssiqts< C, V >.

Definition at line 22 of file ssiqtsl.hpp.

typedef fxv<double,2> vector2

Definition at line 23 of file ssiqtsl.hpp.

typedef ssiqts<C,V>::vector3 vector3

Reimplemented from ssiqts< C, V >.

Definition at line 21 of file ssiqtsl.hpp.


Constructor & Destructor Documentation

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


Member Function Documentation

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

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

static void fillpatchbox ( aabb3 b,
const vector3 a,
ssiqts< C, V > &  ssi 
) [static, inherited]
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 };

static bool intersectp ( const aabb3 a,
const aabb3 b 
) [static, inherited]

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

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

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

00182 {
00183     for ( unsigned i = 0; i < 3; i ++ )
00184     {
00185         box[i][0] = std::min(a[i][0],b[i][0]);
00186         box[i][1] = std::max(a[i][1],b[i][1]);
00187     };
00188 };

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

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

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


Member Data Documentation

aabb3* boxa [inherited]

Definition at line 44 of file ssiqts.hpp.

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

aabb3* boxb [inherited]

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.

std::vector< vector2 > lpts

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

std::vector< vector2 > rpts

Definition at line 26 of file ssiqtsl.hpp.

Referenced by ssiqtsl< C, V >::gpdump().

sample* smpa [inherited]

Definition at line 41 of file ssiqts.hpp.

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

sample* smpb [inherited]

Definition at line 42 of file ssiqts.hpp.

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

std::vector< vector3 > spcs

Definition at line 27 of file ssiqtsl.hpp.

Referenced by ssiqtsl< C, V >::gmvdump(), and mmx::shape::intersection().

std::vector< vector3 > spcsorig

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


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

Generated on 6 Dec 2012 for shape by  doxygen 1.6.1