X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fnurbs-1.3.6%2Fkntbrkdegmult.m;fp=octave_packages%2Fnurbs-1.3.6%2Fkntbrkdegmult.m;h=7ab00782ca04de207179e39db55b834dbc1a7426;hp=0000000000000000000000000000000000000000;hb=c880e8788dfc484bf23ce13fa2787f2c6bca4863;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/nurbs-1.3.6/kntbrkdegmult.m b/octave_packages/nurbs-1.3.6/kntbrkdegmult.m new file mode 100644 index 0000000..7ab0078 --- /dev/null +++ b/octave_packages/nurbs-1.3.6/kntbrkdegmult.m @@ -0,0 +1,122 @@ +% KNTBRKDEGMULT: Construct an open knot vector by giving the sequence of +% knots, the degree and the multiplicity. +% +% knots = kntbrkdegreg (breaks, degree) +% knots = kntbrkdegreg (breaks, degree, mult) +% +% INPUT: +% +% breaks: sequence of knots. +% degree: polynomial degree of the splines associated to the knot vector. +% mult: multiplicity of the knots. +% +% OUTPUT: +% +% knots: knot vector. +% +% If MULT has as many entries as BREAKS, or as the number of interior +% knots, a different multiplicity will be assigned to each knot. If +% MULT is not present, it will be taken equal to 1. +% +% Copyright (C) 2010 Carlo de Falco, Rafael Vazquez +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 2 of the License, or +% (at your option) any later version. + +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . + +function knots = kntbrkdegmult (breaks, degree, mult) + + if (iscell (breaks)) + if (nargin == 2) + mult = 1; + end + + if (numel(breaks)~=numel(degree) || numel(breaks)~=numel(mult)) + error('kntbrkdegmult: degree and multiplicity must have the same length as the number of knot vectors') + end + + degree = num2cell (degree); + + if (~iscell (mult)) + mult = num2cell (mult); + end + + knots = cellfun (@do_kntbrkdegmult, breaks, degree, mult, 'uniformoutput', false); + + else + + if (nargin == 2) + mult = 1; + end + + knots = do_kntbrkdegmult (breaks, degree, mult); + end +end + + +function knots = do_kntbrkdegmult (breaks, degree, mult) + +if (numel (breaks) < 2) + error ('kntbrkdegmult: the knots sequence should contain at least two points') +end + +if (numel (mult) == 1) + mults = [degree+1, mult(ones (1, numel (breaks) - 2)), degree+1]; +elseif (numel (mult) == numel (breaks)) + mults = [degree+1 mult(2:end-1) degree+1]; +elseif (numel (mult) == numel (breaks) - 2) + mults = [degree+1 mult degree+1]; +else + error('kntbrkdegmult: the length of mult should be equal to one or the number of knots') +end + +if (any (mults > degree+1)) + warning ('kntbrkdegmult: some knots have higher multiplicity than the degree+1') +end + +breaks = sort (breaks); + +lm = numel (mults); +sm = sum (mults); + +mm = zeros (1,sm); +mm (cumsum ([1 reshape(mults (1:end-1), 1, lm-1)])) = ones (1,lm); +knots = breaks (cumsum (mm)); + +end + +%!test +%! breaks = [0 1 2 3 4]; +%! degree = 3; +%! knots = kntbrkdegmult (breaks, degree); +%! assert (knots, [0 0 0 0 1 2 3 4 4 4 4]) + +%!test +%! breaks = [0 1 2 3 4]; +%! degree = 3; +%! mult = 2; +%! knots = kntbrkdegmult (breaks, degree, mult); +%! assert (knots, [0 0 0 0 1 1 2 2 3 3 4 4 4 4]) + +%!test +%! breaks = [0 1 2 3 4]; +%! degree = 3; +%! mult = [1 2 3]; +%! knots = kntbrkdegmult (breaks, degree, mult); +%! assert (knots, [0 0 0 0 1 2 2 3 3 3 4 4 4 4]) + +%!test +%! breaks = {[0 1 2 3 4] [0 1 2 3]}; +%! degree = [3 2]; +%! mult = {[1 2 3] 2}; +%! knots = kntbrkdegmult (breaks, degree, mult); +%! assert (knots, {[0 0 0 0 1 2 2 3 3 3 4 4 4 4] [0 0 0 1 1 2 2 3 3 3]})