]> Creatis software - CreaPhase.git/blob - octave_packages/nurbs-1.3.6/nrbcoons.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / nurbs-1.3.6 / nrbcoons.m
1 function srf = nrbcoons(u1, u2, v1, v2)
2
3 % NRBCOONS: Construction of a Coons patch.
4
5 % Calling Sequence:
6
7 %   srf = nrbcoons(ucrv1, ucrv2, vcrv1, vcrv2)
8
9 % INPUT:
10
11 %   ucrv1       : NURBS curve defining the bottom U direction boundary of
12 %               the constructed NURBS surface.
13
14 %   ucrv2       : NURBS curve defining the top U direction boundary of
15 %               the constructed NURBS surface.
16
17 %   vcrv1       : NURBS curve defining the bottom V direction boundary of
18 %               the constructed NURBS surface.
19
20 %   vcrv2       : NURBS curve defining the top V direction boundary of
21 %               the constructed NURBS surface.
22 %
23 % OUTPUT:
24
25 %   srf         : Coons NURBS surface patch.
26
27 % Description:
28
29 %   Construction of a bilinearly blended Coons surface patch from four NURBS
30 %   curves that define the boundary.
31
32 %   The orientation of the four NURBS boundary curves.
33
34 %          ^ V direction
35 %          |
36 %          |     ucrv2
37 %          ------->--------
38 %          |              |
39 %          |              |
40 %    vcrv1 ^   Surface    ^ vcrv2
41 %          |              |
42 %          |              |
43 %          ------->-----------> U direction
44 %                ucrv1
45
46
47 % Examples:
48
49 %   // Define four NURBS curves and construct a Coons surface patch.
50 %   pnts = [ 0.0  3.0  4.5  6.5 8.0 10.0;
51 %            0.0  0.0  0.0  0.0 0.0  0.0; 
52 %            2.0  2.0  7.0  4.0 7.0  9.0];   
53 %   crv1 = nrbmak(pnts, [0 0 0 1/3 0.5 2/3 1 1 1]);
54
55 %   pnts= [ 0.0  3.0  5.0  8.0 10.0;
56 %           10.0 10.0 10.0 10.0 10.0;
57 %           3.0  5.0  8.0  6.0 10.0];
58 %   crv2 = nrbmak(pnts, [0 0 0 1/3 2/3 1 1 1]);
59
60 %   pnts= [ 0.0 0.0 0.0 0.0;
61 %           0.0 3.0 8.0 10.0;
62 %           2.0 0.0 5.0 3.0];
63 %   crv3 = nrbmak(pnts, [0 0 0 0.5 1 1 1]);
64
65 %   pnts= [ 10.0 10.0 10.0 10.0 10.0;
66 %           0.0   3.0  5.0  8.0 10.0;
67 %           9.0   7.0  7.0 10.0 10.0];
68 %   crv4 = nrbmak(pnts, [0 0 0 0.25 0.75 1 1 1]);
69
70 %   srf = nrbcoons(crv1, crv2, crv3, crv4);
71 %   nrbplot(srf,[20 20],220,45);
72 %
73 %    Copyright (C) 2000 Mark Spink
74 %
75 %    This program is free software: you can redistribute it and/or modify
76 %    it under the terms of the GNU General Public License as published by
77 %    the Free Software Foundation, either version 2 of the License, or
78 %    (at your option) any later version.
79
80 %    This program is distributed in the hope that it will be useful,
81 %    but WITHOUT ANY WARRANTY; without even the implied warranty of
82 %    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
83 %    GNU General Public License for more details.
84 %
85 %    You should have received a copy of the GNU General Public License
86 %    along with this program.  If not, see <http://www.gnu.org/licenses/>.
87
88 if nargin ~= 4
89   error('Incorrect number of input arguments');
90 end
91
92 r1 = nrbruled(u1, u2);
93 r2 = nrbtransp(nrbruled(v1, v2));
94 t  = nrb4surf(u1.coefs(:,1), u1.coefs(:,end), u2.coefs(:,1), u2.coefs(:,end));
95
96 % raise all surfaces to a common degree
97 du = max([r1.order(1), r2.order(1), t.order(1)]);
98 dv = max([r1.order(2), r2.order(2), t.order(2)]);
99 r1 = nrbdegelev(r1, [du - r1.order(1), dv - r1.order(2)]);
100 r2 = nrbdegelev(r2, [du - r2.order(1), dv - r2.order(2)]);
101 t  = nrbdegelev(t,  [du - t.order(1),  dv - t.order(2)]);
102
103 % merge the knot vectors, to obtain a common knot vector
104
105 % U knots
106 k1 = r1.knots{1};
107 k2 = r2.knots{1};
108 k3 = t.knots{1};
109 k = unique([k1 k2 k3]);
110 n = length(k);
111 kua = [];
112 kub = [];
113 kuc = [];
114 for i = 1:n
115   i1 = length(find(k1 == k(i)));
116   i2 = length(find(k2 == k(i)));
117   i3 = length(find(k3 == k(i)));
118   m = max([i1, i2, i3]);
119   kua = [kua k(i)*ones(1,m-i1)];  
120   kub = [kub k(i)*ones(1,m-i2)];
121   kuc = [kuc k(i)*ones(1,m-i3)];
122 end  
123
124 % V knots
125 k1 = r1.knots{2};
126 k2 = r2.knots{2};
127 k3 = t.knots{2};
128 k = unique([k1 k2 k3]);
129 n = length(k);
130 kva = [];
131 kvb = [];
132 kvc = [];
133 for i = 1:n
134   i1 = length(find(k1 == k(i)));
135   i2 = length(find(k2 == k(i)));
136   i3 = length(find(k3 == k(i)));
137   m = max([i1, i2, i3]);
138   kva = [kva k(i)*ones(1,m-i1)];  
139   kvb = [kvb k(i)*ones(1,m-i2)];
140   kvc = [kvc k(i)*ones(1,m-i3)];
141 end  
142
143 r1 = nrbkntins(r1, {kua, kva});
144 r2 = nrbkntins(r2, {kub, kvb});
145 t  = nrbkntins(t,  {kuc, kvc});
146
147 % combine coefficient to construct Coons surface
148 coefs(1,:,:) = r1.coefs(1,:,:) + r2.coefs(1,:,:) - t.coefs(1,:,:);
149 coefs(2,:,:) = r1.coefs(2,:,:) + r2.coefs(2,:,:) - t.coefs(2,:,:);
150 coefs(3,:,:) = r1.coefs(3,:,:) + r2.coefs(3,:,:) - t.coefs(3,:,:);
151 coefs(4,:,:) = r1.coefs(4,:,:) + r2.coefs(4,:,:) - t.coefs(4,:,:);
152 srf = nrbmak(coefs, r1.knots);
153
154 end
155
156 %!demo
157 %! pnts = [ 0.0  3.0  4.5  6.5 8.0 10.0;
158 %!          0.0  0.0  0.0  0.0 0.0  0.0; 
159 %!          2.0  2.0  7.0  4.0 7.0  9.0];   
160 %! crv1 = nrbmak(pnts, [0 0 0 1/3 0.5 2/3 1 1 1]);
161 %!
162 %! pnts= [ 0.0  3.0  5.0  8.0 10.0;
163 %!         10.0 10.0 10.0 10.0 10.0;
164 %!         3.0  5.0  8.0  6.0 10.0];
165 %! crv2 = nrbmak(pnts, [0 0 0 1/3 2/3 1 1 1]);
166 %!
167 %! pnts= [ 0.0 0.0 0.0 0.0;
168 %!         0.0 3.0 8.0 10.0;
169 %!         2.0 0.0 5.0 3.0];
170 %! crv3 = nrbmak(pnts, [0 0 0 0.5 1 1 1]);
171 %!
172 %! pnts= [ 10.0 10.0 10.0 10.0 10.0;
173 %!         0.0   3.0  5.0  8.0 10.0;
174 %!         9.0   7.0  7.0 10.0 10.0];
175 %! crv4 = nrbmak(pnts, [0 0 0 0.25 0.75 1 1 1]);
176 %!
177 %! srf = nrbcoons(crv1, crv2, crv3, crv4);
178 %!
179 %! nrbplot(srf,[20 20]);
180 %! title('Construction of a bilinearly blended Coons surface.');
181 %! hold off