Main Page | Class Hierarchy | Class List | File List | Class Members

hnurbsS.h

00001 /*============================================================================= 00002 File: hnurbsS.h 00003 Purpose: 00004 Revision: $Id: hnurbsS.h,v 1.2 2002/05/13 21:07:46 philosophil Exp $ 00005 Created by: Philippe Lavoie (3 Oct, 1996) 00006 Modified by: 00007 00008 Copyright notice: 00009 Copyright (C) 1996-1998 Philippe Lavoie 00010 00011 This library is free software; you can redistribute it and/or 00012 modify it under the terms of the GNU Library General Public 00013 License as published by the Free Software Foundation; either 00014 version 2 of the License, or (at your option) any later version. 00015 00016 This library is distributed in the hope that it will be useful, 00017 but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 Library General Public License for more details. 00020 00021 You should have received a copy of the GNU Library General Public 00022 License along with this library; if not, write to the Free 00023 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00024 =============================================================================*/ 00025 #ifndef _nurbs_hnurbs_h_ 00026 #define _nurbs_hnurbs_h_ 00027 00028 #include "nurbsS.h" 00029 #include "vector.h" 00030 00033 namespace PLib { 00034 00058 template <class T, int N> 00059 class HNurbsSurface: public NurbsSurface<T,N> { 00060 public: 00061 HNurbsSurface() ; 00062 HNurbsSurface(const NurbsSurface<T,N>& S) ; 00063 HNurbsSurface(const HNurbsSurface<T,N>& S) ; 00064 HNurbsSurface(HNurbsSurface<T,N>* base) ; 00065 HNurbsSurface(HNurbsSurface<T,N>* base, const Vector<T>& xU, const Vector<T>& xV) ; 00066 HNurbsSurface(HNurbsSurface<T,N>* base, const HNurbsSurface<T,N> &surf) ; 00067 virtual ~HNurbsSurface() ; 00068 00069 HNurbsSurface<T,N>* baseLevel() const { return baseLevel_;} 00070 HNurbsSurface<T,N>* nextLevel() const { return nextLevel_;} 00071 HNurbsSurface<T,N>* firstLevel() const { return firstLevel_;} 00072 HNurbsSurface<T,N>* lastLevel() const { return lastLevel_; } 00073 00074 void splitUV(int nu, int nv, Vector<T> &nU, Vector<T> &nV) ; 00075 void splitUV(int nu, int su, int nv, int sv, Vector<T> &nU, Vector<T> &nV) ; 00076 00077 virtual HNurbsSurface<T,N>* addLevel(int nsplit) ; 00078 virtual HNurbsSurface<T,N>* addLevel() ; 00079 00080 virtual void copy(const HNurbsSurface<T,N>& nS) ; 00081 00082 int modifies(T u, T v) ; 00083 00084 00085 HPoint_nD<T,N> operator()(T u, T v) const { return hpointAt(u,v,-1) ; } 00086 HPoint_nD<T,N> hpointAt(T u, T v, int lod=-1) const ; 00087 00088 void deriveAtH(T u, T v, int, Matrix< HPoint_nD<T,N> >&, int lod=-1) const; 00089 void deriveAt(T u, T v, int, Matrix< Point_nD<T,N> >&, int lod=-1) const; 00090 00091 int movePointOffset(T u, T v, const Point_nD<T,N>& delta) ; 00092 00093 void scale(const Point_nD<T,N>& s) ; 00094 00095 00096 int initBase(int force=0) ; 00097 virtual void updateSurface(int i0=-1, int j0=-1) ; 00098 virtual void updateLevels(int updateLevel=-1) ; 00099 00100 int isoCurveU(T u, NurbsCurve<T,N>& c,int lod=-1) const ; 00101 int isoCurveV(T v, NurbsCurve<T,N>& c,int lod=-1) const ; 00102 00103 // I/O functions 00104 int read(const char* filename); 00105 int write(const char* filename) const; 00106 virtual int read(ifstream &fin) ; 00107 int write(ofstream &fout) const ; 00108 00109 Matrix< HPoint_nD<T,N> > offset ; 00110 Vector<T> rU,rV ; 00111 00112 int level() const { return level_ ;} 00113 00114 int maxLevel() const ; 00115 00116 int modifiedN() const { return updateN ; } 00117 00118 void refineKnots(const Vector<T>& nU, const Vector<T>& nV) ; 00119 void refineKnotU(const Vector<T>& X) ; 00120 void refineKnotV(const Vector<T>& X) ; 00121 00122 00123 void axis(int i, int j, Point_nD<T,N>& xaxis, Point_nD<T,N>& yaxis, Point_nD<T,N>& zaxis)const; 00124 00125 void setFixedOffsetVector(const Point_nD<T,N> &I, const Point_nD<T,N> &J, const Point_nD<T,N>& K); 00126 void setVariableOffsetVector(); 00127 00128 protected: 00129 NurbsSurface<T,N> baseSurf ; 00130 HNurbsSurface<T,N> *baseLevel_,*nextLevel_,*firstLevel_,*lastLevel_ ; 00131 00132 Matrix< Point_nD<T,N> > ivec,jvec,kvec ; 00133 00134 int level_ ; 00135 int updateN,baseUpdateN ; 00136 int update_ ; // indicates that one of the offset point was modified 00137 00138 T uS_,uE_,vS_,vE_ ; 00139 T uD,vD ; 00140 int fixedOffset; 00141 }; 00142 00143 template <class T, int N> 00144 inline void 00145 HNurbsSurface<T,N>::axis(int i, int j, Point_nD<T,N>& xaxis, Point_nD<T,N>& yaxis, Point_nD<T,N>& zaxis) const 00146 { 00147 if(baseLevel_) { 00148 xaxis = ivec(i,j) ; 00149 yaxis = jvec(i,j) ; 00150 zaxis = kvec(i,j) ; 00151 } 00152 else{ 00153 xaxis = Point_nD<T,N>(T(1),T(0),T(0)) ; 00154 yaxis = Point_nD<T,N>(T(0),T(1),T(0)) ; 00155 zaxis = Point_nD<T,N>(T(0),T(0),T(1)) ; 00156 } 00157 } 00158 00159 typedef HNurbsSurface<float,3> HNurbsSurfacef ; 00160 typedef HNurbsSurface<double,3> HNurbsSurfaced ; 00161 00162 } // end namespace 00163 00164 typedef PLib::HNurbsSurface<float,3> PlHNurbsSurfacef ; 00165 typedef PLib::HNurbsSurface<double,3> PlHNurbsSurfaced ; 00166 00167 00168 #endif // _nurbs_hnurbs_h_

Generated on Sat May 15 00:00:00 2004 for NURBS++ by doxygen 1.3.7