00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _nurbs_hnurbsS_sp_h_
00026 #define _nurbs_hnurbsS_sp_h_
00027
00028 #include "hnurbsS.h"
00029
00032 namespace PLib {
00033
00046 template <class T, int N>
00047 class HNurbsSurfaceSP : public HNurbsSurface<T,N>{
00048 public:
00049 HNurbsSurfaceSP() ;
00050 HNurbsSurfaceSP(const NurbsSurface<T,N>& S) ;
00051 HNurbsSurfaceSP(const HNurbsSurface<T,N>& S) ;
00052 HNurbsSurfaceSP(const HNurbsSurfaceSP<T,N>& S) ;
00053 HNurbsSurfaceSP(HNurbsSurface<T,N>* base) ;
00054 HNurbsSurfaceSP(HNurbsSurface<T,N>* base, const Vector<T>& xU, const Vector<T>& xV) ;
00055 HNurbsSurfaceSP(HNurbsSurface<T,N>* base, const HNurbsSurface<T,N> &surf) ;
00056
00057 virtual void resizeKeep(int Pu, int Pv, int DegU, int DegV) ;
00058
00059 virtual void refineKnots(const Vector<T>& nU, const Vector<T>& nV) ;
00060 virtual void refineKnotU(const Vector<T>& X);
00061 virtual void refineKnotV(const Vector<T>& X);
00062
00063 virtual void mergeKnots(const Vector<T>& nU, const Vector<T>& nV) ;
00064 virtual void mergeKnotU(const Vector<T>& X);
00065 virtual void mergeKnotV(const Vector<T>& X);
00066
00067 virtual void updateSurface(int i0=-1, int j0=-1) ;
00068 virtual void updateLevels(int updateLevel=-1) ;
00069
00070 virtual HNurbsSurfaceSP<T,N>* addLevel(int nsplit, int s=1) ;
00071 virtual HNurbsSurfaceSP<T,N>* addLevel() ;
00072
00073 virtual void copy(const HNurbsSurface<T,N>& nS) ;
00074
00075 virtual int read(ifstream &fin) ;
00076
00077
00078 void modSurfCPby(int i, int j, const HPoint_nD<T,N>& a) ;
00079 void modOnlySurfCPby(int i, int j, const HPoint_nD<T,N>& a) ;
00080
00081 T maxAtUV(int i, int j) const { return maxAtU_[i]*maxAtV_[j] ; }
00082 T maxAtU(int i) const { return maxAtU_[i] ; }
00083 T maxAtV(int i) const { return maxAtV_[i] ; }
00084
00085 HPoint_nD<T,N> surfP(int i,int j) const
00086 { return hpointAt(maxAtU_[i],maxAtV_[j]); }
00087
00088 HPoint_nD<T,N> surfP(int i,int j, int lod) const
00089 { return hpointAt(maxAtU_[i],maxAtV_[j],lod) ; }
00090
00091 void updateMaxUV()
00092 { updateMaxU() ; updateMaxV() ; }
00093 void updateMaxU() ;
00094 void updateMaxV() ;
00095
00096 int okMax() { return (maxU.n()<=1)?0:1 ; }
00097
00098 protected:
00099
00100 Vector<T> maxU,maxV ;
00101 Vector<T> maxAtU_,maxAtV_ ;
00102 };
00103
00104 typedef HNurbsSurfaceSP<float,3> HNurbsSurfaceSPf ;
00105 typedef HNurbsSurfaceSP<double,3> HNurbsSurfaceSPd ;
00106
00107 template <class T, int N>
00108 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP() : HNurbsSurface<T,N>() {
00109 ;
00110 }
00111
00112 template <class T, int N>
00113 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP(const NurbsSurface<T,N>& nS) : HNurbsSurface<T,N>(nS) {
00114 updateMaxUV() ;
00115 }
00116
00117 template <class T, int N>
00118 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP(HNurbsSurface<T,N>* base): HNurbsSurface<T,N>(base) {
00119 updateMaxUV() ;
00120 }
00121
00122 template <class T, int N>
00123 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP(HNurbsSurface<T,N>* base, const Vector<T>& xU, const Vector<T>& xV) : HNurbsSurface<T,N>(base,xU,xV) {
00124 updateMaxUV() ;
00125 }
00126
00127 template <class T, int N>
00128 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP(const HNurbsSurface<T,N>& S) : HNurbsSurface<T,N>() {
00129 copy(S) ;
00130 }
00131
00132 template <class T, int N>
00133 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP(const HNurbsSurfaceSP<T,N>& S) : HNurbsSurface<T,N>() {
00134 copy(S) ;
00135 }
00136
00137 template <class T, int N>
00138 inline HNurbsSurfaceSP<T,N>::HNurbsSurfaceSP(HNurbsSurface<T,N>* base, const HNurbsSurface<T,N> &surf):
00139 HNurbsSurface<T,N>(base)
00140 {
00141 copy(surf) ;
00142 updateMaxUV() ;
00143 }
00144
00145
00146 template <class T, int N>
00147 inline void
00148 HNurbsSurfaceSP<T,N>::resizeKeep(int Pu, int Pv, int DegU, int DegV) {
00149 HNurbsSurface<T,N>::resizeKeep(Pu,Pv,DegU,DegV) ;
00150 updateMaxUV() ;
00151 }
00152
00153 template <class T, int N>
00154 inline void
00155 HNurbsSurfaceSP<T,N>::refineKnots(const Vector<T>& nU, const Vector<T>& nV) {
00156 HNurbsSurface<T,N>::refineKnots(nU,nV) ;
00157 updateMaxUV() ;
00158 }
00159
00160 template <class T, int N>
00161 inline void
00162 HNurbsSurfaceSP<T,N>::refineKnotU(const Vector<T>& X){
00163 HNurbsSurface<T,N>::refineKnotU(X) ;
00164 updateMaxU() ;
00165 }
00166
00167 template <class T, int N>
00168 inline void
00169 HNurbsSurfaceSP<T,N>::refineKnotV(const Vector<T>& X){
00170 HNurbsSurface<T,N>::refineKnotV(X) ;
00171 updateMaxV() ;
00172 }
00173
00174
00175 template <class T, int N>
00176 inline void
00177 HNurbsSurfaceSP<T,N>::mergeKnots(const Vector<T>& nU, const Vector<T>& nV) {
00178 HNurbsSurface<T,N>::mergeKnots(nU,nV) ;
00179 updateMaxUV() ;
00180 }
00181
00182
00183 template <class T, int N>
00184 inline void
00185 HNurbsSurfaceSP<T,N>::mergeKnotU(const Vector<T>& X){
00186 HNurbsSurface<T,N>::mergeKnotU(X) ;
00187 updateMaxU() ;
00188 }
00189
00190
00191 template <class T, int N>
00192 inline void
00193 HNurbsSurfaceSP<T,N>::mergeKnotV(const Vector<T>& X){
00194 HNurbsSurface<T,N>::mergeKnotV(X) ;
00195 updateMaxV() ;
00196 }
00197
00198 }
00199
00200 typedef PLib::HNurbsSurfaceSP<float,3> PlHNurbsSurfaceSPf ;
00201 typedef PLib::HNurbsSurfaceSP<double,3> PlHNurbsSurfaceSPd ;
00202
00203
00204
00205 #endif