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_nurbs_sp_h_
00026 #define _nurbs_nurbs_sp_h_
00027
00028 #include "nurbs.h"
00029
00032 namespace PLib {
00033
00046 template <class T, int N>
00047 class NurbsCurveSP : public NurbsCurve<T,N>{
00048 public:
00049 NurbsCurveSP() : NurbsCurve<T,N>() { ; }
00050 NurbsCurveSP(const NurbsCurve<T,N>& nurb) ;
00051 NurbsCurveSP(const NurbsCurveSP<T,N>& nurb) ;
00052 NurbsCurveSP(const Vector< HPoint_nD<T,N> >& P1, const Vector<T> &U1, int degree=3) ;
00053 NurbsCurveSP(const Vector< Point_nD<T,N> >& P1, const Vector<T> &W, const Vector<T> &U1, int degree=3) ;
00054
00055
00056 virtual void reset(const Vector< HPoint_nD<T,N> >& P1, const Vector<T> &U1, int degree);
00057 virtual NurbsCurve<T,N>& operator=(const NurbsCurve<T,N>& a);
00058 NurbsCurveSP<T,N>& operator=(const NurbsCurveSP<T,N>& a);
00059
00060 virtual void modKnot(const Vector<T>& knot) ;
00061
00062 virtual void removeKnot(int r, int s, int num) ;
00063 virtual void removeKnotsBound(const Vector<T>& ub, Vector<T>& ek, T E);
00064
00065 virtual void refineKnotVector(const Vector<T>& X) ;
00066 virtual void mergeKnotVector(const Vector<T> &Um) ;
00067 virtual void knotInsertion(T u, int r,NurbsCurveSP<T,N>& nc);
00068
00069
00070 virtual void degreeElevate(int t);
00071
00072 int read(ifstream &fin) ;
00073
00074 void modSurfCPby(int i, const HPoint_nD<T,N>& a)
00075 { P[i] += a / maxU[i] ; }
00076 void modSurfCP(int i, const HPoint_nD<T,N>& a)
00077 { modSurfCPby(i,a-surfP(i)) ; }
00078
00079 void modOnlySurfCPby(int i, const HPoint_nD<T,N>& a) ;
00080 void modOnlySurfCP(int i, const HPoint_nD<T,N>& a)
00081 { modOnlySurfCPby(i,a-surfP(i)) ; }
00082
00083 T maxAt(int i) const
00084 { return maxAt_[i] ; }
00085
00086 HPoint_nD<T,N> surfP(int i) const
00087 { return hpointAt(maxAt_[i]) ; }
00088
00089 void updateMaxU() ;
00090
00091 int okMax()
00092 { return (maxU.n()<=1)?0:1 ; }
00093
00094 protected:
00095
00096 Vector<T> maxU ;
00097 Vector<T> maxAt_ ;
00098 };
00099
00100
00101 template <class T, int N>
00102 inline NurbsCurveSP<T,N>::NurbsCurveSP(const NurbsCurve<T,N>& nurb) :
00103 NurbsCurve<T,N>(nurb)
00104 {
00105 updateMaxU();
00106 }
00107
00108 template <class T, int N>
00109 inline NurbsCurveSP<T,N>::NurbsCurveSP(const NurbsCurveSP<T,N>& nurb) :
00110 NurbsCurve<T,N>(nurb)
00111 {
00112 maxU = nurb.maxU ;
00113 maxAt_ = nurb.maxAt_ ;
00114 }
00115
00116 template <class T, int N>
00117 inline NurbsCurveSP<T,N>::NurbsCurveSP(const Vector< HPoint_nD<T,N> >& P1, const Vector<T> &U1, int degree) :
00118 NurbsCurve<T,N>(P1,U1,degree)
00119 {
00120 updateMaxU();
00121 }
00122
00123 template <class T, int N>
00124 inline NurbsCurveSP<T,N>::NurbsCurveSP(const Vector< Point_nD<T,N> >& P1, const Vector<T> &W, const Vector<T> &U1, int degree) :
00125 NurbsCurve<T,N>(P1,W,U1,degree)
00126 {
00127 updateMaxU();
00128 }
00129
00130
00131 template <class T, int N>
00132 inline void NurbsCurveSP<T,N>::reset(const Vector< HPoint_nD<T,N> >& P1, const Vector<T> &U1, int degree) {
00133 NurbsCurve<T,N>::reset(P1,U1,degree);
00134 updateMaxU() ;
00135 }
00136
00137 template <class T, int N>
00138 inline NurbsCurve<T,N>& NurbsCurveSP<T,N>::operator=(const NurbsCurve<T,N>& a) {
00139 NurbsCurve<T,N>::operator=(a);
00140 updateMaxU() ;
00141 return *this;
00142 }
00143
00144 template <class T, int N>
00145 inline NurbsCurveSP<T,N>& NurbsCurveSP<T,N>::operator=(const NurbsCurveSP<T,N>& a) {
00146 NurbsCurve<T,N>::operator=(a);
00147 maxU = a.maxU ;
00148 maxAt_ = a.maxAt_ ;
00149 return *this;
00150 }
00151
00152 template <class T, int N>
00153 inline void NurbsCurveSP<T,N>::modKnot(const Vector<T>& knot) {
00154 NurbsCurve<T,N>::modKnot(knot) ;
00155 updateMaxU() ;
00156 }
00157
00158 template <class T, int N>
00159 inline void NurbsCurveSP<T,N>::removeKnot(int r, int s, int num) {
00160 NurbsCurve<T,N>::removeKnot(r,s,num);
00161 updateMaxU() ;
00162 }
00163
00164 template <class T, int N>
00165 inline void NurbsCurveSP<T,N>::removeKnotsBound(const Vector<T>& ub, Vector<T>& ek, T E) {
00166 NurbsCurve<T,N>::removeKnotsBound(ub,ek,E);
00167 updateMaxU() ;
00168 }
00169
00170 template <class T, int N>
00171 inline void NurbsCurveSP<T,N>::refineKnotVector(const Vector<T>& X) {
00172 NurbsCurve<T,N>::refineKnotVector(X);
00173 updateMaxU() ;
00174 }
00175
00176 template <class T, int N>
00177 inline void NurbsCurveSP<T,N>::mergeKnotVector(const Vector<T> &Um) {
00178 NurbsCurve<T,N>::mergeKnotVector(Um);
00179 updateMaxU() ;
00180 }
00181
00182 template <class T, int N>
00183 inline void NurbsCurveSP<T,N>::knotInsertion(T u, int r,NurbsCurveSP<T,N>& nc){
00184 NurbsCurve<T,N>::knotInsertion(u,r,nc) ;
00185 nc.updateMaxU() ;
00186 }
00187
00188 template <class T, int N>
00189 inline int NurbsCurveSP<T,N>::read(ifstream &fin) {
00190 int r = NurbsCurve<T,N>::read(fin) ;
00191 updateMaxU() ;
00192 return r ;
00193 }
00194
00195 template <class T, int N>
00196 inline void NurbsCurveSP<T,N>::degreeElevate(int t){
00197 NurbsCurve<T,N>::degreeElevate(t) ;
00198 updateMaxU() ;
00199 }
00200
00201
00202 typedef NurbsCurveSP<float,3> NurbsCurveSPf ;
00203 typedef NurbsCurveSP<double,3> NurbsCurveSPd ;
00204 typedef NurbsCurveSP<float,3> NurbsCurveSP_2Df ;
00205 typedef NurbsCurveSP<double,3> NurbsCurveSP_2Dd ;
00206
00207 }
00208
00209 typedef PLib::NurbsCurveSP<float,3> PlNurbsCurveSPf ;
00210 typedef PLib::NurbsCurveSP<double,3> PlNurbsCurveSPd ;
00211 typedef PLib::NurbsCurveSP<float,3> PlNurbsCurveSP_2Df ;
00212 typedef PLib::NurbsCurveSP<double,3> PlNurbsCurveSP_2Dd ;
00213
00214
00215
00216 #endif