#include "nurbs.cpp" namespace PLib { // float specialization template <> Point_nD NurbsCurve::normal(float u, const Point_nD& v) const{ cerr << "YOU CAN'T COMPUTE THE NORMAL in 2D of a 2D vector!\n" ; return firstDn(u) ; } template <> void NurbsCurve::makeCircle(const Point_nD& O, float r, double as, double ae){ makeCircle(O,Point_nD(1,0),Point_nD(0,1),r,as,ae) ; } template <> int NurbsCurve::writeVRML(const char* filename,float radius,int K, const Color& color,int Nu,int Nv, float u_s, float u_e) const{ NurbsCurve C ; to3D(*this,C) ; return C.writeVRML(filename,radius,K,color,Nu,Nv,u_s,u_e) ; } template <> int NurbsCurve::writeVRML97(const char* filename,float radius,int K, const Color& color,int Nu,int Nv, float u_s, float u_e) const{ NurbsCurve C ; to3D(*this,C) ; return C.writeVRML97(filename,radius,K,color,Nu,Nv,u_s,u_e) ; } template <> int NurbsCurve::writeVRML(ostream& fout,float radius,int K, const Color& color,int Nu,int Nv, float u_s, float u_e) const{ NurbsCurve C ; to3D(*this,C) ; return C.writeVRML(fout,radius,K,color,Nu,Nv,u_s,u_e) ; } template <> int NurbsCurve::writeVRML97(ostream& fout,float radius,int K, const Color& color,int Nu,int Nv, float u_s, float u_e) const{ NurbsCurve C ; to3D(*this,C) ; return C.writeVRML97(fout,radius,K,color,Nu,Nv,u_s,u_e) ; } template <> void NurbsCurve::drawAaImg(Image_Color& Img, const Color& color, int precision, int alpha){ NurbsCurve C ; to3D(*this,C) ; C.drawAaImg(Img,color,precision,alpha) ; } #ifdef NO_IMPLICIT_TEMPLATES template class NurbsCurve; template class OpLengthFcn; template float chordLengthParam(const Vector< Point_nD >& Q, Vector &ub); template float chordLengthParamH(const Vector< HPoint_nD >& Q, Vector &ub); template float chordLengthParamClosed(const Vector< Point_nD >& Q, Vector &ub, int deg); template float chordLengthParamClosedH(const Vector< HPoint_nD >& Q, Vector &ub, int deg); template void binomialCoef(Matrix& Bin) ; template Vector knotUnion(const Vector& Ua, const Vector& Ub); template float nurbsBasisFun(float u, int i, int p, const Vector& U) ; template void nurbsBasisFuns(float u, int span, int deg, const Vector& U, Vector& N); template void nurbsDersBasisFuns(int n, float u, int span, int deg, const Vector& U, Matrix& ders) ; template int intersectLine(const Point_nD& p1, const Point_nD& t1, const Point_nD& p2, const Point_nD& t2, Point_nD& p); template void knotAveraging(const Vector& uk, int deg, Vector& U) ; template void knotAveragingClosed(const Vector& uk, int deg, Vector& U) ; template void averagingKnots(const Vector& U, int deg, Vector& uk); template int findSpan(float u, const Vector& U, int deg); template int maxInfluence(int i, const Vector& U, int p, float &u); template void generateCompatibleCurves(NurbsCurveArray &ca); template void knotApproximationClosed( Vector& U, const Vector& ub, int n, int p); template void wrapPointVector(const Vector >& Q, int d, Vector >& Qw); template void wrapPointVectorH(const Vector >& Q, int d, Vector >& Qw); template class NurbsCurve ; template class OpLengthFcn; template float chordLengthParam(const Vector< Point_nD >& Q, Vector &ub); template float chordLengthParamH(const Vector< HPoint_nD >& Q, Vector &ub); template float chordLengthParamClosed(const Vector< Point_nD >& Q, Vector &ub, int deg); template float chordLengthParamClosedH(const Vector< HPoint_nD >& Q, Vector &ub, int deg); template int intersectLine(const Point_nD& p1, const Point_nD& t1, const Point_nD& p2, const Point_nD& t2, Point_nD& p); template void generateCompatibleCurves(NurbsCurveArray &ca); template void wrapPointVector(const Vector >& Q, int d, Vector >& Qw); template void wrapPointVectorH(const Vector >& Q, int d, Vector >& Qw); template void to3D(const NurbsCurve&, NurbsCurve&); template void to3D(const NurbsCurve&, NurbsCurve&); template void to2D(const NurbsCurve&, NurbsCurve&); // The following is necessary for gcc 2.96 // template std::basic_istream >::seekg(std::fpos<__mbstate_t>); #endif } // end namespace