shape_doc 0.1
|
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