#include "nurbs.cpp" namespace PLib { // double specialization template <> Point_nD NurbsCurve::normal(double u, const Point_nD& v) const{ cerr << "YOU CAN'T COMPUTE THE NORMAL in 2D of a 2D vector!\n" ; return firstDn(u) ; } void NurbsCurve::makeCircle(const Point_nD& O, double 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,double radius,int K, const Color& color,int Nu,int Nv, double u_s, double 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,double radius,int K, const Color& color,int Nu,int Nv, double u_s, double 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,double radius,int K, const Color& color,int Nu,int Nv, double u_s, double 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,double radius,int K, const Color& color,int Nu,int Nv, double u_s, double 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 //double initialization template class NurbsCurve ; template class OpLengthFcn ; template double chordLengthParam(const Vector< Point_nD >& Q, Vector &ub); template double chordLengthParamH(const Vector< HPoint_nD >& Q, Vector &ub); template double chordLengthParamClosed(const Vector< Point_nD >& Q, Vector &ub, int deg); template double 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 double nurbsBasisFun(double u, int i, int p, const Vector& U) ; template void nurbsBasisFuns(double u, int span, int deg, const Vector& U, Vector& N); template void nurbsDersBasisFuns(int n, double 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(double u, const Vector& U, int deg); template int maxInfluence(int i, const Vector& U, int p, double &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 double chordLengthParam(const Vector< Point_nD >& Q, Vector &ub); template double chordLengthParamH(const Vector< HPoint_nD >& Q, Vector &ub); template double chordLengthParamClosed(const Vector< Point_nD >& Q, Vector &ub, int deg); template double 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&); #endif }