-
Notifications
You must be signed in to change notification settings - Fork 2
/
nrbdegelev.m
98 lines (86 loc) · 2.3 KB
/
nrbdegelev.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
function inurbs = nrbdegelev(nurbs, ntimes)
%
% Function Name:
%
% nrbdegelev - Elevate the degree of the NURBS curve or surface.
%
% Calling Sequence:
%
% ecrv = nrbdegelev(crv,utimes);
% esrf = nrbdegelev(srf,{utimes,vtimes});
%
% Parameters:
%
% crv : NURBS curve, see nrbmak.
%
% srf : NURBS surface, see nrbmak.
%
% utimes : Increase the degree along U direction utimes.
%
% vtimes : Increase the degree along V direction vtimes.
%
% ecrv : new NURBS structure for a curve with degree elevated.
%
% esrf : new NURBS structure for a surface with degree elevated.
%
%
% Description:
%
% Degree elevates the NURBS curve or surface. This function uses the
% B-Spline function bspdegelev, which interface to an internal 'C'
% routine.
%
% Examples:
%
% Increase the NURBS surface twice along the V direction.
% esrf = nrbdegelev(srf, 0, 1);
%
% See:
%
% bspdegelev
% D.M. Spink
% Copyright (c) 2000.
if nargin < 2
error('Input argument must include the NURBS and degree increment.');
end
if ~isstruct(nurbs)
error('NURBS representation is not structure!');
end
if ~strcmp(nurbs.form,'B-NURBS')
error('Not a recognised NURBS representation');
end
degree = nurbs.order-1;
if iscell(nurbs.knots)
% NURBS represents a surface
[dim,num1,num2] = size(nurbs.coefs);
% Degree elevate along the v direction
if ntimes(2) == 0
coefs = nurbs.coefs;
knots{2} = nurbs.knots{2};
else
coefs = reshape(nurbs.coefs,4*num1,num2);
[coefs,knots{2}] = bspdegelev(degree(2),coefs,nurbs.knots{2},ntimes(2));
num2 = size(coefs,2);
coefs = reshape(coefs,[4 num1 num2]);
end
% Degree elevate along the u direction
if ntimes(1) == 0
knots{1} = nurbs.knots{1};
else
coefs = permute(coefs,[1 3 2]);
coefs = reshape(coefs,4*num2,num1);
[coefs,knots{1}] = bspdegelev(degree(1),coefs,nurbs.knots{1},ntimes(1));
coefs = reshape(coefs,[4 num2 size(coefs,2)]);
coefs = permute(coefs,[1 3 2]);
end
else
% NURBS represents a curve
if isempty(ntimes)
coefs = nurbs.coefs;
knots = nurbs.knots;
else
[coefs,knots] = bspdegelev(degree,nurbs.coefs,nurbs.knots,ntimes);
end
end
% construct new NURBS
inurbs = nrbmak(coefs,knots);