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
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
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
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
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
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