annotate extra/nurbs/inst/nrbderiv.m @ 5552:6bc116f6bbc3 octave-forge

cleanup
author cdf
date Tue, 28 Apr 2009 14:50:14 +0000
parents 4dd6e5c0cea4
children 97806581afd6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5552
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
1 function dnurbs = nrbderiv(nurbs)
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
2 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
3 % NRBDERIV: Construct the first derivative representation of a
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
4 % NURBS curve or surface.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
5 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
6 % Calling Sequence:
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
7 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
8 % ders = nrbderiv(nrb);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
9 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
10 % Parameters:
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
11 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
12 % nrb : NURBS data structure, see nrbmak.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
13 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
14 % ders : A data structure that represents the first
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
15 % derivatives of a NURBS curve or surface.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
16 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
17 % Description:
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
18 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
19 % The derivatives of a B-Spline are themselves a B-Spline of lower degree,
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
20 % giving an efficient means of evaluating multiple derivatives. However,
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
21 % although the same approach can be applied to NURBS, the situation for
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
22 % NURBS is a more complex. I have at present restricted the derivatives
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
23 % to just the first. I don't claim that this implentation is
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
24 % the best approach, but it will have to do for now. The function returns
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
25 % a data struture that for a NURBS curve contains the first derivatives of
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
26 % the B-Spline representation. Remember that a NURBS curve is represent by
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
27 % a univariate B-Spline using the homogeneous coordinates.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
28 % The derivative data structure can be evaluated later with the function
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
29 % nrbdeval.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
30 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
31 % Examples:
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
32 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
33 % See the function nrbdeval for an example.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
34 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
35 % See:
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
36 %
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
37 % nrbdeval
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
38
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
39 % D.M. Spink
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
40 % Copyright (c) 2000.
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
41
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
42 if ~isstruct(nurbs)
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
43 error('NURBS representation is not structure!');
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
44 end
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
45
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
46 if ~strcmp(nurbs.form,'B-NURBS')
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
47 error('Not a recognised NURBS representation');
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
48 end
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
49
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
50 degree = nurbs.order - 1;
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
51
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
52 if iscell(nurbs.knots)
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
53 % NURBS structure represents a surface
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
54
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
55 num1 = nurbs.number(1);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
56 num2 = nurbs.number(2);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
57
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
58 % taking derivatives along the u direction
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
59 dknots = nurbs.knots;
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
60 dcoefs = permute(nurbs.coefs,[1 3 2]);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
61 dcoefs = reshape(dcoefs,4*num2,num1);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
62 [dcoefs,dknots{1}] = bspderiv(degree(1),dcoefs,nurbs.knots{1});
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
63 dcoefs = permute(reshape(dcoefs,[4 num2 size(dcoefs,2)]),[1 3 2]);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
64 dnurbs{1} = nrbmak(dcoefs, dknots);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
65
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
66 % taking derivatives along the v direction
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
67 dknots = nurbs.knots;
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
68 dcoefs = reshape(nurbs.coefs,4*num1,num2);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
69 [dcoefs,dknots{2}] = bspderiv(degree(2),dcoefs,nurbs.knots{2});
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
70 dcoefs = reshape(dcoefs,[4 num1 size(dcoefs,2)]);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
71 dnurbs{2} = nrbmak(dcoefs, dknots);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
72
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
73 else
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
74 % NURBS structure represents a curve
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
75
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
76 [dcoefs,dknots] = bspderiv(degree,nurbs.coefs,nurbs.knots);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
77 dnurbs = nrbmak(dcoefs, dknots);
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
78
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
79 end
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
80
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
81
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
82
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
83
6bc116f6bbc3 cleanup
cdf
parents: 5224
diff changeset
84