00001 # ifndef shape_parametric_surface_ssi_hpp
00002 # define shape_parametric_surface_ssi_hpp
00003 # include <shape/parametric_surface.hpp>
00004 # include <shape/edge_set.hpp>
00005 # include <shape/ssi/ssi_dsearch.hpp>
00006 # include <shape/ssi/ssiqtsl.hpp>
00007
00008 # define TMPL template<class K>
00009 # define ParametricSurface shape::parametric_surface<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<double> ssi( srfa, srfb, 100 );
00024
00025 int nbv =ssi.spcs.size();
00026
00027 EdgeSet * result = new EdgeSet(nbv);
00028
00029
00030
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
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 ssi::dsearch<double,K> 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
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
00074
00075
00076
00077 for(int i = 0 ; i < (int)ds.sizes[c] ; i++, a++) {
00078 prms[a] = ds.lefts[c][i] ;
00079
00080
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
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
00094
00095
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 }
00105 }
00106
00107 # undef TMPL
00108 # undef EdgeSet
00109 # undef ParametricSurface
00110 # endif //shape_parametric_surface_ssi_hpp