shape_doc 0.1
/Users/mourrain/Devel/mmx/shape/include/shape/ssi_surface_parametric.hpp
Go to the documentation of this file.
00001 # ifndef shape_surface_parametric_ssi_hpp
00002 # define shape_surface_parametric_ssi_hpp
00003 # include <shape/surface_parametric.hpp>
00004 # include <shape/edge_set.hpp>
00005 # include <shape/ssi_dsearch.hpp>
00006 # include <shape/ssiqtsl.hpp>
00007 
00008 # define TMPL template<class K>
00009 # define ParametricSurface shape::surface_parametric<K>
00010 # define EdgeSet           shape::edge_set<K>
00011 # undef  Edge
00012 
00013 namespace mmx {
00014   namespace shape {
00015 
00016 TMPL EdgeSet* 
00017 intersection( ParametricSurface * srfa, ParametricSurface * srfb )
00018 {
00019     typedef typename EdgeSet::Point         Point;
00020     typedef typename EdgeSet::Edge          Edge;
00021     typedef typename EdgeSet::PointIterator PointIterator;
00022 
00023     SSIQTSL ssi( srfa, srfb, 100 );
00024 
00025     int nbv =ssi.spcs.size();
00026 
00027     EdgeSet * result = new EdgeSet(nbv);
00028     //    IntersectionResult * result = new IntersectionResult(IGLGood::E_LINE,ssi.spcs.size(),ssi.spcs.size());
00029 
00030     //std::copy(ssi.spcs.begin(),ssi.spcs.end(),(fxv<double,3>*)(result->glg->vertices));
00031     PointIterator p=result->begin();
00032     for ( int i = 0; i < nbv; i ++, p++ ) {
00033       p->setx(ssi.spcs[i][0]);
00034       p->sety(ssi.spcs[i][1]);
00035       p->setz(ssi.spcs[i][2]);
00036     }
00037 
00038     Point * p1, * p2;
00039     for ( int i = 0; i < nbv; i+=2) {
00040       p1= &result->vertex(i);
00041       p2= &result->vertex(i+1);
00042       result->push_edge(new Edge(p1,p2));
00043     }
00044     //  result->glg->indexes[i] = i;
00045 
00046     return result;
00047 };
00048 
00049 TMPL EdgeSet * 
00050 selfintersection(const ParametricSurface * surf)
00051 {
00052     typedef typename EdgeSet::Point Point;
00053     typedef typename EdgeSet::Edge  Edge;
00054     typedef typename EdgeSet::PointIterator PointIterator;
00055     shape_ssi::dsearch ds(surf,200,200) ;
00056     
00057     int nbv, nbi, a, c, s ;
00058     
00059     for(nbv = 0, nbi = 0, c = 0 ; c < (int)ds.nbcurves ; c++)
00060     {
00061         s = ds.sizes[c]; 
00062         nbv += s;        
00063         nbi += (s-2)*2+2;
00064     }
00065 
00066     EdgeSet * result = new EdgeSet(nbv);
00067     //    SelfIntersectionResult * result = new SelfIntersectionResult(IGLGood::E_LINE, nbv, nbi, (int)ds.nbcurves);
00068     
00069     fxv<double,2> * prms = new fxv<double,2>[nbv];
00070 
00071     a = 0;
00072     for(c = 0 ; c < (int)ds.nbcurves ; c++) {
00073       //  result->lprm->params[c].size = (int)ds.sizes[c] ;
00074       //        result->rprm->params[c].size = (int)ds.sizes[c] ;
00075       //        result->lprm->params[c].prms = new fxv<double, 2>[(int)ds.sizes[c]] ;
00076       //        result->rprm->params[c].prms = new fxv<double, 2>[(int)ds.sizes[c]] ;
00077       for(int i = 0 ; i < (int)ds.sizes[c] ; i++, a++) {
00078         prms[a] = ds.lefts[c][i] ;
00079         //            result->lprm->params[c].prms[i] = ds.lefts[c][i] ;
00080         //            result->rprm->params[c].prms[i] = ds.rights[c][i] ;
00081       }
00082     }
00083 
00084     PointIterator p=result->begin();
00085     for(int i=0; i< nbv; i++,p++)
00086       surf->eval(*p,prms[i][0],prms[i][1]) ;
00087 
00088     //    int ci = 0 ;
00089     a = 0 ;  
00090     Point * p1, * p2;
00091     for(c = 0 ; c < (int)ds.nbcurves ; c++) {
00092         for(int i = 0 ; i < (int)ds.sizes[c]-1 ; i++, a++) {
00093           //            result->glg->indexes[ci]   = a;
00094           //            result->glg->indexes[ci+1] = a+1;
00095           //            ci += 2;
00096           p1= &result->vertex(a);
00097           p2= &result->vertex(a+1);
00098           result->push_edge(new Edge(p1,p2));
00099         }
00100         a++;
00101     }
00102     return result;
00103 }
00104   } //  namespace shape
00105 } // namespace mmx
00106 
00107 # undef TMPL
00108 # undef EdgeSet
00109 # undef ParametricSurface
00110 # endif //shape_surface_parametric_ssi_hpp