📄 bspdegelev.m
字号:
end % }
% // end of insert knot
%
% // degree elevate bezier
for i=lbz:ph % for (i = lbz; i <= ph; i++) {
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
ebpts(ii+1,i+1) = 0; % ebpts[i][ii] = 0.0;
end
mpi = min(d, i); % mpi = min(d, i);
for j=max(0,i-t):mpi % for (j = max(0,i-t); j <= mpi; j++)
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
tmp1 = ebpts(ii+1,i+1);
tmp2 = bezalfs(j+1,i+1)*bpts(ii+1,j+1);
ebpts(ii+1,i+1) = tmp1 + tmp2; % ebpts[i][ii] = ebpts[i][ii] + bezalfs[i][j]*bpts[j][ii];
end
end
end % }
% // end of degree elevating bezier
%
if oldr > 1 % if (oldr > 1) {
% // must remove knot u=k[a] oldr times
first = kind - 2; % first = kind - 2;
last = kind; % last = kind;
den = ub - ua; % den = ub - ua;
bet = floor((ub-ik(kind)) / den); % bet = (ub-ik[kind-1]) / den;
%
% // knot removal loop
for tr=1:oldr-1 % for (tr = 1; tr < oldr; tr++) {
i = first; % i = first;
j = last; % j = last;
kj = j - kind + 1; % kj = j - kind + 1;
while j-i > tr % while (j - i > tr) {
% // loop and compute the new control points
% // for one removal step
if i < cind % if (i < cind) {
alf = (ub-ik(i+1))/(ua-ik(i+1)); % alf = (ub-ik[i])/(ua-ik[i]);
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
tmp1 = alf*ic(ii+1,i+1);
tmp2 = (1-alf)*ic(ii+1,i);
ic(ii+1,i+1) = tmp1 + tmp2; % ictrl[i][ii] = alf * ictrl[i][ii] + (1.0-alf) * ictrl[i-1][ii];
end
end % }
if j >= lbz % if (j >= lbz) {
if j-tr <= kind-ph+oldr % if (j-tr <= kind-ph+oldr) {
gam = (ub-ik(j-tr+1)) / den; % gam = (ub-ik[j-tr]) / den;
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
tmp1 = gam*ebpts(ii+1,kj+1);
tmp2 = (1-gam)*ebpts(ii+1,kj+2);
ebpts(ii+1,kj+1) = tmp1 + tmp2; % ebpts[kj][ii] = gam*ebpts[kj][ii] + (1.0-gam)*ebpts[kj+1][ii];
end % }
else % else {
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
tmp1 = bet*ebpts(ii+1,kj+1);
tmp2 = (1-bet)*ebpts(ii+1,kj+2);
ebpts(ii+1,kj+1) = tmp1 + tmp2; % ebpts[kj][ii] = bet*ebpts[kj][ii] + (1.0-bet)*ebpts[kj+1][ii];
end
end % }
end % }
i = i + 1; % i++;
j = j - 1; % j--;
kj = kj - 1; % kj--;
end % }
%
first = first - 1; % first--;
last = last + 1; % last++;
end % }
end % }
% // end of removing knot n=k[a]
%
% // load the knot ua
if a ~= d % if (a != d)
for i=0:ph-oldr-1 % for (i = 0; i < ph-oldr; i++) {
ik(kind+1) = ua; % ik[kind] = ua;
kind = kind + 1; % kind++;
end
end % }
%
% // load ctrl pts into ic
for j=lbz:rbz % for (j = lbz; j <= rbz; j++) {
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
ic(ii+1,cind+1) = ebpts(ii+1,j+1); % ictrl[cind][ii] = ebpts[j][ii];
end
cind = cind + 1; % cind++;
end % }
%
if b < m % if (b < m) {
% // setup for next pass thru loop
for j=0:r-1 % for (j = 0; j < r; j++)
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
bpts(ii+1,j+1) = Nextbpts(ii+1,j+1); % bpts[j][ii] = Nextbpts[j][ii];
end
end
for j=r:d % for (j = r; j <= d; j++)
for ii=0:mc-1 % for (ii = 0; ii < mc; ii++)
bpts(ii+1,j+1) = c(ii+1,b-d+j+1); % bpts[j][ii] = ctrl[b-d+j][ii];
end
end
a = b; % a = b;
b = b+1; % b++;
ua = ub; % ua = ub;
% }
else % else
% // end knot
for i=0:ph % for (i = 0; i <= ph; i++)
ik(kind+i+1) = ub; % ik[kind+i] = ub;
end
end
end % }
% End big while loop % // end while loop
%
% *nh = mh - ph - 1;
%
% freevec2mat(ctrl);
% freevec2mat(ictrl);
% freematrix(bezalfs);
% freematrix(bpts);
% freematrix(ebpts);
% freematrix(Nextbpts);
% mxFree(alfs);
%
% return(ierr);
% }
function b = bincoeff(n,k)
% Computes the binomial coefficient.
%
% ( n ) n!
% ( ) = --------
% ( k ) k!(n-k)!
%
% b = bincoeff(n,k)
%
% Algorithm from 'Numerical Recipes in C, 2nd Edition' pg215.
% double bincoeff(int n, int k)
% {
b = floor(0.5+exp(factln(n)-factln(k)-factln(n-k))); % return floor(0.5+exp(factln(n)-factln(k)-factln(n-k)));
% }
function f = factln(n)
% computes ln(n!)
if n <= 1, f = 0; return, end
f = gammaln(n+1); %log(factorial(n));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -