# HG changeset patch # User cdf # Date 1331234280 0 # Node ID c63293fe59a3b24aca09842ae7b593d5bbcbdc5d # Parent 6fada437981da1b2518bfdfd7bd574c1ec5155cf improved onebasisfunder__ diff -r 6fada437981d -r c63293fe59a3 extra/nurbs/src/tbasisfun.cc --- a/extra/nurbs/src/tbasisfun.cc Thu Mar 08 18:49:45 2012 +0000 +++ b/extra/nurbs/src/tbasisfun.cc Thu Mar 08 19:18:00 2012 +0000 @@ -18,86 +18,114 @@ #include #include -double onebasisfun__ (double u, octave_idx_type p, RowVector U) +void onebasisfun__ (double u, octave_idx_type p, RowVector U, double *N) { - - //std::cout << "u=" << u << " " << "p=" << p << " \n" << "U=" << U; - - double N = 0.0; + *N = 0.0; if ((u <= U.min ()) || ( u > U.max ())) - return (N); + return; else if (p == 0) - return (1.0); - else if (p == 1) { - if (u < U(1)) { - N = (u - U(0)) / (U(1) - U(0)); - return (N); + { + *N = 1.0; + return; } - else { - N = (U(2) - u) / (U(2) - U(1)); - return (N); + else if (p == 1) + { + if (u < U(1)) + { + *N = (u - U(0)) / (U(1) - U(0)); + return; + } + else + { + *N = (U(2) - u) / (U(2) - U(1)); + return; + } } - } - else if (p == 2) { - double ln = u - U(0); - double dn = U(3) - u; - double ld = U(2) - U(0); - double dd = U(3) - U(1); - if (u < U(1)) { - N = ln*ln / (ld * (U(1) - U(0))); - return (N); + else if (p == 2) + { + double ln = u - U(0); + double dn = U(3) - u; + double ld = U(2) - U(0); + double dd = U(3) - U(1); + if (u < U(1)) + { + *N = ln*ln / (ld * (U(1) - U(0))); + return; + } + else if (u > U(2)) + { + *N = dn*dn / (dd * (U(3) - U(2))); + return; + } + else + { + if (ld != 0) + *N += ln * (U(2) - u) / ((U(2) - U(1)) * ld); + + if (dd != 0) + *N += dn * (u - U(1)) / ((U(2) - U(1)) * dd); + return; + } } - else if (u > U(2)) { - N = dn*dn / (dd * (U(3) - U(2))); - return (N); - } - else { - if (ld != 0) - N = N + ln * (U(2) - u) / ((U(2) - U(1)) * ld); - if (dd != 0) - N = N + dn * (u - U(1)) / ((U(2) - U(1)) * dd); - return (N); - } - } double ln = u - U(0); double ld = U(U.length () - 2) - U(0); if (ld != 0) - N += ln * onebasisfun__ (u, p-1, U.extract (0, U.length () - 2))/ ld; - + { + double tmp; + onebasisfun__ (u, p-1, U.extract (0, U.length () - 2), &tmp); + *N += ln * tmp / ld; + } double dn = U(U.length () - 1) - u; double dd = U(U.length () - 1) - U(1); if (dd != 0) - N += dn * onebasisfun__ (u, p-1, U.extract (1, U.length () - 1))/ dd; - - return (N); + { + double tmp; + onebasisfun__ (u, p-1, U.extract (1, U.length () - 1), &tmp); + *N += dn * tmp / dd; + } + return; } -double onebasisfunder__ (double u, octave_idx_type p, RowVector U) +void onebasisfunder__ (double u, octave_idx_type p, RowVector U, double *N, double *Nder) { - - //std::cout << "u=" << u << " " << "p=" << p << " \n" << "U=" << U; + double aux; + *N = 0.0; *Nder = 0.0; + if ((u <= U.min ()) || ( u > U.max ())) + return; + + else if (p == 0) + { + *N = 1.0; + *Nder = 0.0; + return; + } - double N = 0.0; - if ((u <= U.min ()) || ( u > U.max ())) - return (N); - else if (p == 0) - return (0.0); - else { - - double ld = U(U.length () - 2) - U(0); - if (ld != 0) - N += p * onebasisfun__ (u, p-1, U.extract (0, U.length () - 2))/ ld; + else { - double dd = U(U.length () - 1) - U(1); - if (dd != 0) - N -= p * onebasisfun__ (u, p-1, U.extract (1, U.length () - 1))/ dd; + double ln = u - U(0); + double ld = U(U.length () - 2) - U(0); + + if (ld != 0) + { + onebasisfun__ (u, p-1, U.extract (0, U.length () - 2), &aux); + aux = aux / ld; + *N += ln * aux; + *Nder += p * aux; + } - return (N); + double dn = U(U.length () - 1) - u; + double dd = U(U.length () - 1) - U(1); + if (dd != 0) + { + onebasisfun__ (u, p-1, U.extract (1, U.length () - 1), &aux); + aux = aux / dd; + *N += dn *aux; + *Nder -= p * aux; + } } } - DEFUN_DLD(tbasisfun, args, nargout,"\ TBASISFUN: Compute a B- or T-Spline basis function, and its derivatives, from its local knot vector.\n\ @@ -126,6 +154,8 @@ Matrix u = args(0).matrix_value (); RowVector N(u.cols ()); + double *Nptr = N.fortran_vec (); + if (! args(2).is_cell ()) { @@ -133,87 +163,96 @@ RowVector U = args(2).row_vector_value (true, true); assert (U.numel () == p+2); - for (octave_idx_type ii=0; ii