multibsd.h

Go to the documentation of this file.
00001 
00002 /* ///////////////////////////////////////////////////////////////////////// */
00003 /* This file is a part of the BSTools package                                */
00004 /* written by Przemyslaw Kiciak                                              */
00005 /* ///////////////////////////////////////////////////////////////////////// */
00006 /* (C) Copyright by Przemyslaw Kiciak, 2005, 2011                            */
00007 /* this package is distributed under the terms of the                        */
00008 /* Lesser GNU Public License, see the file COPYING.LIB                       */
00009 /* ///////////////////////////////////////////////////////////////////////// */
00010 
00011 /* Header file for the libmultibs library of C procedures -              */
00012 /* processing B-spline and Bezier curves and surfaces                    */ 
00013 
00014 #ifndef CONST_  /* a dirty trick to suppress many compiler warning messages */
00015 #define CONST_ const
00016 #endif
00017 
00018 #ifndef MULTIBSD_H
00019 #define MULTIBSD_H
00020 
00021 #ifndef PKNUM_H
00022 #include "pknum.h"
00023 #endif
00024 
00025 #ifndef PKGEOM_H
00026 #include "pkgeom.h"
00027 #endif
00028 
00029 #ifdef __cplusplus   
00030 extern "C" {
00031 #endif
00032 
00033 #ifndef MULTIBS_H
00034 /* boundary conditions identifiers for cubic splines of interpolation */
00035 
00036 #define BS3_BC_FIRST_DER   0
00037 #define BS3_BC_FIRST_DER0  1
00038 #define BS3_BC_SECOND_DER  2
00039 #define BS3_BC_SECOND_DER0 3
00040 #define BS3_BC_THIRD_DER   4
00041 #define BS3_BC_THIRD_DER0  5
00042 #define BS3_BC_BESSEL      6
00043 #define BS3_BC_NOT_A_KNOT  7
00044 #endif
00045 
00046 
00047 int mbs_KnotMultiplicityd ( int lastknot, const double *knots, double t );
00048 
00049 int mbs_FindKnotIntervald ( int degree, int lastknot, const double *knots,
00050                             double t, int *mult );
00051 
00052 double mbs_GrevilleAbscissad ( int degree, double *knots, int i );
00053 
00054 void mbs_TransformAffKnotsd ( int degree, int lastknot, const double *inknots,
00055                               double a, double b, double *outknots );
00056 
00057 void mbs_multiReverseBSCurved ( int degree, int lastknot, double *knots,
00058                                 int ncurves, int spdimen, int pitch,
00059                                 double *ctlpoints );
00060 boolean mbs_ClosedKnotsCorrectd ( int degree, int lastknot, double *knots,
00061                                   double T, int K, double tol );
00062 
00063 int mbs_SetKnotd ( int lastknot, double *knots,
00064                    int knotnum, int mult, double t );
00065 int mbs_SetKnotClosedd ( int degree, int lastknot, double *knots, double T,
00066                          int knotnum, int mult, double t );
00067                                                   
00068 void _mbs_multideBoorKerneld ( int degree, const double *knots,
00069                                int ncurves, int spdimen,
00070                                int pitch, const double *ctlpoints,
00071                                double t, int k, int r, int lj,
00072                                int dpitch, double *d );
00073 
00074 int mbs_multideBoord ( int degree, int lastknot,
00075                        const double *knots,
00076                        int ncurves, int spdimen, int pitch,
00077                        const double *ctlpoints,
00078                        double t,
00079                        double *cpoints );
00080 
00081 #define mbs_deBoorC1d(degree,lastknot,knots,coeff,t,value) \
00082   mbs_multideBoord ( degree, lastknot, knots, 1, 1, 0, coeff, t, value )
00083 #define mbs_deBoorC2d(degree,lastknot,knots,ctlpoints,t,cpoint) \
00084   mbs_multideBoord ( degree, lastknot, knots, 1, 2, 0, (double*)ctlpoints, t, \
00085     (double*)cpoint )
00086 #define mbs_deBoorC3d(degree,lastknot,knots,ctlpoints,t,cpoint) \
00087   mbs_multideBoord ( degree, lastknot, knots, 1, 3, 0, (double*)ctlpoints, t, \
00088     (double*)cpoint )
00089 #define mbs_deBoorC4d(degree,lastknot,knots,ctlpoints,t,cpoint) \
00090   mbs_multideBoord ( degree, lastknot, knots, 1, 4, 0, (double*)ctlpoints, t, \
00091     (double*)cpoint )
00092 
00093 
00094 void mbs_deBoorC2Rd ( int degree, int lastknot,
00095                       const double *knots, const point3d *ctlpoints,
00096                       double t, point2d *cpoint );
00097 
00098 void mbs_deBoorC3Rd ( int degree, int lastknot,
00099                       const double *knots, const point4d *ctlpoints,
00100                       double t, point3d *cpoint );
00101 
00102 void mbs_deBoorP3d ( int degreeu, int lastknotu, const double *knotsu,
00103                      int degreev, int lastknotv, const double *knotsv,
00104                      int pitch,
00105                      const point3d *ctlpoints,
00106                      double u, double v, point3d *ppoint );
00107 
00108 void mbs_deBoorP3Rd ( int degreeu, int lastknotu, const double *knotsu,
00109                       int degreev, int lastknotv, const double *knotsv,
00110                       int pitch,
00111                       const point4d *ctlpoints,
00112                       double u, double v, point3d *ppoint );
00113 
00114 void mbs_deBoorP4d ( int degreeu, int lastknotu, const double *knotsu,
00115                      int degreev, int lastknotv, const double *knotsv,
00116                      int pitch,
00117                      const point4d *ctlpoints,
00118                      double u, double v, point4d *ppoint );
00119 
00120 
00121 int mbs_multideBoorDerd ( int degree, int lastknot,
00122                           const double *knots,
00123                           int ncurves, int spdimen, int pitch,
00124                           const double *ctlpoints,
00125                           double t,
00126                           double *cpoints, double *dervect );
00127 
00128 #define mbs_deBoorDerC1d(degree,lastknot,knots,ctlpoints,t,cpoint,cder) \
00129   mbs_multideBoorDerd ( degree, lastknot, knots, 1, 1, 0, (double*)ctlpoints, \
00130     t, cpoint, cder )
00131 #define mbs_deBoorDerC2d(degree,lastknot,knots,ctlpoints,t,cpoint,cder) \
00132   mbs_multideBoorDerd ( degree, lastknot, knots, 1, 2, 0, (double*)ctlpoints, \
00133     t, (double*)cpoint, (double*)cder )
00134 #define mbs_deBoorDerC3d(degree,lastknot,knots,ctlpoints,t,cpoint,cder) \
00135   mbs_multideBoorDerd ( degree, lastknot, knots, 1, 3, 0, (double*)ctlpoints, \
00136     t, (double*)cpoint, (double*)cder )
00137 #define mbs_deBoorDerC4d(degree,lastknot,knots,ctlpoints,t,cpoint,cder) \
00138   mbs_multideBoorDerd ( degree, lastknot, knots, 1, 4, 0, (double*)ctlpoints, \
00139     t, (double*)cpoint, (double*)cder )
00140 
00141 
00142 int mbs_multideBoorDer2d ( int degree, int lastknot, const double *knots,
00143                            int ncurves, int spdimen,
00144                            int pitch, const double *ctlpoints,
00145                            double t, double *p, double *d1, double *d2 );
00146 
00147 #define mbs_deBoorDer2C1d(degree,lastknot,knots,coeff,t,p,d1,d2) \
00148   mbs_multideBoorDer2d(degree,lastknot,knots,1,1,0,coeff,t,p,d1,d2)
00149 #define mbs_deBoorDer2C2d(degree,lastknot,knots,ctlpoints,t,p,d1,d2) \
00150   mbs_multideBoorDer2d(degree,lastknot,knots,1,2,0,(double*)ctlpoints,t, \
00151     (double*)p,(double*)d1,(double*)d2)
00152 #define mbs_deBoorDer2C3d(degree,lastknot,knots,ctlpoints,t,p,d1,d2) \
00153   mbs_multideBoorDer2d(degree,lastknot,knots,1,3,0,(double*)ctlpoints,t, \
00154     (double*)p,(double*)d1,(double*)d2)
00155 #define mbs_deBoorDer2C4d(degree,lastknot,knots,ctlpoints,t,p,d1,d2) \
00156   mbs_multideBoorDer2d(degree,lastknot,knots,1,4,0,(double*)ctlpoints,t, \
00157     (double*)p,(double*)d1,(double*)d2)
00158 
00159 
00160 int mbs_multideBoorDer3d ( int degree, int lastknot, const double *knots,
00161                            int ncurves, int spdimen,
00162                            int pitch, const double *ctlpoints, double t,
00163                            double *p, double *d1, double *d2, double *d3 );
00164 
00165 #define mbs_deBoorDer3C1d(degree,lastknot,knots,coeff,t,p,d1,d2,d3) \
00166   mbs_multideBoorDer3d(degree,lastknot,knots,1,1,0,coeff,t,p,d1,d2,d3)
00167 #define mbs_deBoorDer3C2d(degree,lastknot,knots,ctlpoints,t,p,d1,d2,d3) \
00168   mbs_multideBoorDer3d(degree,lastknot,knots,1,2,0,(double*)ctlpoints,t, \
00169     (double*)p,(double*)d1,(double*)d2,(double*)d3)
00170 #define mbs_deBoorDer3C3d(degree,lastknot,knots,ctlpoints,t,p,d1,d2,d3) \
00171   mbs_multideBoorDer3d(degree,lastknot,knots,1,3,0,(double*)ctlpoints,t, \
00172     (double*)p,(double*)d1,(double*)d2,(double*)d3)
00173 #define mbs_deBoorDer3C4d(degree,lastknot,knots,ctlpoints,t,p,d1,d2,d3) \
00174   mbs_multideBoorDer3d(degree,lastknot,knots,1,4,0,(double*)ctlpoints,t, \
00175     (double*)p,(double*)d1,(double*)d2,(double*)d3)
00176 
00177 
00178 boolean mbs_deBoorDerPd ( int degreeu, int lastknotu, const double *knotsu,    
00179                           int degreev, int lastknotv, const double *knotsv,
00180                           int spdimen, int pitch, const double *ctlpoints,
00181                           double u, double v,
00182                           double *ppoint, double *uder, double *vder );
00183 
00184 boolean mbs_deBoorDer2Pd ( int degreeu, int lastknotu, const double *knotsu,
00185                            int degreev, int lastknotv, const double *knotsv,
00186                            int spdimen, int pitch, const double *ctlpoints, 
00187                            double u, double v,
00188                            double *ppoint, double *uder, double *vder,
00189                            double *uuder, double *uvder, double *vvder );
00190 
00191 boolean mbs_deBoorDer3Pd ( int degreeu, int lastknotu, const double *knotsu,
00192                            int degreev, int lastknotv, const double *knotsv,
00193                            int spdimen, int pitch, const double *ctlpoints, 
00194                            double u, double v,
00195                            double *ppoint, double *uder, double *vder,
00196                            double *uuder, double *uvder, double *vvder,
00197                            double *uuuder, double *uuvder, double *uvvder,
00198                            double *vvvder );
00199 
00200  
00201 int mbs_multiKnotInsd ( int degree, int *lastknot,
00202                         double *knots,
00203                         int ncurves, int spdimen, int inpitch, int outpitch,
00204                         double *ctlpoints, double t );
00205 
00206 #define mbs_KnotInsC1d(degree,lastknot,knots,coeff,t) \
00207   mbs_multiKnotInsd (degree,lastknot,knots,1,1,0,0,coeff,t)
00208 #define mbs_KnotInsC2d(degree,lastknot,knots,ctlpoints,t) \
00209   mbs_multiKnotInsd (degree,lastknot,knots,1,2,0,0,(double*)ctlpoints,t)
00210 #define mbs_KnotInsC3d(degree,lastknot,knots,ctlpoints,t) \
00211   mbs_multiKnotInsd (degree,lastknot,knots,1,3,0,0,(double*)ctlpoints,t)
00212 #define mbs_KnotInsC4d(degree,lastknot,knots,ctlpoints,t) \
00213   mbs_multiKnotInsd (degree,lastknot,knots,1,4,0,0,(double*)ctlpoints,t)
00214 
00215 
00216 int mbs_multiKnotInsClosedd ( int degree, int *lastknot, double *knots,
00217                               int ncurves, int spdimen, int inpitch, int outpitch,
00218                               double *ctlpoints, double t );
00219 
00220 #define mbs_KnotInsClosedC1d(degree,lastknot,knots,coeff,t) \
00221   mbs_multiKnotInsClosedd(degree,lastknot,knots,1,1,0,0,coeff,t)
00222 #define mbs_KnotInsClosedC2d(degree,lastknot,knots,ctlpoints,t) \
00223   mbs_multiKnotInsClosedd(degree,lastknot,knots,1,2,0,0,(double*)ctlpoints,t)
00224 #define mbs_KnotInsClosedC3d(degree,lastknot,knots,ctlpoints,t) \
00225   mbs_multiKnotInsClosedd(degree,lastknot,knots,1,3,0,0,(double*)ctlpoints,t)
00226 #define mbs_KnotInsClosedC4d(degree,lastknot,knots,ctlpoints,t) \
00227   mbs_multiKnotInsClosedd(degree,lastknot,knots,1,4,0,0,(double*)ctlpoints,t)
00228 
00229 
00230 int mbs_multiKnotRemoved ( int degree, int *lastknot,
00231                            double *knots,
00232                            int ncurves, int spdimen, int inpitch, int outpitch,
00233                            double *ctlpoints, int knotnum );
00234 
00235 #define mbs_KnotRemoveC1d(degree,lastknot,knots,coeff,knotnum) \
00236   mbs_multiKnotRemoved(degree,lastknot,knots,1,1,0,0,coeff,knotnum)
00237 #define mbs_KnotRemoveC2d(degree,lastknot,knots,ctlpoints,knotnum) \
00238   mbs_multiKnotRemoved(degree,lastknot,knots,1,2,0,0, \
00239     (double*)ctlpoints,knotnum)
00240 #define mbs_KnotRemoveC3d(degree,lastknot,knots,ctlpoints,knotnum) \
00241   mbs_multiKnotRemoved(degree,lastknot,knots,1,3,0,0, \
00242     (double*)ctlpoints,knotnum)
00243 #define mbs_KnotRemoveC4d(degree,lastknot,knots,ctlpoints,knotnum) \
00244   mbs_multiKnotRemoved(degree,lastknot,knots,1,4,0,0, \
00245     (double*)ctlpoints,knotnum)
00246 
00247 
00248 int mbs_multiKnotRemoveClosedd ( int degree, int *lastknot,
00249                                  double *knots,
00250                                  int ncurves, int spdimen, int inpitch, int outpitch,
00251                                  double *ctlpoints, int knotnum );
00252 
00253 #define mbs_KnotRemoveClosedC1d(degree,lastknot,knots,coeff,knotnum) \
00254   mbs_multiKnotRemoveClosedd (degree,lastknot,knots,1,1,0,0,coeff,knotnum)
00255 #define mbs_KnotRemoveClosedC2d(degree,lastknot,knots,ctlpoints,knotnum) \
00256   mbs_multiKnotRemoveClosedd (degree,lastknot,knots,1,2,0,0, \
00257     (double*)ctlpoints,knotnum)
00258 #define mbs_KnotRemoveClosedC3d(degree,lastknot,knots,ctlpoints,knotnum) \
00259   mbs_multiKnotRemoveClosedd (degree,lastknot,knots,1,3,0,0, \
00260     (double*)ctlpoints,knotnum)
00261 #define mbs_KnotRemoveClosedC4d(degree,lastknot,knots,ctlpoints,knotnum) \
00262   mbs_multiKnotRemoveClosedd (degree,lastknot,knots,1,4,0,0, \
00263     (double*)ctlpoints,knotnum)
00264 
00265 
00266 void mbs_multiRemoveSuperfluousKnotsd ( int ncurves, int spdimen, int degree,
00267                                         int *lastknot, double *knots,
00268                                         int inpitch, int outpitch,
00269                                         double *ctlpoints );
00270 
00271 
00272 void mbs_multiMaxKnotInsd ( int ncurves, int spdimen, int degree,
00273                             int inlastknot, const double *inknots,
00274                             int inpitch, const double *inctlpoints,
00275                             int *outlastknot, double *outknots,
00276                             int outpitch, double *outctlpoints,
00277                             int *skipl, int *skipr );
00278 
00279 #define mbs_MaxKnotInsC1d(degree,inlastknot,inknots,incoeff, \
00280                           outlastknot,outknots,outcoeff,skipl,skipr) \
00281   mbs_multiMaxKnotInsd(1,1,degree,inlastknot,inknots,0,incoeff, \
00282     outlastknot,outknots,0,outcoeff,skipl,skipr)
00283 #define mbs_MaxKnotInsC2d(degree,inlastknot,inknots,inctlpoints, \
00284                           outlastknot,outknots,outctlpoints,skipl,skipr) \
00285   mbs_multiMaxKnotInsd(1,2,degree,inlastknot,inknots,0,(double*)inctlpoints, \
00286     outlastknot,outknots,0,(double*)outctlpoints,skipl,skipr)
00287 #define mbs_MaxKnotInsC3d(degree,inlastknot,inknots,inctlpoints, \
00288                           outlastknot,outknots,outctlpoints,skipl,skipr) \
00289   mbs_multiMaxKnotInsd(1,3,degree,inlastknot,inknots,0,(double*)inctlpoints, \
00290     outlastknot,outknots,0,(double*)outctlpoints,skipl,skipr)
00291 #define mbs_MaxKnotInsC4d(degree,inlastknot,inknots,inctlpoints, \
00292                           outlastknot,outknots,outctlpoints,skipl,skipr) \
00293   mbs_multiMaxKnotInsd(1,4,degree,inlastknot,inknots,0,(double*)inctlpoints, \
00294     outlastknot,outknots,0,(double*)outctlpoints,skipl,skipr)
00295 
00296 
00297 void mbs_multiBSCurvesToBezd ( int spdimen, int ncurves,
00298                                int degree, int lastinknot, const double *inknots,
00299                                int inpitch, const double *inctlp,
00300                                int *kpcs, int *lastoutknot, double *outknots,
00301                                int outpitch, double *outctlp );
00302 
00303 #define mbs_BSToBezC1d(degree,lastinknot,inknots,incoeff,kpcs, \
00304     lastoutknot,outknots,outcoeff) \
00305   mbs_multiBSCurvesToBezd(1,1,degree,lastinknot,inknots,0,incoeff, \
00306     kpcs,lastoutknot,outknots,0,outcoeff)
00307 #define mbs_BSToBezC2d(degree,lastinknot,inknots,inctlp,kpcs, \
00308     lastoutknot,outknots,outctlp) \
00309   mbs_multiBSCurvesToBezd(2,1,degree,lastinknot,inknots,0,(double*)inctlp, \
00310     kpcs,lastoutknot,outknots,0,(double*)outctlp)
00311 #define mbs_BSToBezC3d(degree,lastinknot,inknots,inctlp,kpcs, \
00312     lastoutknot,outknots,outctlp) \
00313   mbs_multiBSCurvesToBezd(3,1,degree,lastinknot,inknots,0,(double*)inctlp, \
00314     kpcs,lastoutknot,outknots,0,(double*)outctlp)
00315 #define mbs_BSToBezC4d(degree,lastinknot,inknots,inctlp,kpcs, \
00316     lastoutknot,outknots,outctlp) \
00317   mbs_multiBSCurvesToBezd(4,1,degree,lastinknot,inknots,0,(double*)inctlp, \
00318     kpcs,lastoutknot,outknots,0,(double*)outctlp)
00319 
00320 
00321 void mbs_BSPatchToBezd ( int spdimen,
00322                          int degreeu, int lastuknot, const double *uknots,
00323                          int degreev, int lastvknot, const double *vknots,
00324                          int inpitch, const double *inctlp,
00325                          int *kupcs, int *lastoutuknot, double *outuknots,
00326                          int *kvpcs, int *lastoutvknot, double *outvknots,
00327                          int outpitch, double *outctlp );
00328 
00329 
00330 int mbs_NumKnotIntervalsd ( int degree, int lastknot, const double *knots );
00331 
00332 int mbs_LastknotMaxInsd ( int degree, int lastknot, const double *knots, 
00333                           int *numknotintervals );
00334 
00335 int mbs_BSProdRepSized ( int degree1, int lastknot1, const double *knots1,
00336                           int degree2, int lastknot2, const double *knots2 );
00337 
00338 int mbs_NumMaxKnotsd ( int degree, int lastknot, const double *knots );
00339 
00340 void mbs_SetBSProdKnotsd ( int degree1, int lastknot1, const double *knots1,
00341                            int degree2, int lastknot2, const double *knots2,
00342                            int *degree, int *lastknot, double *knots );
00343 
00344 void mbs_SetKnotPatternd ( int lastinknot, const double *inknots,
00345                            int multipl,
00346                            int *lastoutknot, double *outknots );
00347 
00348 void mbs_multiBezScaled ( int degree, int narcs, int ncurves, int spdimen,  
00349                           int pitch, double *ctlpoints );
00350 
00351 void mbs_multiBezUnscaled ( int degree, int narcs, int ncurves, int spdimen,  
00352                             int pitch, double *ctlpoints );
00353 
00354 void mbs_multiMultBezCd ( int nscf, int degscf, int scfpitch,
00355                           const double *scfcoef,
00356                           int spdimen,
00357                           int nvecf, int degvecf, int vecfpitch,
00358                           const double *vecfcp,
00359                           int *degprod, int prodpitch, double *prodcp );
00360 
00361 void mbs_multiMultBSCd ( int nscf, int degscf,
00362                          int scflastknot, const double *scfknots,
00363                          int scfpitch, const double *scfcoef,
00364                          int spdimen,
00365                          int nvecf, int degvecf,
00366                          int vecflastknot, const double *vecfknots,
00367                          int vecfpitch, const double *vecfcp,
00368                          int *degprod, int *prodlastknot, double *prodknots,
00369                          int prodpitch, double *prodcp );
00370 
00371 
00372 void mbs_multiBCDegElevd ( int ncurves, int spdimen,
00373                            int inpitch, int indegree, const double *inctlpoints,
00374                            int deltadeg,
00375                            int outpitch, int *outdegree, double *outctlpoints );
00376 
00377 #define mbs_BCDegElevC1d(indegree,incoeff,deltadeg,outdegree,outcoeff) \
00378   mbs_multiBCDegElevd ( 1, 1, 0, indegree, incoeff, deltadeg, \
00379     0, outdegree, outcoeff )
00380 #define mbs_BCDegElevC2d(indegree,inctlpoints,deltadeg,outdegree,outctlpoints) \
00381   mbs_multiBCDegElevd ( 1, 2, 0, indegree, (double*)inctlpoints, deltadeg, \
00382     0, outdegree, (double*)outctlpoints )
00383 #define mbs_BCDegElevC3d(indegree,inctlpoints,deltadeg,outdegree,outctlpoints) \
00384   mbs_multiBCDegElevd ( 1, 3, 0, indegree, (double*)inctlpoints, deltadeg, \
00385     0, outdegree, (double*)outctlpoints)
00386 #define mbs_BCDegElevC4d(indegree,inctlpoints,deltadeg,outdegree,outctlpoints) \
00387   mbs_multiBCDegElevd ( 1, 4, 0, indegree, (double*)inctlpoints, deltadeg, \
00388     0, outdegree, (double*)outctlpoints )
00389 
00390 
00391 void mbs_BCDegElevPd ( int spdimen,
00392                        int indegreeu, int indegreev, const double *inctlp,
00393                        int deltadegu, int deltadegv,
00394                        int *outdegreeu, int *outdegreev,
00395                        double *outctlp );
00396 
00397 #define mbs_BCDegElevP1d(indegreeu,indegreev,incoeff,deltadegu,deltadegv, \
00398     outdegreeu,outdegreev,outcoeff) \
00399   mbs_BCDegElevPd ( 1, indegreeu, indegreev, incoeff, deltadegu, deltadegv, \
00400     outdegreeu, outdegreev, outcoeff )
00401 #define mbs_BCDegElevP2d(indegreeu,indegreev,inctlp,deltadegu,deltadegv, \
00402     outdegreeu,outdegreev,outctlp) \
00403   mbs_BCDegElevPd ( 2, indegreeu, indegreev, (double*)inctlp, \
00404     deltadegu, deltadegv, outdegreeu, outdegreev, (double*)outctlp )
00405 #define mbs_BCDegElevP3d(indegreeu,indegreev,inctlp,deltadegu,deltadegv, \
00406     outdegreeu,outdegreev,outctlp) \
00407   mbs_BCDegElevPd ( 3, indegreeu, indegreev, (double*)inctlp, \
00408     deltadegu, deltadegv, outdegreeu, outdegreev, (double*)outctlp )
00409 #define mbs_BCDegElevP4d(indegreeu,indegreev,inctlp,deltadegu,deltadegv, \
00410     outdegreeu,outdegreev,outctlp) \
00411   mbs_BCDegElevPd ( 4, indegreeu, indegreev, (double*)inctlp, \
00412     deltadegu, deltadegv, outdegreeu, outdegreev, (double*)outctlp )
00413 
00414 
00415 void mbs_multiBCDegRedd ( int ncurves, int spdimen,
00416                           int inpitch, int indegree, const double *inctlpoints,
00417                           int deltadeg,
00418                           int outpitch, int *outdegree, double *outctlpoints );
00419 
00420 #define mbs_BCDegRedC1d(indegree,incoeff,deltadeg,outdegree,outcoeff) \
00421   mbs_multiBCDegRedd ( 1, 1, 0, indegree, incoeff, deltadeg, \
00422     0, outdegree, outcoeff )
00423 #define mbs_BCDegRedC2d(indegree,inctlpoints,deltadeg,outdegree,outctlpoints) \
00424   mbs_multiBCDegRedd ( 1, 2, 0, indegree, (double*)inctlpoints, deltadeg, \
00425     0, outdegree, (double*)outctlpoints )
00426 #define mbs_BCDegRedC3d(indegree,inctlpoints,deltadeg,outdegree,outctlpoints) \
00427   mbs_multiBCDegRedd ( 1, 3, 0, indegree, (double*)inctlpoints, deltadeg, \
00428     0, outdegree, (double*)outctlpoints)
00429 #define mbs_BCDegRedC4d(indegree,inctlpoints,deltadeg,outdegree,outctlpoints) \
00430   mbs_multiBCDegRedd ( 1, 4, 0, indegree, (double*)inctlpoints, deltadeg, \
00431     0, outdegree, (double*)outctlpoints )
00432 
00433 
00434 void mbs_BCDegRedPd ( int spdimen,
00435                       int indegreeu, int indegreev, const double *inctlp,
00436                       int deltadegu, int deltadegv,
00437                       int *outdegreeu, int *outdegreev,
00438                       double *outctlp );
00439 
00440 #define mbs_BCDegRedP1d(indegreeu,indegreev,incoeff,deltadegu,deltadegv, \
00441     outdegreeu,outdegreev,outcoeff) \
00442   mbs_BCDegRedPd ( 1, indegreeu, indegreev, incoeff, deltadegu, deltadegv, \
00443     outdegreeu, outdegreev, outcoeff )
00444 #define mbs_BCDegRedP2d(indegreeu,indegreev,inctlp,deltadegu,deltadegv, \
00445     outdegreeu,outdegreev,outctlp) \
00446   mbs_BCDegRedPd ( 2, indegreeu, indegreev, (double*)inctlp, \
00447     deltadegu, deltadegv, outdegreeu, outdegreev, (double*)outctlp )
00448 #define mbs_BCDegRedP3d(indegreeu,indegreev,inctlp,deltadegu,deltadegv, \
00449     outdegreeu,outdegreev,outctlp) \
00450   mbs_BCDegRedPd ( 3, indegreeu, indegreev, (double*)inctlp, \
00451     deltadegu, deltadegv, outdegreeu, outdegreev, (double*)outctlp )
00452 #define mbs_BCDegRedP4d(indegreeu,indegreev,inctlp,deltadegu,deltadegv, \
00453     outdegreeu,outdegreev,outctlp) \
00454   mbs_BCDegRedPd ( 4, indegreeu, indegreev, (double*)inctlp, \
00455     deltadegu, deltadegv, outdegreeu, outdegreev, (double*)outctlp )
00456 
00457 
00458 void mbs_multiBSDegElevd ( int ncurves, int spdimen,
00459                            int indegree, int inlastknot, const double *inknots,
00460                            int inpitch, const double *inctlpoints,
00461                            int deltadeg,
00462                            int *outdegree, int *outlastknot,
00463                            double *outknots, int outpitch, double *outctlpoints,
00464                            boolean freeend );
00465 
00466 #define mbs_BSDegElevC1d(indegree,inlastknot,inknots,incoeff, \
00467     deltadeg,outdegree,outlastknot,outknots,outcoeff,freeend) \
00468   mbs_multiBSDegElevd(1,1,indegree,inlastknot,inknots,0,incoeff, \
00469     deltadeg,outdegree,outlastknot,outknots,0,outcoeff,freeend)
00470 #define mbs_BSDegElevC2d(indegree,inlastknot,inknots,inctlpoints, \
00471     deltadeg,outdegree,outlastknot,outknots,outctlpoints,freeend) \
00472   mbs_multiBSDegElevd(1,2,indegree,inlastknot,inknots,0,(double*)inctlpoints, \
00473     deltadeg,outdegree,outlastknot,outknots,0,(double*)outctlpoints,freeend)
00474 #define mbs_BSDegElevC3d(indegree,inlastknot,inknots,inctlpoints, \
00475     deltadeg,outdegree,outlastknot,outknots,outctlpoints,freeend) \
00476   mbs_multiBSDegElevd(1,3,indegree,inlastknot,inknots,0,(double*)inctlpoints, \
00477     deltadeg,outdegree,outlastknot,outknots,0,(double*)outctlpoints,freeend)
00478 #define mbs_BSDegElevC4d(indegree,inlastknot,inknots,inctlpoints, \
00479     deltadeg,outdegree,outlastknot,outknots,outctlpoints,freeend) \
00480   mbs_multiBSDegElevd(1,4,indegree,inlastknot,inknots,0,(double*)inctlpoints, \
00481     deltadeg,outdegree,outlastknot,outknots,0,(double*)outctlpoints,freeend)
00482 
00483 void mbs_multiBSDegElevClosedd ( int ncurves, int spdimen,
00484                          int indegree, int inlastknot, const double *inknots,
00485                          int inpitch, const double *inctlpoints,
00486                          int deltadeg,
00487                          int *outdegree, int *outlastknot,
00488                          double *outknots, int outpitch, double *outctlpoints );
00489 
00490 #define mbs_BSDegElevClosedC1d(indegree,inlastknot,inknots,incoeff, \
00491     deltadeg,outdegree,outlastknot,outknots,outcoeff) \
00492   mbs_multiBSDegElevClosedd(1,1,indegree,inlastknot,inknots,0,incoeff, \
00493     deltadeg,outdegree,outlastknot,outknots,0,outcoeff)
00494 #define mbs_BSDegElevClosedC2d(indegree,inlastknot,inknots,inctlpoints, \
00495     deltadeg,outdegree,outlastknot,outknots,outctlpoints) \
00496   mbs_multiBSDegElevClosedd(1,2,indegree,inlastknot,inknots,0,(double*)inctlpoints, \
00497     deltadeg,outdegree,outlastknot,outknots,0,(double*)outctlpoints)
00498 #define mbs_BSDegElevClosedC3d(indegree,inlastknot,inknots,inctlpoints, \
00499     deltadeg,outdegree,outlastknot,outknots,outctlpoints) \
00500   mbs_multiBSDegElevClosedd(1,3,indegree,inlastknot,inknots,0,(double*)inctlpoints, \
00501     deltadeg,outdegree,outlastknot,outknots,0,(double*)outctlpoints)
00502 #define mbs_BSDegElevClosedC4d(indegree,inlastknot,inknots,inctlpoints, \
00503     deltadeg,outdegree,outlastknot,outknots,outctlpoints) \
00504   mbs_multiBSDegElevClosedd(1,4,indegree,inlastknot,inknots,0,(double*)inctlpoints, \
00505     deltadeg,outdegree,outlastknot,outknots,0,(double*)outctlpoints)
00506 
00507 
00508 boolean mbs_multiBSDegRedd ( int ncurves, int spdimen,
00509                              int indegree, int inlastknot, const double *inknots,
00510                              int inpitch, CONST_ double *inctlpoints,
00511                              int deltadeg,
00512                              int *outdegree, int *outlastknot, double *outknots,
00513                              int outpitch, double *outctlpoints );
00514 
00515 #define mbs_BSDegRedC1d(indegree,inlastknot,inknots,incoeff,deltadeg, \
00516     outdegree,outlastknot,outknots,outcoeff) \
00517   mbs_multiBSDegRedd(1,1,indegree,inlastknot,inknots,0,incoeff,deltadeg, \
00518     outdegree,outlastknot,outknots,0,outcoeff)
00519 #define mbs_BSDegRedC2d(indegree,inlastknot,inknots,incpoints,deltadeg, \
00520     outdegree,outlastknot,outknots,outcpoints) \
00521   mbs_multiBSDegRedd(1,2,indegree,inlastknot,inknots,0,(double*)incpoints,deltadeg, \
00522     outdegree,outlastknot,outknots,0,(double*)outcpoints)
00523 #define mbs_BSDegRedC3d(indegree,inlastknot,inknots,incpoints,deltadeg, \
00524     outdegree,outlastknot,outknots,outcpoints) \
00525   mbs_multiBSDegRedd(1,3,indegree,inlastknot,inknots,0,(double*)incpoints,deltadeg, \
00526     outdegree,outlastknot,outknots,0,(double*)outcpoints)
00527 #define mbs_BSDegRedC4d(indegree,inlastknot,inknots,incpoints,deltadeg, \
00528     outdegree,outlastknot,outknots,outcpoints) \
00529   mbs_multiBSDegRedd(1,4,indegree,inlastknot,inknots,0,(double*)incpoints,deltadeg, \
00530     outdegree,outlastknot,outknots,0,(double*)outcpoints)
00531 
00532 
00533 boolean mbs_multiBSDegRedClosedd ( int ncurves, int spdimen,
00534                              int indegree, int inlastknot, const double *inknots,
00535                              int inpitch, CONST_ double *inctlpoints,
00536                              int deltadeg,
00537                              int *outdegree, int *outlastknot, double *outknots,
00538                              int outpitch, double *outctlpoints );
00539 
00540 #define mbs_BSDegRedClosedC1d(indegree,inlastknot,inknots,incoeff,deltadeg, \
00541     outdegree,outlastknot,outknots,outcoeff) \
00542   mbs_multiBSDegRedClosedd(1,1,indegree,inlastknot,inknots,0,incoeff,deltadeg, \
00543     outdegree,outlastknot,outknots,0,outcoeff)
00544 #define mbs_BSDegRedClosedC2d(indegree,inlastknot,inknots,incpoints,deltadeg, \
00545     outdegree,outlastknot,outknots,outcpoints) \
00546   mbs_multiBSDegRedClosedd(1,2,indegree,inlastknot,inknots,0,(double*)incpoints, \
00547     deltadeg,outdegree,outlastknot,outknots,0,(double*)outcpoints)
00548 #define mbs_BSDegRedClosedC3d(indegree,inlastknot,inknots,incpoints,deltadeg, \
00549     outdegree,outlastknot,outknots,outcpoints) \
00550   mbs_multiBSDegRedClosedd(1,3,indegree,inlastknot,inknots,0,(double*)incpoints, \
00551     deltadeg,outdegree,outlastknot,outknots,0,(double*)outcpoints)
00552 #define mbs_BSDegRedClosedC4d(indegree,inlastknot,inknots,incpoints,deltadeg, \
00553     outdegree,outlastknot,outknots,outcpoints) \
00554   mbs_multiBSDegRedClosedd(1,4,indegree,inlastknot,inknots,0,(double*)incpoints, \
00555     deltadeg,outdegree,outlastknot,outknots,0,(double*)outcpoints)
00556 
00557 
00558 void mbs_multiBCHornerd ( int degree, int ncurves, int spdimen, int pitch,
00559                           const double *ctlpoints, double t, double *cpoints );
00560 
00561 #define mbs_BCHornerC1d(degree,coeff,t,value) \
00562   mbs_multiBCHornerd ( degree, 1, 1, 0, coeff, t, value )
00563 #define mbs_BCHornerC2d(degree,ctlpoints,t,cpoint) \
00564   mbs_multiBCHornerd ( degree, 1, 2, 0, (double*)ctlpoints, t, (double*)cpoint )
00565 #define mbs_BCHornerC3d(degree,ctlpoints,t,cpoint) \
00566   mbs_multiBCHornerd ( degree, 1, 3, 0, (double*)ctlpoints, t, (double*)cpoint )
00567 #define mbs_BCHornerC4d(degree,ctlpoints,t,cpoint) \
00568   mbs_multiBCHornerd ( degree, 1, 4, 0, (double*)ctlpoints, t, (double*)cpoint )
00569 
00570 void mbs_BCHornerC2Rd ( int degree, const point3d *ctlpoints, double t,
00571                         point2d *cpoint );
00572 
00573 void mbs_BCHornerC3Rd ( int degree, const point4d *ctlpoints, double t,
00574                         point3d *cpoint );
00575 
00576 
00577 void mbs_BCHornerPd ( int degreeu, int degreev, int spdimen,
00578                       const double *ctlpoints,
00579                       double u, double v, double *ppoint );
00580 
00581 #define mbs_BCHornerP1d(degreeu,degreev,coeff,u,v,ppoint) \
00582   mbs_BCHornerPd ( degreeu, degreev, 1, coeff, u, v, ppoint )
00583 #define mbs_BCHornerP2d(degreeu,degreev,ctlpoints,u,v,ppoint ) \
00584   mbs_BCHornerPd ( degreeu, degreev, 2, (double*)ctlpoints, \
00585     u, v, (double*)ppoint )
00586 #define mbs_BCHornerP3d(degreeu,degreev,ctlpoints,u,v,ppoint ) \
00587   mbs_BCHornerPd ( degreeu, degreev, 3, (double*)ctlpoints, \
00588     u, v, (double*)ppoint )
00589 #define mbs_BCHornerP4d(degreeu,degreev,ctlpoints,u,v,ppoint ) \
00590   mbs_BCHornerPd ( degreeu, degreev, 4, (double*)ctlpoints, \
00591     u, v, (double*)ppoint )
00592 
00593 void mbs_BCHornerP3Rd ( int degreeu, int degreev, const point4d *ctlpoints,
00594                         double u, double v, point3d *p );
00595 
00596 
00597 void mbs_multiBCHornerDerd ( int degree, int ncurves, int spdimen, int pitch,
00598                              const double *ctlpoints,
00599                              double t, double *p, double *d );
00600 
00601 #define mbs_BCHornerDerC1d(degree,coeff,t,p,d) \
00602   mbs_multiBCHornerDerd ( degree, 1, 1, 0, coeff, t, p, d )
00603 #define mbs_BCHornerDerC2d(degree,ctlpoints,t,p,d) \
00604   mbs_multiBCHornerDerd ( degree, 1, 2, 0, (double*)ctlpoints, t, \
00605     (double*)p, (double*)d )
00606 #define mbs_BCHornerDerC3d(degree,ctlpoints,t,p,d) \
00607   mbs_multiBCHornerDerd ( degree, 1, 3, 0, (double*)ctlpoints, t, \
00608     (double*)p, (double*)d )
00609 #define mbs_BCHornerDerC4d(degree,ctlpoints,t,p,d) \
00610   mbs_multiBCHornerDerd ( degree, 1, 4, 0, (double*)ctlpoints, t, \
00611     (double*)p, (double*)d )
00612 
00613 void mbs_BCHornerDerC2Rd ( int degree, const point3d *ctlpoints, double t,
00614                            point2d *p, vector2d *d );
00615 void mbs_BCHornerDerC3Rd ( int degree, const point4d *ctlpoints, double t,
00616                            point3d *p, vector3d *d );
00617 
00618 
00619 void mbs_BCHornerDerPd ( int degreeu, int degreev, int spdimen,
00620                          const double *ctlpoints,
00621                          double u, double v,  
00622                          double *p, double *du, double *dv );
00623 
00624 #define mbs_BCHornerDerP1d(degreeu,degreev,coeff,u,v,p,du,dv) \
00625   mbs_BCHornerDerPd ( degreeu, degreev, 1, coeff, u, v, p, du, dv )
00626 #define mbs_BCHornerDerP2d(degreeu,degreev,ctlpoints,u,v,p,du,dv) \
00627   mbs_BCHornerDerPd ( degreeu, degreev, 2, (double*)ctlpoints, u, v, \
00628     (double*)p, (double*)du, (double*)dv )
00629 #define mbs_BCHornerDerP3d(degreeu,degreev,ctlpoints,u,v,p,du,dv) \
00630   mbs_BCHornerDerPd ( degreeu, degreev, 3, (double*)ctlpoints, u, v, \
00631     (double*)p, (double*)du, (double*)dv )
00632 #define mbs_BCHornerDerP4d(degreeu,degreev,ctlpoints,u,v,p,du,dv) \
00633   mbs_BCHornerDerPd ( degreeu, degreev, 4, (double*)ctlpoints, u, v, \
00634     (double*)p, (double*)du, (double*)dv )
00635 
00636 void mbs_BCHornerDerP3Rd ( int degreeu, int degreev, const point4d *ctlpoints,
00637                            double u, double v,
00638                            point3d *p, vector3d *du, vector3d *dv );
00639 
00640 
00641 void mbs_BCHornerNvP3d ( int degreeu, int degreev, const point3d *ctlpoints,
00642                          double u, double v,
00643                          point3d *p, vector3d *nv );
00644 
00645 void mbs_BCHornerNvP3Rd ( int degreeu, int degreev, const point4d *ctlpoints,
00646                           double u, double v,
00647                           point3d *p, vector3d *nv );
00648 
00649 
00650 void mbs_multiBCHornerDer2d ( int degree, int ncurves, int spdimen, int pitch,
00651                               const double *ctlpoints, 
00652                               double t, double *p, double *d1, double *d2 );
00653 
00654 #define mbs_BCHornerDer2C1d(degree,coeff,t,p,d1,d2) \
00655   mbs_multiBCHornerDer2d ( degree, 1, 1, 0, coeff, t, p, d1, d2 )
00656 #define mbs_BCHornerDer2C2d(degree,ctlpoints,t,p,d1,d2) \
00657   mbs_multiBCHornerDer2d ( degree, 1, 2, 0, (double*)ctlpoints, t, \
00658     (double*)p, (double*)d1, (double*)d2 )
00659 #define mbs_BCHornerDer2C3d(degree,ctlpoints,t,p,d1,d2) \
00660   mbs_multiBCHornerDer2d ( degree, 1, 3, 0, (double*)ctlpoints, t, \
00661     (double*)p, (double*)d1, (double*)d2 )
00662 #define mbs_BCHornerDer2C4d(degree,ctlpoints,t,p,d1,d2) \
00663   mbs_multiBCHornerDer2d ( degree, 1, 4, 0, (double*)ctlpoints, t, \
00664     (double*)p, (double*)d1, (double*)d2 )
00665 
00666 void mbs_BCHornerDer2C2Rd ( int degree, const point3d *ctlpoints, double t,
00667                             point2d *p, vector2d *d1, vector2d *d2 );
00668 void mbs_BCHornerDer2C3Rd ( int degree, const point4d *ctlpoints, double t,
00669                             point3d *p, vector3d *d1, vector3d *d2 );
00670 
00671 void mbs_BCHornerDer2Pd ( int degreeu, int degreev, int spdimen,
00672                           const double *ctlpoints,
00673                           double u, double v,
00674                           double *p, double *du, double *dv,
00675                           double *duu, double *duv, double *dvv );
00676 
00677 #define mbs_BCHornerDer2P1d(degreeu,degreev,coeff,u,v,p,du,dv,duu,duv,dvv) \
00678   mbs_BCHornerDer2Pd ( degreeu, degreev, 1, coeff, u, v, \
00679     p, du, dv, duu, duv, dvv )
00680 #define mbs_BCHornerDer2P2d(degreeu,degreev,ctlpoints,u,v,p,du,dv,duu,duv,dvv) \
00681   mbs_BCHornerDer2Pd ( degreeu, degreev, 2, (double*)ctlpoints, u, v, \
00682     (double*)p, (double*)du, (double*)dv, (double*)duu, (double*)duv, (double*)dvv )
00683 #define mbs_BCHornerDer2P3d(degreeu,degreev,ctlpoints,u,v,p,du,dv,duu,duv,dvv) \
00684   mbs_BCHornerDer2Pd ( degreeu, degreev, 3, (double*)ctlpoints, u, v, \
00685     (double*)p, (double*)du, (double*)dv, (double*)duu, (double*)duv, (double*)dvv )
00686 #define mbs_BCHornerDer2P4d(degreeu,degreev,ctlpoints,u,v,p,du,dv,duu,duv,dvv) \
00687   mbs_BCHornerDer2Pd ( degreeu, degreev, 4, (double*)ctlpoints, u, v, \
00688     (double*)p, (double*)du, (double*)dv, (double*)duu, (double*)duv, (double*)dvv )
00689 
00690 void mbs_BCHornerDer2P3Rd ( int degreeu, int degreev, const point4d *ctlpoints,
00691                             double u, double v,
00692                             point3d *p, vector3d *du, vector3d *dv,
00693                             vector3d *duu, vector3d *duv, vector3d *dvv );
00694 
00695 
00696 void mbs_multiBCHornerDer3d ( int degree, int ncurves, int spdimen, int pitch,
00697                               const double *ctlpoints, double t,
00698                               double *p, double *d1, double *d2, double *d3 );
00699 
00700 #define mbs_BCHornerDer3C1d(degree,coeff,t,p,d1,d2,d3) \
00701   mbs_multiBCHornerDer3d ( degree, 1, 1, 0, coeff, t, p, d1, d2, d3 )
00702 #define mbs_BCHornerDer3C2d(degree,ctlpoints,t,p,d1,d2,d3) \
00703   mbs_multiBCHornerDer3d ( degree, 1, 2, 0, (double*)ctlpoints, t, \
00704     (double*)p, (double*)d1, (double*)d2, (double*)d3 )
00705 #define mbs_BCHornerDer3C3d(degree,ctlpoints,t,p,d1,d2,d3) \
00706   mbs_multiBCHornerDer3d ( degree, 1, 3, 0, (double*)ctlpoints, t, \
00707     (double*)p, (double*)d1, (double*)d2, (double*)d3 )
00708 #define mbs_BCHornerDer3C4d(degree,ctlpoints,t,p,d1,d2,d3) \
00709   mbs_multiBCHornerDer3d ( degree, 1, 4, 0, (double*)ctlpoints, t, \
00710     (double*)p, (double*)d1, (double*)d2, (double*)d3 )
00711 
00712 
00713 void mbs_FindBezPatchDiagFormd ( int degreeu, int degreev, int spdimen,
00714                                  CONST_ double *cpoints,
00715                                  int k, int l, double u, double v,
00716                                  double *dfcp );
00717 
00718 void mbs_BCHornerDer3Pd ( int degreeu, int degreev, int spdimen,
00719                           CONST_ double *ctlpoints,
00720                           double u, double v,
00721                           double *p, double *pu, double *pv,
00722                           double *puu, double *puv, double *pvv,
00723                           double *puuu, double *puuv, double *puvv, double *pvvv );
00724 
00725 #define mbs_BCHornerDer3P1d(degreeu,degreev,coeff,u,v, \
00726     p,pu,pv,puu,puv,pvv,puuu,puuv,puvv,pvvv) \
00727   mbs_BCHornerDer3Pd ( degreeu, degreev, 1, coeff, u, v, \
00728     p, pu, pv, puu, puv, pvv, puuu, puuv, puvv, pvvv )
00729 #define mbs_BCHornerDer3P2d(degreeu,degreev,ctlpoints,u,v, \
00730     p,pu,pv,puu,puv,pvv,puuu,puuv,puvv,pvvv) \
00731   mbs_BCHornerDer3Pd ( degreeu, degreev, 2, (double*)ctlpoints, u, v, \
00732     (double*)p, (double*)pu, (double*)pv, (double*)puu, (double*)puv, \
00733     (double*)pvv, (double*)puuu, (double*)puuv, (double*)puvv, (double*)pvvv )
00734 #define mbs_BCHornerDer3P3d(degreeu,degreev,ctlpoints,u,v, \
00735     p,pu,pv,puu,puv,pvv,puuu,puuv,puvv,pvvv) \
00736   mbs_BCHornerDer3Pd ( degreeu, degreev, 3, (double*)ctlpoints, u, v, \
00737     (double*)p, (double*)pu, (double*)pv, (double*)puu, (double*)puv, \
00738     (double*)pvv, (double*)puuu, (double*)puuv, (double*)puvv, (double*)pvvv )
00739 #define mbs_BCHornerDer3P4d(degreeu,degreev,ctlpoints,u,v, \
00740     p,pu,pv,puu,puv,pvv,puuu,puuv,puvv,pvvv) \
00741   mbs_BCHornerDer3Pd ( degreeu, degreev, 4, (double*)ctlpoints, u, v, \
00742     (double*)p, (double*)pu, (double*)pv, (double*)puu, (double*)puv, \
00743     (double*)pvv, (double*)puuu, (double*)puuv, (double*)puvv, (double*)pvvv )
00744 
00745 
00746 void mbs_deBoorBasisd ( int degree, int lastknot, const double *knots,
00747                         double t, int *fnz, int *nnz, double *bfv );
00748 
00749 
00750 void mbs_multiBSCubicInterpd ( int lastinterpknot, double *interpknots,
00751                                int ncurves, int spdimen, int xpitch,
00752                                const double *x,
00753                                int ypitch,
00754                                char bcl, const double *ybcl,
00755                                char bcr, const double *ybcr,
00756                                int *lastbsknot, double *bsknots,
00757                                int bspitch, double *ctlpoints );
00758 
00759 void mbs_multiBSCubicClosedInterpd ( int lastinterpknot, double *interpknots,
00760                                int ncurves, int spdimen, int xpitch,
00761                                const double *x,
00762                                int *lastbsknot, double *bsknots,
00763                                int bspitch, double *ctlpoints );
00764 
00765 
00766 void mbs_BCFrenetC2d ( int degree, const point2d *ctlpoints, double t,
00767                        point2d *cpoint, vector2d *fframe, double *curvature );
00768 
00769 void mbs_BCFrenetC2Rd ( int degree, const point3d *ctlpoints, double t,
00770                         point2d *cpoint, vector2d *fframe, double *curvature );
00771 
00772 void mbs_BCFrenetC3d ( int degree, const point3d *ctlpoints, double t,
00773                        point3d *cpoint, vector3d *fframe, double *curvatures );
00774 
00775 void mbs_BCFrenetC3Rd ( int degree, const point4d *ctlpoints, double t,
00776                         point3d *cpoint, vector3d *fframe, double *curvatures );
00777 
00778 
00779 void mbs_FundFormsBP3d ( int degreeu, int degreev, const point3d *ctlpoints,
00780                          double u, double v,
00781                          double *firstform, double *secondform );
00782 
00783 void mbs_GMCurvaturesBP3d ( int degreeu, int degreev, const point3d *ctlpoints,
00784                             double u, double v,
00785                             double *gaussian, double *mean );
00786 
00787 void mbs_PrincipalDirectionsBP3d ( int degreeu, int degreev,
00788                                    const point3d *ctlpoints,
00789                                    double u, double v,
00790                                    double *k1, vector2d *v1,
00791                                    double *k2, vector2d *v2 );
00792 
00793 void mbs_FundFormsBP3Rd ( int degreeu, int degreev, const point4d *ctlpoints,
00794                           double u, double v,
00795                           double *firstform, double *secondform );
00796 
00797 void mbs_GMCurvaturesBP3Rd ( int degreeu, int degreev, const point4d *ctlpoints,
00798                              double u, double v,
00799                              double *gaussian, double *mean );
00800 
00801 void mbs_PrincipalDirectionsBP3Rd ( int degreeu, int degreev,
00802                                     const point4d *ctlpoints,
00803                                     double u, double v,
00804                                     double *k1, vector2d *v1,
00805                                     double *k2, vector2d *v2 );
00806 
00807 
00808 void mbs_multiBisectBezCurvesd ( int degree, int ncurves,
00809                                  int spdimen, int pitch,
00810                                  double *ctlp, double *ctlq );
00811 
00812 #define mbs_BisectBC1d(degree,ctlp,ctlq) \
00813   mbs_multiBisectBezCurvesd ( degree, 1, 1, 0, ctlp, ctlq )
00814 #define mbs_BisectBC2d(degree,ctlp,ctlq) \
00815   mbs_multiBisectBezCurvesd ( degree, 1, 2, 0, (double*)ctlp, (double*)ctlq )
00816 #define mbs_BisectBC3d(degree,ctlp,ctlq) \
00817   mbs_multiBisectBezCurvesd ( degree, 1, 3, 0, (double*)ctlp, (double*)ctlq )
00818 #define mbs_BisectBC4d(degree,ctlp,ctlq) \
00819   mbs_multiBisectBezCurvesd ( degree, 1, 4, 0, (double*)ctlp, (double*)ctlq )
00820 
00821 #define mbs_BisectBP1ud(degreeu,degreev,ctlp,ctlq) \
00822   mbs_multiBisectBezCurvesd ( degreeu, 1, (degreev+1), 0, ctlp, ctlq )
00823 #define mbs_BisectBP1vd(degreeu,degreev,ctlp,ctlq) \
00824   mbs_multiBisectBezCurvesd ( degreev, degreeu+1, 1, degreev+1, ctlp, ctlq )
00825 #define mbs_BisectBP2ud(degreeu,degreev,ctlp,ctlq) \
00826   mbs_multiBisectBezCurvesd ( degreeu, 1, 2*(degreev+1), 0, \
00827     (double*)ctlp, (double*)ctlq )
00828 #define mbs_BisectBP2vd(degreeu,degreev,ctlp,ctlq) \
00829   mbs_multiBisectBezCurvesd ( degreev, degreeu+1, 2, 2*(degreev+1), \
00830     (double*)ctlp, (double*)ctlq )
00831 #define mbs_BisectBP3ud(degreeu,degreev,ctlp,ctlq) \
00832   mbs_multiBisectBezCurvesd ( degreeu, 1, 3*(degreev+1), 0, \
00833     (double*)ctlp, (double*)ctlq )
00834 #define mbs_BisectBP3vd(degreeu,degreev,ctlp,ctlq) \
00835   mbs_multiBisectBezCurvesd ( degreev, degreeu+1, 3, 3*(degreev+1), \
00836     (double*)ctlp, (double*)ctlq )
00837 #define mbs_BisectBP4ud(degreeu,degreev,ctlp,ctlq) \
00838   mbs_multiBisectBezCurvesd ( degreeu, 1, 4*(degreev+1), 0, \
00839     (double*)ctlp, (double*)ctlq )
00840 #define mbs_BisectBP4vd(degreeu,degreev,ctlp,ctlq) \
00841   mbs_multiBisectBezCurvesd ( degreev, degreeu+1, 4, 4*(degreev+1), \
00842     (double*)ctlp, (double*)ctlq )
00843 
00844 
00845 void mbs_multiDivideBezCurvesd ( int degree, int ncurves,
00846                                  int spdimen, int pitch,
00847                                  double t,
00848                                  double *ctlp, double *ctlq );
00849 
00850 #define mbs_DivideBC1d(degree,t,ctlp,ctlq) \
00851   mbs_multiDivideBezCurvesd ( degree, 1, 1, 0, t, ctlp, ctlq )
00852 #define mbs_DivideBC2d(degree,t,ctlp,ctlq) \
00853   mbs_multiDivideBezCurvesd ( degree, 1, 2, 0, t, (double*)ctlp, (double*)ctlq )
00854 #define mbs_DivideBC3d(degree,t,ctlp,ctlq) \
00855   mbs_multiDivideBezCurvesd ( degree, 1, 3, 0, t, (double*)ctlp, (double*)ctlq )
00856 #define mbs_DivideBC4d(degree,t,ctlp,ctlq) \
00857   mbs_multiDivideBezCurvesd ( degree, 1, 4, 0, t, (double*)ctlp, (double*)ctlq )
00858 
00859 #define mbs_DivideBP1ud(degreeu,degreev,u,ctlp,ctlq) \
00860   mbs_multiDivideBezCurvesd ( degreeu, 1, (degreev+1), 0, u, ctlp, ctlq )
00861 #define mbs_DivideBP1vd(degreeu,degreev,v,ctlp,ctlq) \
00862   mbs_multiDivideBezCurvesd ( degreev, degreeu+1, 1, degreev+1, v, ctlp, ctlq )
00863 #define mbs_DivideBP2ud(degreeu,degreev,u,ctlp,ctlq) \
00864   mbs_multiDivideBezCurvesd ( degreeu, 1, 2*(degreev+1), 0, u, \
00865     (double*)ctlp, (double*)ctlq )
00866 #define mbs_DivideBP2vd(degreeu,degreev,v,ctlp,ctlq) \
00867   mbs_multiDivideBezCurvesd ( degreev, degreeu+1, 2, 2*(degreev+1), v, \
00868     (double*)ctlp, (double*)ctlq )
00869 #define mbs_DivideBP3ud(degreeu,degreev,u,ctlp,ctlq) \
00870   mbs_multiDivideBezCurvesd ( degreeu, 1, 3*(degreev+1), 0, u, \
00871     (double*)ctlp, (double*)ctlq )
00872 #define mbs_DivideBP3vd(degreeu,degreev,v,ctlp,ctlq) \
00873   mbs_multiDivideBezCurvesd ( degreev, degreeu+1, 3, 3*(degreev+1), v, \
00874     (double*)ctlp, (double*)ctlq )
00875 #define mbs_DivideBP4ud(degreeu,degreev,u,ctlp,ctlq) \
00876   mbs_multiDivideBezCurvesd ( degreeu, 1, 4*(degreev+1), 0, u, \
00877     (double*)ctlp, (double*)ctlq )
00878 #define mbs_DivideBP4vd(degreeu,degreev,v,ctlp,ctlq) \
00879   mbs_multiDivideBezCurvesd ( degreev, degreeu+1, 4, 4*(degreev+1), v, \
00880     (double*)ctlp, (double*)ctlq )
00881 
00882 #ifndef MULTIBS_H
00883 void mbs_BezP3NormalDeg ( int degreeu, int degreev, int *ndegu, int *ndegv );
00884 void mbs_BezP3RNormalDeg ( int degreeu, int degreev, int *ndegu, int *ndegv );
00885 #endif
00886 
00887 char mbs_BezP3Normald ( int degreeu, int degreev, const point3d *ctlpoints,
00888                          int *ndegu, int *ndegv, vector3d *ncp );
00889 
00890 char mbs_BezP3RNormald ( int degreeu, int degreev, const point4d *ctlpoints,
00891                           int *ndegu, int *ndegv, vector3d *ncp );
00892 
00893 boolean mbs_ApproxBSKnotsValidd ( int degree, int lastknot, const double *knots,
00894                                   int lastiknot, const double *iknots );
00895 
00896 int mbs_ApproxBSBandmSized ( int degree, const double *knots,
00897                              int lastiknot, const double *iknots );
00898 
00899 boolean mbs_ConstructApproxBSProfiled ( int degree, int lastknot,
00900                                         const double *knots,
00901                                         int lastiknot, const double *iknots,
00902                                         bandm_profile *prof );
00903 
00904 boolean mbs_ConstructApproxBSMatrixd ( int degree, int lastknot,
00905                                        const double *knots,
00906                                        int lastiknot, const double *iknots,
00907                                        int *nrows, int *ncols,
00908                                        bandm_profile *prof,
00909                                        double *a );
00910 
00911 
00912 boolean mbs_multiConstructApproxBSCd ( int degree, int lastknot,
00913                                        const double *knots,
00914                                        int lastpknot, const double *pknots,
00915                                        int ncurves, int spdimen,
00916                                        int ppitch, const double *ppoints,
00917                                        int bcpitch, double *ctlpoints );
00918 
00919 #define mbs_ConstructApproxBSC1d(degree,lastknot,knots,lastpknot,pknots,\
00920     ppoints,ctlpoints) \
00921   mbs_multiConstructApproxBSCd (degree,lastknot,knots,lastpknot,pknots,1,1,0,\
00922     (double*)ppoints,0,(double*)ctlpoints)
00923 #define mbs_ConstructApproxBSC2d(degree,lastknot,knots,lastpknot,pknots,\
00924     ppoints,ctlpoints) \
00925   mbs_multiConstructApproxBSCd (degree,lastknot,knots,lastpknot,pknots,1,2,0,\
00926     (double*)ppoints,0,(double*)ctlpoints)
00927 #define mbs_ConstructApproxBSC3d(degree,lastknot,knots,lastpknot,pknots,\
00928     ppoints,ctlpoints) \
00929   mbs_multiConstructApproxBSCd (degree,lastknot,knots,lastpknot,pknots,1,3,0,\
00930     (double*)ppoints,0,(double*)ctlpoints)
00931 #define mbs_ConstructApproxBSC4d(degree,lastknot,knots,lastpknot,pknots,\
00932     ppoints,ctlpoints) \
00933   mbs_multiConstructApproxBSCd (degree,lastknot,knots,lastpknot,pknots,1,4,0,\
00934     (double*)ppoints,0,(double*)ctlpoints)
00935 
00936 
00937 boolean mbs_OsloKnotsCorrectd ( int lastuknot, const double *uknots,
00938                                 int lastvknot, const double *vknots );
00939 
00940 int mbs_BuildOsloMatrixProfiled ( int degree,
00941                                   int lastuknot, const double *uknots,
00942                                   int lastvknot, const double *vknots,
00943                                   bandm_profile *prof );
00944 void mbs_BuildOsloMatrixd ( int degree, int lastuknot, const double *uknots,
00945                             const double *vknots,
00946                             const bandm_profile *prof, double *a );
00947 
00948 
00949 void mbs_multiOsloInsertKnotsd ( int ncurves, int spdimen, int degree,
00950                                  int inlastknot, const double *inknots,
00951                                  int inpitch, double *inctlpoints,
00952                                  int outlastknot, const double *outknots,
00953                                  int outpitch, double *outctlpoints );
00954 
00955 void mbs_multiOsloRemoveKnotsLSQd ( int ncurves, int spdimen, int degree,
00956                                     int inlastknot, const double *inknots,
00957                                     int inpitch, double *inctlpoints,
00958                                     int outlastknot, const double *outknots,
00959                                     int outpitch, double *outctlpoints );
00960 
00961 
00962 void mbs_multiBSChangeLeftKnotsd ( int ncurves, int spdimen, int degree,
00963                                    double *knots, int pitch, double *ctlpoints,
00964                                    double *newknots );
00965 
00966 void mbs_multiBSChangeRightKnotsd ( int ncurves, int spdimen, int degree, 
00967                                     int lastknot, double *knots,  
00968                                     int pitch, double *ctlpoints, 
00969                                     double *newknots );
00970 
00971 #define mbs_BSChangeLeftKnotsC1d(degree,knots,coeff,newknots) \
00972   mbs_multiBSChangeLeftKnotsd(1,1,degree,knots,0,coeff,newknots)
00973 #define mbs_BSChangeLeftKnotsC2d(degree,knots,ctlpoints,newknots) \
00974   mbs_multiBSChangeLeftKnotsd(1,2,degree,knots,0,(double*)ctlpoints,newknots)
00975 #define mbs_BSChangeLeftKnotsC3d(degree,knots,ctlpoints,newknots) \
00976   mbs_multiBSChangeLeftKnotsd(1,3,degree,knots,0,(double*)ctlpoints,newknots)
00977 #define mbs_BSChangeLeftKnotsC4d(degree,knots,ctlpoints,newknots) \
00978   mbs_multiBSChangeLeftKnotsd(1,4,degree,knots,0,(double*)ctlpoints,newknots)
00979 #define mbs_BSChangeRightKnotsC1d(degree,lastknot,knots,coeff,newknots) \
00980   mbs_multiBSChangeRightKnotsd(1,1,degree,lastknot,knots,0,coeff,newknots)
00981 #define mbs_BSChangeRightKnotsC2d(degree,lastknot,knots,ctlpoints,newknots) \
00982   mbs_multiBSChangeRightKnotsd(1,2,degree,lastknot,knots,0,(double*)ctlpoints,newknots)
00983 #define mbs_BSChangeRightKnotsC3d(degree,lastknot,knots,ctlpoints,newknots) \
00984   mbs_multiBSChangeRightKnotsd(1,3,degree,lastknot,knots,0,(double*)ctlpoints,newknots)
00985 #define mbs_BSChangeRightKnotsC4d(degree,lastknot,knots,ctlpoints,newknots) \
00986   mbs_multiBSChangeRightKnotsd(1,4,degree,lastknot,knots,0,(double*)ctlpoints,newknots)
00987 
00988 
00989 typedef struct {
00990     boolean closing;
00991     byte    spdimen;
00992     short   degree;
00993     short   lastknot;
00994     double   *knots;
00995     double   *points;
00996   } polycurved;
00997 
00998 typedef struct {
00999     double t;             /* this must be the first field */
01000     char  sign1, sign2;
01001   } signpoint1d;
01002 
01003 int  mbs_TrimCVBoundSized ( int nelem, const polycurved *bound );
01004 
01005 void *mbs_CompileTrimPatchBoundd ( int nelem, const polycurved *bound,
01006                                    void *buffer );
01007 
01008 void mbs_FindBoundLineIntersectionsd ( const void *bound,
01009                                        const point2d *p0, double t0,
01010                                        const point2d* p1, double t1,
01011                                        signpoint1d *inters, int *ninters );
01012 
01013 void mbs_DrawTrimBSPatchDomd ( int degu, int lastuknot, const double *uknots,
01014                                int degv, int lastvknot, const double *vknots,
01015                                int nelem, const polycurved *bound,
01016                                int nu, double au, double bu,
01017                                int nv, double av, double bv,
01018                                int maxinters,
01019                                void (*NotifyLine)(char,int,point2d*,point2d*),
01020                                void (*DrawLine)(point2d*,point2d*,int),
01021                                void (*DrawCurve)(int,int,const double*) );
01022 
01023 
01024 boolean mbs_MonotonicPolylined ( int spdimen, int npoints, int pitch,
01025                                  const double *points, const double *v );
01026 
01027 boolean mbs_MonotonicPolylineRd ( int spdimen, int npoints, int pitch,
01028                                   const double *points, const double *v );
01029 
01030 
01031 void mbs_RasterizeBC2d ( int degree, const point2d *cpoints,
01032                          void (*output)(const xpoint *buf, int n),
01033                          boolean outlast );
01034 
01035 void mbs_RasterizeBC2Rd ( int degree, const point3d *cpoints,
01036                           void (*output)(const xpoint *buf, int n),
01037                           boolean outlast );
01038 
01039 void mbs_RasterizeBS2d ( int degree, int lastknot, const double *knots,
01040                          const point2d *cpoints,
01041                          void (*output)(const xpoint *buf, int n),
01042                          boolean outlast );
01043 
01044 void mbs_RasterizeBS2Rd ( int degree, int lastknot, const double *knots,
01045                           const point3d *cpoints,
01046                           void (*output)(const xpoint *buf, int n),
01047                           boolean outlast );
01048 
01049 
01050 void mbs_multiInterp2knHermiteBezd ( int ncurves, int spdimen, int degree,
01051                                      int nlbc, int lbcpitch, const double *lbc,
01052                                      int nrbc, int rbcpitch, const double *rbc,
01053                                      int pitch, double *ctlpoints );
01054 
01055 void mbs_multiInterp2knHermiteBSd ( int ncurves, int spdimen, int degree,
01056                                     int lastknot, const double *knots,
01057                                     int nlbc, int lbcpitch, const double *lbc, 
01058                                     int nrbc, int rbcpitch, const double *rbc, 
01059                                     int pitch, double *ctlpoints );
01060 
01061 
01062 void mbs_multiFindBezDerivatived ( int degree, int ncurves, int spdimen,
01063                                    int pitch, const double *ctlpoints,  
01064                                    int dpitch, double *dctlpoints );
01065 
01066 #define mbs_FindBezDerivativeC1d(degree,coeff,dcoeff) \
01067   mbs_multiFindBezDerivatived ( degree, 1, 1, 0, coeff, 0, dcoeff )
01068 #define mbs_FindBezDerivativeC2d(degree,ctlpoints,dctlpoints) \
01069   mbs_multiFindBezDerivatived ( degree, 1, 2, 0, (double*)ctlpoints, \
01070     0, (double*)dctlpoints )
01071 #define mbs_FindBezDerivativeC3d(degree,ctlpoints,dctlpoints) \
01072   mbs_multiFindBezDerivatived ( degree, 1, 3, 0, (double*)ctlpoints, \
01073     0, (double*)dctlpoints )
01074 #define mbs_FindBezDerivativeC4d(degree,ctlpoints,dctlpoints) \
01075   mbs_multiFindBezDerivatived ( degree, 1, 4, 0, (double*)ctlpoints, \
01076     0, (double*)dctlpoints )
01077 
01078 
01079 void mbs_multiFindBSDerivatived ( int degree, int lastknot, const double *knots, 
01080                                   int ncurves, int spdimen,  
01081                                   int pitch, const double *ctlpoints,  
01082                                   int *lastdknot, double *dknots,  
01083                                   int dpitch, double *dctlpoints );
01084 
01085 #define mbs_FindBSDerivativeC1d(degree,lastknot,knots,coeff, \
01086     lastdknot,dknots,dcoeff) \
01087   mbs_multiFindBSDerivatived ( degree, lastknot, knots, 1, 1, 0, coeff, \
01088     lastdknot, dknots, 0, dcoeff )
01089 #define mbs_FindBSDerivativeC2d(degree,lastknot,knots,ctlpoints, \
01090     lastdknot,dknots,dctlpoints) \
01091   mbs_multiFindBSDerivatived ( degree, lastknot, knots, 1, 2, 0, \
01092     (double*)ctlpoints, lastdknot, dknots, 0, (double*)dctlpoints )
01093 #define mbs_FindBSDerivativeC3d(degree,lastknot,knots,ctlpoints, \
01094     lastdknot,dknots,dctlpoints) \
01095   mbs_multiFindBSDerivatived ( degree, lastknot, knots, 1, 3, 0, \
01096     (double*)ctlpoints, lastdknot, dknots, 0, (double*)dctlpoints )
01097 #define mbs_FindBSDerivativeC4d(degree,lastknot,knots,ctlpoints, \
01098     lastdknot,dknots,dctlpoints) \
01099   mbs_multiFindBSDerivatived ( degree, lastknot, knots, 1, 4, 0, \
01100     (double*)ctlpoints, lastdknot, dknots, 0, (double*)dctlpoints )
01101 
01102 
01103 boolean mbs_FindBSCommonKnotSequenced ( int *degree, int *lastknot,
01104             double **knots, int nsequences, ... );
01105 boolean mbs_multiAdjustBSCRepd ( int ncurves, int spdimen,
01106      int indegree, int inlastknot, const double *inknots,
01107      int inpitch, const double *inctlpoints,
01108      int outdegree, int outlastknot, CONST_ double *outknots,
01109      int outpitch, double *outctlpoints );
01110 
01111 #define mbs_AdjustBSCRepC1d(indegree,inlastknot,inknots, \
01112     inctlpoints,outdegree,outlastknot,outknots,outctlpoints) \
01113   mbs_multiAdjustBSCRepd (1,1,indegree,inlastknot,inknots,0, \
01114     inctlpoints,outdegree,outlastknot,outknots,0,outctlpoints)
01115 #define mbs_AdjustBSCRepC2d(indegree,inlastknot,inknots, \
01116     inctlpoints,outdegree,outlastknot,outknots,outctlpoints) \
01117   mbs_multiAdjustBSCRepd (1,2,indegree,inlastknot,inknots,0, \
01118     (double*)inctlpoints,outdegree,outlastknot,outknots,0,(double*)outctlpoints)
01119 #define mbs_AdjustBSCRepC3d(indegree,inlastknot,inknots, \
01120     inctlpoints,outdegree,outlastknot,outknots,outctlpoints) \
01121   mbs_multiAdjustBSCRepd (1,3,indegree,inlastknot,inknots,0, \
01122     (double*)inctlpoints,outdegree,outlastknot,outknots,0,(double*)outctlpoints)
01123 #define mbs_AdjustBSCRepC4d(indegree,inlastknot,inknots, \
01124     inctlpoints,outdegree,outlastknot,outknots,outctlpoints) \
01125   mbs_multiAdjustBSCRepd (1,4,indegree,inlastknot,inknots,0, \
01126     (double*)inctlpoints,outdegree,outlastknot,outknots,0,(double*)outctlpoints)
01127 
01128 
01129 void mbs_multiAddBSCurvesd ( int ncurves, int spdimen,
01130                              int degree1, int lastknot1, CONST_ double *knots1,
01131                              int pitch1, CONST_ double *ctlpoints1,
01132                              int degree2, int lastknot2, CONST_ double *knots2,
01133                              int pitch2, CONST_ double *ctlpoints2,
01134                              int *sumdeg, int *sumlastknot, double *sumknots,
01135                              int sumpitch, double *sumctlpoints );
01136 
01137 #define mbs_AddBSCurvesC1d(degree1,lastknot1,knots1,ctlpoints1, \
01138     degree2,lastknot2,knots2,ctlpoints2, \
01139     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01140   mbs_multiAddBSCurvesd (1,1,degree1,lastknot1,knots1,0,ctlpoints1, \
01141     degree2,lastknot2,knots2,0,ctlpoints2, \
01142     sumdeg,sumlastknot,sumknots,0,sumctlpoints)
01143 #define mbs_AddBSCurvesC2d(degree1,lastknot1,knots1,ctlpoints1, \
01144     degree2,lastknot2,knots2,ctlpoints2, \
01145     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01146   mbs_multiAddBSCurvesd (1,2,degree1,lastknot1,knots1,0,(double*)ctlpoints1, \
01147     degree2,lastknot2,knots2,0,(double*)ctlpoints2, \
01148     sumdeg,sumlastknot,sumknots,0,(double*)sumctlpoints)
01149 #define mbs_AddBSCurvesC3d(degree1,lastknot1,knots1,ctlpoints1, \
01150     degree2,lastknot2,knots2,ctlpoints2, \
01151     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01152   mbs_multiAddBSCurvesd (1,3,degree1,lastknot1,knots1,0,(double*)ctlpoints1, \
01153     degree2,lastknot2,knots2,0,(double*)ctlpoints2, \
01154     sumdeg,sumlastknot,sumknots,0,(double*)sumctlpoints)
01155 #define mbs_AddBSCurvesC4d(degree1,lastknot1,knots1,ctlpoints1, \
01156     degree2,lastknot2,knots2,ctlpoints2, \
01157     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01158   mbs_multiAddBSCurvesd (1,4,degree1,lastknot1,knots1,0,(double*)ctlpoints1, \
01159     degree2,lastknot2,knots2,0,(double*)ctlpoints2, \
01160     sumdeg,sumlastknot,sumknots,0,(double*)sumctlpoints)
01161 
01162 
01163 void mbs_multiSubtractBSCurvesd ( int ncurves, int spdimen,
01164                              int degree1, int lastknot1, CONST_ double *knots1,
01165                              int pitch1, CONST_ double *ctlpoints1,
01166                              int degree2, int lastknot2, CONST_ double *knots2,
01167                              int pitch2, CONST_ double *ctlpoints2,
01168                              int *sumdeg, int *sumlastknot, double *sumknots,
01169                              int sumpitch, double *sumctlpoints );
01170 
01171 #define mbs_SubtractBSCurvesC1d(degree1,lastknot1,knots1,ctlpoints1, \
01172     degree2,lastknot2,knots2,ctlpoints2, \
01173     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01174   mbs_multiSubtractBSCurvesd (1,1,degree1,lastknot1,knots1,0,ctlpoints1, \
01175     degree2,lastknot2,knots2,0,ctlpoints2, \
01176     sumdeg,sumlastknot,sumknots,0,sumctlpoints)
01177 #define mbs_SubtractBSCurvesC2d(degree1,lastknot1,knots1,ctlpoints1, \
01178     degree2,lastknot2,knots2,ctlpoints2, \
01179     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01180   mbs_multiSubtractBSCurvesd (1,2,degree1,lastknot1,knots1,0,(double*)ctlpoints1, \
01181     degree2,lastknot2,knots2,0,(double*)ctlpoints2, \
01182     sumdeg,sumlastknot,sumknots,0,(double*)sumctlpoints)
01183 #define mbs_SubtractBSCurvesC3d(degree1,lastknot1,knots1,ctlpoints1, \
01184     degree2,lastknot2,knots2,ctlpoints2, \
01185     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01186   mbs_multiSubtractBSCurvesd (1,3,degree1,lastknot1,knots1,0,(double*)ctlpoints1, \
01187     degree2,lastknot2,knots2,0,(double*)ctlpoints2, \
01188     sumdeg,sumlastknot,sumknots,0,(double*)sumctlpoints)
01189 #define mbs_SubtractBSCurvesC4d(degree1,lastknot1,knots1,ctlpoints1, \
01190     degree2,lastknot2,knots2,ctlpoints2, \
01191     sumdeg,sumlastknot,sumknots,sumctlpoints) \
01192   mbs_multiSubtractBSCurvesd (1,4,degree1,lastknot1,knots1,0,(double*)ctlpoints1, \
01193     degree2,lastknot2,knots2,0,(double*)ctlpoints2, \
01194     sumdeg,sumlastknot,sumknots,0,(double*)sumctlpoints)
01195 
01196 
01197 boolean mbs_FindPolynomialZerosd ( int degree, const double *coeff,
01198                                    int *nzeros, double *zeros, double eps );
01199 
01200 
01201 void mbs_ClipBC2d ( int ncplanes, const vector3d *cplanes,
01202                     int degree, const point2d *cpoints,
01203                     void (*output) (int degree, const point2d *cpoints) );               
01204 void mbs_ClipBC2Rd ( int ncplanes, const vector3d *cplanes,
01205                      int degree, const point3d *cpoints,   
01206                      void (*output) (int degree, const point3d *cpoints) );
01207 void mbs_ClipBC3d ( int ncplanes, const vector4d *cplanes,
01208                     int degree, const point3d *cpoints,   
01209                     void (*output) (int degree, const point3d *cpoints) );
01210 void mbs_ClipBC3Rd ( int ncplanes, const vector4d *cplanes,
01211                      int degree, const point4d *cpoints,
01212                      void (*output) (int degree, const point4d *cpoints) );
01213 
01214 /* ///////////////////////////////////////////////////////////////////////// */
01215 /* Bicubic polynomial Coons patches */
01216 void mbs_BezC1CoonsFindCornersd ( int spdimen,
01217                                   int degc00, const double *c00,
01218                                   int degc01, const double *c01,
01219                                   int degc10, const double *c10,
01220                                   int degc11, const double *c11,
01221                                   double *pcorners );
01222 boolean mbs_BezC1CoonsToBezd ( int spdimen,
01223                                int degc00, const double *c00,
01224                                int degc01, const double *c01,
01225                                int degc10, const double *c10,
01226                                int degc11, const double *c11,
01227                                int degd00, const double *d00,
01228                                int degd01, const double *d01,
01229                                int degd10, const double *d10,
01230                                int degd11, const double *d11,
01231                                int *n, int *m, double *p );
01232 
01233 void mbs_TabCubicHFuncDer2d ( double a, double b, int nkn, const double *kn,
01234                               double *hfunc, double *dhfunc, double *ddhfunc );
01235 void mbs_TabCubicHFuncDer3d ( double a, double b, int nkn, const double *kn, 
01236                               double *hfunc, double *dhfunc, double *ddhfunc,
01237                               double *dddhfunc );
01238 void mbs_TabBezCurveDer2d ( int spdimen, int degree, const double *cp,
01239                             int nkn, const double *kn,
01240                             int ppitch,
01241                             double *p, double *dp, double *ddp );
01242 boolean _mbs_TabBezC1Coonsd ( int spdimen, int nknu, int nknv,
01243                    const double *c, const double *d, const double *p,
01244                    const double *hu, const double *hv, double *pp );
01245 boolean mbs_TabBezC1CoonsDer2d ( int spdimen,
01246       int nknu, const double *knu, const double *hfuncu,
01247       const double *dhfuncu, const double *ddhfuncu,
01248       int nknv, const double *knv, const double *hfuncv,
01249       const double *dhfuncv, const double *ddhfuncv,
01250       int degc00, const double *c00,
01251       int degc01, const double *c01,
01252       int degc10, const double *c10,
01253       int degc11, const double *c11,
01254       int degd00, const double *d00,
01255       int degd01, const double *d01,
01256       int degd10, const double *d10,
01257       int degd11, const double *d11,
01258       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv );
01259 boolean mbs_TabBezC1CoonsDer3d ( int spdimen,
01260       int nknu, const double *knu, const double *hfuncu,
01261       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01262       int nknv, const double *knv, const double *hfuncv,
01263       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01264       int degc00, const double *c00,
01265       int degc01, const double *c01,
01266       int degc10, const double *c10,
01267       int degc11, const double *c11,
01268       int degd00, const double *d00,
01269       int degd01, const double *d01,
01270       int degd10, const double *d10,
01271       int degd11, const double *d11,
01272       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,
01273       double *puuu, double *puuv, double *puvv, double *pvvv );
01274 
01275 boolean _mbs_TabBezC1Coons0d (
01276                    int spdimen, int nknu, int nknv,
01277                    const double *c, const double *d, const double *p,
01278                    const double *hu, const double *hv, double *pp );
01279 boolean mbs_TabBezC1Coons0Der2d ( int spdimen,
01280       int nknu, const double *knu, const double *hfuncu,
01281       const double *dhfuncu, const double *ddhfuncu,
01282       int nknv, const double *knv, const double *hfuncv,
01283       const double *dhfuncv, const double *ddhfuncv,
01284       int degc00, const double *c00,
01285       int degc01, const double *c01,
01286       int degd00, const double *d00,
01287       int degd01, const double *d01,
01288       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv );
01289 boolean mbs_TabBezC1Coons0Der3d ( int spdimen,
01290       int nknu, const double *knu, const double *hfuncu,
01291       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01292       int nknv, const double *knv, const double *hfuncv,
01293       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01294       int degc00, const double *c00,
01295       int degc01, const double *c01,
01296       int degd00, const double *d00,
01297       int degd01, const double *d01,
01298       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,
01299       double *puuu, double *puuv, double *puvv, double *pvvv );
01300 
01301 /* ///////////////////////////////////////////////////////////////////////// */
01302 /* Biquintic polynomial Coons patches */
01303 void mbs_BezC2CoonsFindCornersd ( int spdimen,
01304                                   int degc00, const double *c00,
01305                                   int degc01, const double *c01,
01306                                   int degc02, const double *c02,
01307                                   int degc10, const double *c10,
01308                                   int degc11, const double *c11,
01309                                   int degc12, const double *c12,
01310                                   double *pcorners );
01311 boolean mbs_BezC2CoonsToBezd ( int spdimen,
01312                                int degc00, const double *c00,
01313                                int degc01, const double *c01,
01314                                int degc02, const double *c02,
01315                                int degc10, const double *c10,
01316                                int degc11, const double *c11,
01317                                int degc12, const double *c12,
01318                                int degd00, const double *d00,
01319                                int degd01, const double *d01,
01320                                int degd02, const double *d02,
01321                                int degd10, const double *d10,
01322                                int degd11, const double *d11,
01323                                int degd12, const double *d12,
01324                                int *n, int *m, double *p );
01325 void mbs_TabQuinticHFuncDer3d ( double a, double b, int nkn, const double *kn,
01326                                 double *hfunc, double *dhfunc,
01327                                 double *ddhfunc, double *dddhfunc );
01328 void mbs_TabBezCurveDer3d ( int spdimen, int degree, const double *cp,
01329                             int nkn, const double *kn,
01330                             int ppitch,
01331                             double *p, double *dp, double *ddp, double *dddp );
01332 boolean _mbs_TabBezC2Coonsd (
01333                    int spdimen, int nknu, int nknv,
01334                    const double *c, const double *d, const double *p,
01335                    const double *hu, const double *hv, double *pp );
01336 
01337 boolean mbs_TabBezC2CoonsDer3d ( int spdimen,
01338       int nknu, const double *knu, const double *hfuncu,
01339       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01340       int nknv, const double *knv, const double *hfuncv,
01341       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01342       int degc00, const double *c00,
01343       int degc01, const double *c01,
01344       int degc02, const double *c02,
01345       int degc10, const double *c10,
01346       int degc11, const double *c11,
01347       int degc12, const double *c12,
01348       int degd00, const double *d00,
01349       int degd01, const double *d01,
01350       int degd02, const double *d02,
01351       int degd10, const double *d10,
01352       int degd11, const double *d11,
01353       int degd12, const double *d12,
01354       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,
01355       double *puuu, double *puuv, double *puvv, double *pvvv );
01356 
01357 boolean _mbs_TabBezC2Coons0d (
01358                    int spdimen, int nknu, int nknv,
01359                    const double *c, const double *d, const double *p,
01360                    const double *hu, const double *hv, double *pp );
01361 boolean mbs_TabBezC2Coons0Der3d ( int spdimen,
01362       int nknu, const double *knu, const double *hfuncu,
01363       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01364       int nknv, const double *knv, const double *hfuncv,
01365       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01366       int degc00, const double *c00,
01367       int degc01, const double *c01,
01368       int degc02, const double *c02,
01369       int degd00, const double *d00,
01370       int degd01, const double *d01,
01371       int degd02, const double *d02,
01372       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,
01373       double *puuu, double *puuv, double *puvv, double *pvvv );
01374 
01375 
01376 /* ///////////////////////////////////////////////////////////////////////// */
01377 /* Bicubic B-spline Coons patches */          
01378 void mbs_BSC1CoonsFindCornersd ( int spdimen,
01379           int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01380           int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01381           int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01382           int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01383           double *pcorners );
01384 boolean mbs_BSC1CoonsToBSd ( int spdimen,
01385       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01386       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01387       int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01388       int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01389       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01390       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01391       int degd10, int lastknotd10, const double *knotsd10, const double *d10,
01392       int degd11, int lastknotd11, const double *knotsd11, const double *d11,
01393       int *degreeu, int *lastuknot, double *uknots,
01394       int *degreev, int *lastvknot, double *vknots, double *p );
01395 
01396 void mbs_TabBSCurveDer2d ( int spdimen, int degree, int lastknot,
01397                            const double *knots, const double *cp,
01398                            int nkn, const double *kn, int ppitch,
01399                            double *p, double *dp, double *ddp );
01400 boolean _mbs_TabBSC1Coonsd ( int spdimen, int nknu, int nknv,
01401                    const double *c, const double *d, const double *p,
01402                    const double *hu, const double *hv, double *pp );
01403 boolean mbs_TabBSC1CoonsDer2d ( int spdimen,
01404       int nknu, const double *knu, const double *hfuncu,
01405       const double *dhfuncu, const double *ddhfuncu,
01406       int nknv, const double *knv, const double *hfuncv,
01407       const double *dhfuncv, const double *ddhfuncv,
01408       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01409       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01410       int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01411       int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01412       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01413       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01414       int degd10, int lastknotd10, const double *knotsd10, const double *d10,
01415       int degd11, int lastknotd11, const double *knotsd11, const double *d11,
01416       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv );
01417 boolean mbs_TabBSC1CoonsDer3d ( int spdimen,
01418       int nknu, const double *knu, const double *hfuncu,
01419       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01420       int nknv, const double *knv, const double *hfuncv,
01421       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01422       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01423       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01424       int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01425       int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01426       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01427       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01428       int degd10, int lastknotd10, const double *knotsd10, const double *d10,
01429       int degd11, int lastknotd11, const double *knotsd11, const double *d11,
01430       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,   
01431       double *puuu, double *puuv, double *puvv, double *pvvv );
01432 
01433 boolean _mbs_TabBSC1Coons0d ( int spdimen, int nknu, int nknv,
01434                    const double *c, const double *d, const double *p,
01435                    const double *hu, const double *hv, double *pp );
01436 boolean mbs_TabBSC1Coons0Der2d ( int spdimen,
01437       int nknu, const double *knu, const double *hfuncu,
01438       const double *dhfuncu, const double *ddhfuncu,
01439       int nknv, const double *knv, const double *hfuncv,
01440       const double *dhfuncv, const double *ddhfuncv,
01441       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01442       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01443       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01444       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01445       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv );
01446 boolean mbs_TabBSC1Coons0Der3d ( int spdimen,
01447       int nknu, const double *knu, const double *hfuncu,
01448       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01449       int nknv, const double *knv, const double *hfuncv,
01450       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01451       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01452       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01453       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01454       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01455       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,   
01456       double *puuu, double *puuv, double *puvv, double *pvvv );
01457 
01458 /* ///////////////////////////////////////////////////////////////////////// */
01459 /* Biquintic B-spline Coons patches */        
01460 void mbs_BSC2CoonsFindCornersd ( int spdimen,
01461           int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01462           int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01463           int degc02, int lastknotc02, const double *knotsc02, const double *c02,
01464           int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01465           int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01466           int degc12, int lastknotc12, const double *knotsc12, const double *c12,
01467           double *pcorners );
01468 boolean mbs_BSC2CoonsToBSd ( int spdimen,
01469       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01470       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01471       int degc02, int lastknotc02, const double *knotsc02, const double *c02,
01472       int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01473       int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01474       int degc12, int lastknotc12, const double *knotsc12, const double *c12,
01475       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01476       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01477       int degd02, int lastknotd02, const double *knotsd02, const double *d02,
01478       int degd10, int lastknotd10, const double *knotsd10, const double *d10,
01479       int degd11, int lastknotd11, const double *knotsd11, const double *d11,
01480       int degd12, int lastknotd12, const double *knotsd12, const double *d12,
01481       int *degreeu, int *lastuknot, double *uknots,
01482       int *degreev, int *lastvknot, double *vknots, double *p );
01483 void mbs_TabBSCurveDer3d ( int spdimen, int degree, int lastknot,
01484                            const double *knots, const double *cp,
01485                            int nkn, const double *kn, int ppitch,
01486                            double *p, double *dp, double *ddp, double *dddp );
01487 boolean _mbs_TabBSC2Coonsd ( int spdimen, int nknu, int nknv,
01488                    const double *c, const double *d, const double *p,
01489                    const double *hu, const double *hv, double *pp );
01490 boolean mbs_TabBSC2CoonsDer3d ( int spdimen,
01491       int nknu, const double *knu, const double *hfuncu,
01492       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01493       int nknv, const double *knv, const double *hfuncv,
01494       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01495       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01496       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01497       int degc02, int lastknotc02, const double *knotsc02, const double *c02,
01498       int degc10, int lastknotc10, const double *knotsc10, const double *c10,
01499       int degc11, int lastknotc11, const double *knotsc11, const double *c11,
01500       int degc12, int lastknotc12, const double *knotsc12, const double *c12,
01501       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01502       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01503       int degd02, int lastknotd02, const double *knotsd02, const double *d02,
01504       int degd10, int lastknotd10, const double *knotsd10, const double *d10,
01505       int degd11, int lastknotd11, const double *knotsd11, const double *d11,
01506       int degd12, int lastknotd12, const double *knotsd12, const double *d12,
01507       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,
01508       double *puuu, double *puuv, double *puvv, double *pvvv );
01509 boolean _mbs_TabBSC2Coons0d ( int spdimen, int nknu, int nknv,
01510                    const double *c, const double *d, const double *p,
01511                    const double *hu, const double *hv, double *pp );
01512 boolean mbs_TabBSC2Coons0Der3d ( int spdimen,
01513       int nknu, const double *knu, const double *hfuncu,
01514       const double *dhfuncu, const double *ddhfuncu, const double *dddhfuncu,
01515       int nknv, const double *knv, const double *hfuncv,
01516       const double *dhfuncv, const double *ddhfuncv, const double *dddhfuncv,
01517       int degc00, int lastknotc00, const double *knotsc00, const double *c00,
01518       int degc01, int lastknotc01, const double *knotsc01, const double *c01,
01519       int degc02, int lastknotc02, const double *knotsc02, const double *c02,
01520       int degd00, int lastknotd00, const double *knotsd00, const double *d00,
01521       int degd01, int lastknotd01, const double *knotsd01, const double *d01,
01522       int degd02, int lastknotd02, const double *knotsd02, const double *d02,
01523       double *p, double *pu, double *pv, double *puu, double *puv, double *pvv,
01524       double *puuu, double *puuv, double *puvv, double *pvvv );
01525 
01526 
01527 /* ///////////////////////////////////////////////////////////////////////// */
01528 /* spherical product of two curves */
01529 void mbs_SphericalProductd (
01530                 int degree_eq, int lastknot_eq, const point2d *cpoints_eq,
01531                 int degree_mer, int lastknot_mer, const point2d *cpoints_mer,
01532                 int pitch, point3d *spr_cp );
01533 void mbs_SphericalProductRd (
01534                 int degree_eq, int lastknot_eq, const point3d *cpoints_eq,
01535                 int degree_mer, int lastknot_mer, const point3d *cpoints_mer,
01536                 int pitch, point4d *spr_cp );
01537 
01538 /* ///////////////////////////////////////////////////////////////////////// */
01539 /* Lane-Riesenfeld algorithm */
01540 boolean mbs_multiLaneRiesenfeldd ( int spdimen, int ncurves, int degree,
01541                          int inlastknot, int inpitch, const double *incp,
01542                          int *outlastknot, int outpitch, double *outcp );
01543 
01544 #define mbs_LaneRiesenfeldC1d(degree,inlastknot,incp,outlastknot,outcp) \
01545   mbs_multiLaneRiesenfeldd ( 1, 1, degree, inlastknot, 0, incp, \
01546     outlastknot, 0, outcp )
01547 #define mbs_LaneRiesenfeldC2d(degree,inlastknot,incp,outlastknot,outcp) \
01548   mbs_multiLaneRiesenfeldd ( 2, 1, degree, inlastknot, 0, (double*)incp, \
01549     outlastknot, 0, (double*)outcp )
01550 #define mbs_LaneRiesenfeldC3d(degree,inlastknot,incp,outlastknot,outcp) \
01551   mbs_multiLaneRiesenfeldd ( 3, 1, degree, inlastknot, 0, (double*)incp, \
01552     outlastknot, 0, (double*)outcp )
01553 #define mbs_LaneRiesenfeldC4d(degree,inlastknot,incp,outlastknot,outcp) \
01554   mbs_multiLaneRiesenfeldd ( 4, 1, degree, inlastknot, 0, (double*)incp, \
01555     outlastknot, 0, (double*)outcp )
01556 
01557 
01558 #ifdef __cplusplus
01559 }
01560 #endif
01561 
01562 #endif /*MULTIBSD_H*/
01563