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