image thumbnail
from IGES Toolbox by Per Bergström
Extracts the parameter data in an IGES file to Matlab.

nrbDerivativesIGES.m
function [dnurbs,d2nurbs] = nrbDerivativesIGES(nurbs)
% Returns the derivative(s) of NURBS
% Use nrbevalIGES for evaluations
%
% Usage:
% dnurbs = nrbDerivativesIGES(nurbs)
% [dnurbs,d2nurbs] = nrbDerivativesIGES(nurbs)
%
% Input:
% nurbs - NURBS object
%
% Output:
% dnurbs,d2nurbs - NURBS derivatives
%
% m-file can be downloaded at
% http://www.mathworks.com/matlabcentral/fileexchange/13253-iges-toolbox
%
% written by Per Bergstrm 2009-12-04
%


if length(nurbs.order)==2

    dnurbs=cell(1,2);

    dnurbs{1}.form='B-NURBS';
    dnurbs{1}.dim=4;
    dnurbs{1}.number=[(nurbs.number(1)-1),nurbs.number(2)];
    if nurbs.order(1)>1
        % Do the derivation
        reshkn1=nurbs.knots{1}((1+nurbs.order(1)):(nurbs.number(1)+nurbs.order(1)-1))-nurbs.knots{1}(2:nurbs.number(1));
        reshkn1(abs(reshkn1)<1e-10)=Inf;
        dnurbs{1}.coefs=(nurbs.order(1)-1)*(nurbs.coefs(:,2:nurbs.number(1),:)-nurbs.coefs(:,1:(nurbs.number(1)-1),:))./repmat(reshkn1,[4,1,nurbs.number(2)]);
        dnurbs{1}.knots={nurbs.knots{1}(2:(end-1)) nurbs.knots{2}};
    else
        % Do not do the derivation
        dnurbs{1}.coefs=nurbs.coefs;
        dnurbs{1}.knots=nurbs.knots;
    end
    dnurbs{1}.order=[(nurbs.order(1)-1) nurbs.order(2)];

    dnurbs{2}.form='B-NURBS';
    dnurbs{2}.dim=4;
    dnurbs{2}.number=[nurbs.number(1),(nurbs.number(2)-1)];

    if nurbs.order(2)>1
        % Do the derivation
        dcoefsv=zeros(4,nurbs.number(1),nurbs.number(2)-1);
        reshkn2=reshape(nurbs.knots{2}((1+nurbs.order(2)):(nurbs.number(2)+nurbs.order(2)-1))-nurbs.knots{2}(2:nurbs.number(2)),[1,1,(nurbs.number(2)-1)]);
        reshkn2(abs(reshkn2)<1e-10)=Inf;
        for ii=1:4
            for jj=1:nurbs.number(1)
                dcoefsv(ii,jj,:)=(nurbs.order(2)-1)*(nurbs.coefs(ii,jj,2:nurbs.number(2))-nurbs.coefs(ii,jj,1:(nurbs.number(2)-1)))./reshkn2;
            end
        end

        dnurbs{2}.coefs=dcoefsv;
        dnurbs{2}.knots={nurbs.knots{1} nurbs.knots{2}(2:(end-1))};
    else
        % Do not do the derivation
        dnurbs{2}.coefs=nurbs.coefs;
        dnurbs{2}.knots=nurbs.knots;
    end
    dnurbs{2}.order=[nurbs.order(1) (nurbs.order(2)-1)];

    if nargout==2

        d2nurbs11_12 = nrbDerivativesIGES(dnurbs{1});
        d2nurbs21_22 = nrbDerivativesIGES(dnurbs{2});

        d2nurbs=cell(1,3);

        d2nurbs{1}=d2nurbs11_12{1};
        d2nurbs{2}=d2nurbs11_12{2};
        d2nurbs{3}=d2nurbs21_22{2};

        %reduce roundoff error

        d2nurbs{2}.coefs=0.5*(d2nurbs11_12{2}.coefs+d2nurbs21_22{1}.coefs);

    end

elseif length(nurbs.order)==1

    dnurbs.form='B-NURBS';
    dnurbs.dim=4;
    dnurbs.number=(nurbs.number-1);
    if nurbs.order>1
        % Do the derivation
        reshkn1=nurbs.knots((1+nurbs.order):(nurbs.number+nurbs.order-1))-nurbs.knots(2:nurbs.number);
        reshkn1(abs(reshkn1)<1e-10)=Inf;        
        dnurbs.coefs=(nurbs.order-1)*(nurbs.coefs(:,2:nurbs.number,:)-nurbs.coefs(:,1:(nurbs.number-1),:))./repmat(reshkn1,[4,1]);
        dnurbs.knots=nurbs.knots(2:(end-1));
    else
        % Do not do the derivation
        dnurbs.coefs=nurbs.coefs;
        dnurbs.knots=nurbs.knots;
    end
    dnurbs.order=(nurbs.order-1);

    if nargout==2
        d2nurbs=nrbDerivativesIGES(dnurbs);
    end

end

Contact us at files@mathworks.com