synaps/shape/sisl-base-rep.h

00001 #ifndef SYNAPS_SISL_REPRESENTATIONS_H
00002 #define SYNAPS_SISL_REPRESENTATIONS_H
00003 #include <synaps/init.h>
00004 #include <synaps/base/shared_object.h>
00005 #include <synaps/shape/sisl/sisl.h>
00006 #include <synaps/shape/sisl/GoReadWrite.h>
00007 #include <synaps/shape/IBSplineCurve.h>
00008 
00009 __BEGIN_NAMESPACE_SYNAPS
00010 
00011 struct sisl_curve_rep
00012 { 
00013   SISLCurve  * sisl_data_; 
00014   SISLCurve * operator->(){ return sisl_data_; };
00015   const SISLCurve * operator->() const { return sisl_data_; };
00016   sisl_curve_rep() : sisl_data_(0) {};
00017   sisl_curve_rep & operator=( const sisl_curve_rep & rep ) 
00018   { 
00019     if ( sisl_data_ )   freeCurve(sisl_data_);
00020     sisl_data_ = 0;
00021     if ( rep.sisl_data_ ) sisl_data_ = copyCurve(rep.sisl_data_); 
00022   };
00023   ~sisl_curve_rep() { if ( sisl_data_ ) freeCurve(sisl_data_); };
00024   SISLCurve * sisl_data() { assert(sisl_data_); return sisl_data_; };
00025   
00026   int ord()   { return sisl_data()->ik; };
00027   int nbp()   { return sisl_data()->in; };
00028   int nbk()   { return nbp()+ord();    };
00029   int dim()   { return sisl_data()->idim; };
00030 };
00031 
00032 struct sisl_surface_rep
00033 { 
00034   SISLSurf* sisl_data_; 
00035   SISLSurf * operator->(){ return sisl_data_; };
00036   const SISLSurf * operator->() const { return sisl_data_; };
00037   sisl_surface_rep():sisl_data_(0){};
00038   sisl_surface_rep & operator=( const sisl_surface_rep & rep ) 
00039   { 
00040     if ( sisl_data_ ) freeSurf(sisl_data_);
00041     sisl_data_ = 0;
00042     if ( rep.sisl_data_ ) sisl_data_ = copySurface(rep.sisl_data_); 
00043   };
00044   ~sisl_surface_rep() { if ( sisl_data_ ) freeSurf(sisl_data_); };
00045 };
00046 
00047 struct SISLBSplineCurve : sisl_curve_rep, wrapper<SISLBSplineCurve,IBSplineCurve> 
00048 {
00049   
00050   typedef       fxv<double,3>         cp;           
00051   typedef       double                cp_value_type; 
00052   typedef       cp            *       cp_iterator;
00053   typedef const cp            * const_cp_iterator;
00054   typedef       double                kn_value_type;
00055   typedef       kn_value_type *       kn_iterator;
00056   typedef const kn_value_type * const_kn_iterator;
00057   
00058   // iterator access to knots values
00059   inline       kn_iterator kn_begin()       { return       (kn_iterator)(sisl_data()->et);         };
00060   inline const_kn_iterator kn_begin() const { return (const_kn_iterator)(sisl_data()->et);         };  
00061   inline       kn_iterator kn_end  ()       { return       (kn_iterator)(sisl_data()->et) + nbk(); };
00062   inline const_kn_iterator kn_end  () const { return (const_kn_iterator)(sisl_data()->et) + nbk(); };
00063   
00064   // iterator access to control points
00065   inline       cp_iterator cp_begin()       { return       (cp_iterator)(sisl_data()->ecoef);      };
00066   inline const_cp_iterator cp_begin() const { return (const_cp_iterator)(sisl_data()->ecoef);      };
00067   inline       cp_iterator cp_end  ()       { return       (cp_iterator)(sisl_data()->ecoef)+nbp();};
00068   inline const_cp_iterator cp_end  () const { return (const_cp_iterator)(sisl_data()->ecoef)+nbp();};
00069   
00070   // random access to control points
00071   inline const cp & operator[](int i) const { return cp_begin()[i]; };
00072   inline       cp & operator[](int i) const { return cp_begin()[i]; };
00073 
00074 }
00075 
00076 inline std::istream& operator>>( std::istream & ins, sisl_curve_rep & rep ) 
00077 { 
00078   rep.~sisl_curve_rep();
00079   rep.sisl_data_ = readGoCurve(ins); 
00080 };
00081 
00082 
00083 
00084 inline std::istream& operator>>( std::istream & ins, sisl_surface_rep & rep ) 
00085 { 
00086   rep.~sisl_surface_rep();
00087   rep.sisl_data_ = readGoSurface(ins); 
00088 };
00089 
00090 struct SISLcurve
00091 {
00092   typedef SISLcurve               rep_t;
00093   typedef ParametricCurve<SISLcurve> view_t;
00094   shared_object<sisl_curve_rep> rep_;
00095   const sisl_curve_rep & rep() const { return *rep_; };
00096   sisl_curve_rep & rep() { return *rep_; };
00097   int nbctrl()  const { return (*rep_)->in;   };
00098   int order ()  const { return (*rep_)->ik;   };
00099   int dim   ()  const { return (*rep_)->idim; };
00100   bool closed() const { return (*rep_)->cuopen == -1 || (*rep_)->cuopen == 0; };
00101 };
00102 
00103 inline 
00104 void domain( double & tmin, double & tmax, const SISLcurve & c )
00105 {
00106   int stat;
00107   s1363(c.rep_->sisl_data_,&tmin,&tmax,&stat);
00108 };
00109 
00110 template<class C>
00111 void domain( C & tmin, C & tmax, const SISLcurve & c )
00112 {
00113   double tmin_, tmax_;
00114   domain(tmin_,tmax_,c);
00115   tmin = tmin_;
00116   tmax = tmax_;
00117 };
00118 
00119 inline
00120 void eval( double * p, 
00121            const SISLcurve & c, 
00122            double  t )
00123 {
00124   int    stat;
00125   int leftk;
00126   s1227(c.rep_->sisl_data_,0,t,&leftk,p,&stat);
00127 };
00128 
00129 template<unsigned N> inline
00130 void eval( fxv<double,N> & p, const SISLcurve & c, 
00131            double t )
00132 {
00133   eval(&p[0],c,t); 
00134 };
00135 
00136 template<class Point> inline
00137 void eval( Point & p, const SISLcurve & c, const typename Point::value_type & t )
00138 {
00139   double ptmp[c.dim()];
00140   double t_ = t;
00141   eval(ptmp,c,t_);
00142   for ( int i = 0; i < c.dim(); i ++ ) p[i] = ptmp[i];
00143 
00144 };
00145 
00146 double length( const SISLcurve & c, double eps )
00147 {
00148   double result;
00149   int stat;
00150   s1240(c.rep_->sisl_data_,eps,&result,&stat);
00151   return result;
00152 };
00153 
00154 
00155 struct SISLSurface
00156 {
00157   typedef SISLSurface                    rep_t;
00158   typedef ParametricSurface<SISLSurface> view_t;
00159   shared_object<sisl_surface_rep> rep_;
00160   int  nbctrlu()   const { return (*rep_)->in1;   };
00161   int  nbctrlv()   const { return (*rep_)->in2;   };
00162   int  orderu ()   const { return (*rep_)->ik1;   };
00163   int  orderv ()   const { return (*rep_)->ik2;   };
00164   int  dim    ()   const { return (*rep_)->idim;  };
00165   bool uclosed()   const { return (*rep_)->cuopen_1 == -1 || (*rep_)->cuopen_1 == 0; };
00166   bool vclosed()   const { return (*rep_)->cuopen_1 == -1 || (*rep_)->cuopen_1 == 0; };
00167 };
00168 
00169 inline
00170 void eval( double * p, 
00171            const SISLSurface & s, 
00172            const double * prm )
00173 {
00174   int    stat;
00175   int leftk;
00176   s1421(s.rep_->sisl_data_,0,(double*)prm,&leftk,&leftk,p,0,&stat);
00177 };
00178 
00179 inline
00180 void eval( double * p, 
00181            const SISLSurface & s, 
00182            const double & u, 
00183            const double & v )
00184 {
00185   double tmp[] = { u, v };
00186   eval(p,s,tmp);
00187 };
00188 
00189 template<unsigned N> inline
00190 void eval( fxv<double,N>& p, const SISLSurface & s, const fxv<double,2>& prm ) { eval(&p[0],s,&prm[0]); };
00191 
00192 template<class Point> inline
00193 void eval( Point & p, 
00194            const SISLSurface & s, 
00195            const typename Point::value_type & u,
00196            const typename Point::value_type & v )
00197 {
00198   double etmp[s.dim()];
00199   double u_,v_;
00200   u_ = u;
00201   v_ = v;
00202   eval(etmp,s,u_,v_);
00203   for ( int i = 0; i < s.dim(); i ++ ) p[i] = etmp[i];
00204 };
00205 
00206 inline
00207 void domain( double & umin, double & umax, 
00208              double & vmin, double & vmax,
00209              const SISLSurface & s )
00210 {
00211   int stat;
00212   s1603(s.rep_->sisl_data_, &umin, &vmin, &umax, &vmax, &stat );
00213 };
00214 
00215 template<class C>
00216 void domain( C & umin, C & umax, C & vmin, C & vmax, const SISLSurface & s  )
00217 {
00218   double umin_, umax_, vmin_, vmax_;
00219   domain(umin_,umax_,vmin_,vmax_,s);
00220   umin = umin_;
00221   vmin = vmin_;
00222   umax = umax_;
00223   vmax = vmax_;
00224 };
00225 
00226 
00227 inline
00228 void sample( double * smp, 
00229              const SISLSurface & s, 
00230              const double * u, 
00231              const double * v, 
00232              int m, int n )
00233 {
00234   int stat;
00235   s1506(s.rep_->sisl_data_,0,m,(double*)u,n,(double*)v,0,0,&stat);
00236 };
00237 
00238 template<unsigned N>
00239 void sample( fxv<double,N> * smp, 
00240              const SISLSurface & s,
00241              const double * u,
00242              const double * v,
00243              int m,
00244              int n )
00245 {
00246   assert(N==s.dim());
00247   sample((double*)smp,s,u,v,m,n);
00248 };
00249 
00250 
00251 /*
00252 template<class Point>
00253 void sample( Point * smp, 
00254              const SISLSurface & s, 
00255              const typename Point::value_type * u, 
00256              const typename Point::value_type * v, 
00257              int m, 
00258              int n )
00259 {
00260   double * u = new double[m*n*s.dim() + m + n];
00261   double * v = u + m;
00262   double * p = v + n;
00263   sample(p,s,u,v,m,n);
00264   
00265 };
00266 */
00267 
00268 
00269 
00270 
00271 inline std::istream& operator>>( std::istream & in, SISLcurve & c )
00272 {
00273   in >> (*c.rep_);
00274   return in;
00275 };
00276 
00277 inline std::istream& operator>>( std::istream & in, SISLSurface & s )
00278 {
00279   in >> (*s.rep_);
00280   return in;
00281 };
00282 
00283 
00284 
00285 __END_NAMESPACE_SYNAPS;
00286 #endif

SYNAPS DOCUMENTATION
logo