]> Creatis software - CreaPhase.git/blobdiff - octave_packages/nurbs-1.3.6/nrbplot.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / nurbs-1.3.6 / nrbplot.m
diff --git a/octave_packages/nurbs-1.3.6/nrbplot.m b/octave_packages/nurbs-1.3.6/nrbplot.m
new file mode 100644 (file)
index 0000000..5103d1c
--- /dev/null
@@ -0,0 +1,278 @@
+function nrbplot (nurbs, subd, varargin)
+% 
+% NRBPLOT: Plot a NURBS curve or surface, or the boundary of a NURBS volume.
+% 
+% Calling Sequence:
+% 
+%   nrbplot (nrb, subd)
+%   nrbplot (nrb, subd, p, v)
+% 
+% INPUT:
+% 
+%   nrb                : NURBS curve, surface or volume, see nrbmak.
+% 
+%   npnts      : Number of evaluation points, for a surface or volume, a row 
+%       vector with the number of points along each direction.
+% 
+%   [p,v]       : property/value options
+%
+%               Valid property/value pairs include:
+%
+%               Property        Value/{Default}
+%               -----------------------------------
+%               light           {off} | on
+%               colormap        {'copper'}
+%
+% Example:
+%
+%   Plot the test surface with 20 points along the U direction
+%   and 30 along the V direction
+%
+%   nrbplot(nrbtestsrf, [20 30])
+%
+%    Copyright (C) 2000 Mark Spink
+%    Copyright (C) 2010 Carlo de Falco, Rafael Vazquez
+%
+%    This program is free software: you can redistribute it and/or modify
+%    it under the terms of the GNU General Public License as published by
+%    the Free Software Foundation, either version 2 of the License, or
+%    (at your option) any later version.
+
+%    This program is distributed in the hope that it will be useful,
+%    but WITHOUT ANY WARRANTY; without even the implied warranty of
+%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%    GNU General Public License for more details.
+%
+%    You should have received a copy of the GNU General Public License
+%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+nargs = nargin;
+if nargs < 2
+  error ('Need a NURBS to plot and the number of subdivisions!');
+elseif rem(nargs+2,2)
+  error ('Param value pairs expected')
+end
+
+% Default values
+light='off';
+cmap='summer';
+
+% Recover Param/Value pairs from argument list
+for i=1:2:nargs-2
+  Param = varargin{i};
+  Value = varargin{i+1};
+  if (~ischar (Param))
+    error ('Parameter must be a string')
+  elseif size(Param,1)~=1
+    error ('Parameter must be a non-empty single row string.')
+  end
+  switch lower (Param)
+  case 'light'
+    light = lower (Value);
+    if (~ischar (light))
+      error ('light must be a string.')
+    elseif ~(strcmp(light,'off') | strcmp(light,'on'))
+      error ('light must be off | on')
+    end
+  case 'colormap'
+    if ischar (Value)
+      cmap = lower(Value);
+    elseif size (Value, 2) ~= 3
+      error ('colormap must be a string or have exactly three columns.')
+    else
+      cmap=Value;
+    end
+  otherwise
+    error ('Unknown parameter: %s', Param)
+  end
+end
+
+colormap (cmap);
+
+% convert the number of subdivisions in number of points
+subd = subd+1;
+
+% plot the curve or surface
+if (iscell (nurbs.knots))
+ if (size (nurbs.knots,2) == 2) % plot a NURBS surface
+  p = nrbeval (nurbs, {linspace(0.0,1.0,subd(1)) linspace(0.0,1.0,subd(2))});
+  if (strcmp (light,'on'))
+    % light surface
+    surfl (squeeze(p(1,:,:)), squeeze(p(2,:,:)), squeeze(p(3,:,:)));
+    shading interp;
+  else 
+    surf (squeeze (p(1,:,:)), squeeze (p(2,:,:)), squeeze (p(3,:,:)));
+    shading faceted;
+  end
+ elseif (size (nurbs.knots,2) == 3) % plot the boundaries of a NURBS volume
+  hold_flag = ishold;
+  px = nrbeval (nurbs, {[0 1] linspace(0.0,1.0,subd(2)) linspace(0.0,1.0,subd(3))});
+  py = nrbeval (nurbs, {linspace(0.0,1.0,subd(1)) [0 1] linspace(0.0,1.0,subd(3))});
+  pz = nrbeval (nurbs, {linspace(0.0,1.0,subd(1)) linspace(0.0,1.0,subd(2)) [0 1]});
+  if (strcmp (light, 'on'))
+    surfl (squeeze (pz(1,:,:,1)), squeeze (pz(2,:,:,1)), squeeze (pz(3,:,:,1)));
+    hold on
+    surfl (squeeze (pz(1,:,:,2)), squeeze (pz(2,:,:,2)), squeeze (pz(3,:,:,2)));
+    surfl (squeeze (py(1,:,1,:)), squeeze (py(2,:,1,:)), squeeze (py(3,:,1,:)));
+    surfl (squeeze (py(1,:,2,:)), squeeze (py(2,:,2,:)), squeeze (py(3,:,2,:)));
+    surfl (squeeze (px(1,1,:,:)), squeeze (px(2,1,:,:)), squeeze (px(3,1,:,:)));
+    surfl (squeeze (px(1,2,:,:)), squeeze (px(2,2,:,:)), squeeze (px(3,2,:,:)));
+    shading interp;
+  else
+    surf (squeeze (pz(1,:,:,1)), squeeze (pz(2,:,:,1)), squeeze (pz(3,:,:,1)));
+    hold on
+    surf (squeeze (pz(1,:,:,2)), squeeze (pz(2,:,:,2)), squeeze (pz(3,:,:,2)));
+    surf (squeeze (py(1,:,1,:)), squeeze (py(2,:,1,:)), squeeze (py(3,:,1,:)));
+    surf (squeeze (py(1,:,2,:)), squeeze (py(2,:,2,:)), squeeze (py(3,:,2,:)));
+    surf (squeeze (px(1,1,:,:)), squeeze (px(2,1,:,:)), squeeze (px(3,1,:,:)));
+    surf (squeeze (px(1,2,:,:)), squeeze (px(2,2,:,:)), squeeze (px(3,2,:,:)));
+    shading faceted;
+  end
+  
+  if (~hold_flag)
+    hold off
+  end
+ else
+  error ('nrbplot: some argument is not correct')
+ end
+else
+  % plot a NURBS curve
+  p = nrbeval (nurbs, linspace (0.0, 1.0, subd));
+
+  if (any (nurbs.coefs(3,:)))
+    % 3D curve
+    plot3 (p(1,:), p(2,:), p(3,:)); 
+    grid on;
+  else
+    % 2D curve
+    plot (p(1,:), p(2,:));
+  end
+end
+axis equal;
+
+end
+
+% plot the control surface
+% hold on;
+% mesh(squeeze(pnts(1,:,:)),squeeze(pnts(2,:,:)),squeeze(pnts(3,:,:)));
+% hold off;
+
+%!demo
+%! crv = nrbtestcrv;
+%! nrbplot(crv,100)
+%! title('Test curve')
+%! hold off
+
+%!demo
+%! coefs = [0.0 7.5 15.0 25.0 35.0 30.0 27.5 30.0;
+%!          0.0 2.5  0.0 -5.0  5.0 15.0 22.5 30.0];
+%! knots = [0.0 0.0 0.0 1/6 1/3 1/2 2/3 5/6 1.0 1.0 1.0];
+%!
+%! geom = [
+%! nrbmak(coefs,knots)
+%! nrbline([30.0 30.0],[20.0 30.0])
+%! nrbline([20.0 30.0],[20.0 20.0])
+%! nrbcirc(10.0,[10.0 20.0],1.5*pi,0.0)
+%! nrbline([10.0 10.0],[0.0 10.0])
+%! nrbline([0.0 10.0],[0.0 0.0])
+%! nrbcirc(5.0,[22.5 7.5])
+%! ];
+%!
+%! ng = length(geom);
+%! for i = 1:ng
+%!   nrbplot(geom(i),500);
+%!   hold on;
+%! end
+%! hold off;
+%! axis equal;
+%! title('2D Geometry formed by a series of NURBS curves');
+
+%!demo
+%! sphere = nrbrevolve(nrbcirc(1,[],0.0,pi),[0.0 0.0 0.0],[1.0 0.0 0.0]);
+%! nrbplot(sphere,[40 40],'light','on');
+%! title('Ball and torus - surface construction by revolution');
+%! hold on;
+%! torus = nrbrevolve(nrbcirc(0.2,[0.9 1.0]),[0.0 0.0 0.0],[1.0 0.0 0.0]);
+%! nrbplot(torus,[40 40],'light','on');
+%! hold off
+
+%!demo
+%! knots = {[0 0 0 1/2 1 1 1] [0 0 0 1 1 1]...
+%!          [0 0 0 1/6 2/6 1/2 1/2 4/6 5/6 1 1 1]};
+%!
+%! coefs = [-1.0000   -0.9734   -0.7071    1.4290    1.0000    3.4172
+%!          0    2.4172         0    0.0148   -2.0000   -1.9734
+%!          0    2.0000    4.9623    9.4508    4.0000    2.0000
+%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
+%!    -0.8536         0   -0.6036    1.9571    1.2071    3.5000
+%!     0.3536    2.5000    0.2500    0.5429   -1.7071   -1.0000
+%!          0    2.0000    4.4900    8.5444    3.4142    2.0000
+%!     0.8536    1.0000    0.6036    1.0000    0.8536    1.0000
+%!    -0.3536   -4.0000   -0.2500   -1.2929    1.7071    1.0000
+%!     0.8536         0    0.6036   -2.7071   -1.2071   -5.0000
+%!          0    2.0000    4.4900   10.0711    3.4142    2.0000
+%!     0.8536    1.0000    0.6036    1.0000    0.8536    1.0000
+%!          0   -4.0000         0    0.7071    2.0000    5.0000
+%!     1.0000    4.0000    0.7071   -0.7071   -1.0000   -5.0000
+%!          0    2.0000    4.9623   14.4142    4.0000    2.0000
+%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
+%!    -2.5000   -4.0000   -1.7678    0.7071    1.0000    5.0000
+%!          0    4.0000         0   -0.7071   -3.5000   -5.0000
+%!          0    2.0000    6.0418   14.4142    4.0000    2.0000
+%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
+%!    -2.4379         0   -1.7238    2.7071    1.9527    5.0000
+%!     0.9527    4.0000    0.6737    1.2929   -3.4379   -1.0000
+%!          0    2.0000    6.6827   10.0711    4.0000    2.0000
+%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
+%!    -0.9734   -1.0000   -0.6883    0.7071    3.4172    1.0000
+%!     2.4172         0    1.7092   -1.4142   -1.9734   -2.0000
+%!          0    4.0000    6.6827    4.9623    4.0000         0
+%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
+%!          0   -0.8536         0    0.8536    3.5000    1.2071
+%!     2.5000    0.3536    1.7678   -1.2071   -1.0000   -1.7071
+%!          0    3.4142    6.0418    4.4900    4.0000         0
+%!     1.0000    0.8536    0.7071    0.6036    1.0000    0.8536
+%!    -4.0000   -0.3536   -2.8284    1.2071    1.0000    1.7071
+%!          0    0.8536         0   -0.8536   -5.0000   -1.2071
+%!          0    3.4142    7.1213    4.4900    4.0000         0
+%!     1.0000    0.8536    0.7071    0.6036    1.0000    0.8536
+%!    -4.0000         0   -2.8284    1.4142    5.0000    2.0000
+%!     4.0000    1.0000    2.8284   -0.7071   -5.0000   -1.0000
+%!          0    4.0000   10.1924    4.9623    4.0000         0
+%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
+%!    -4.0000   -2.5000   -2.8284    0.7071    5.0000    1.0000
+%!     4.0000         0    2.8284   -2.4749   -5.0000   -3.5000
+%!          0    4.0000   10.1924    6.0418    4.0000         0
+%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
+%!          0   -2.4379         0    1.3808    5.0000    1.9527
+%!     4.0000    0.9527    2.8284   -2.4309   -1.0000   -3.4379
+%!          0    4.0000    7.1213    6.6827    4.0000         0
+%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
+%!    -1.0000   -0.9734    0.2071    2.4163    1.0000    3.4172
+%!          0    2.4172   -1.2071   -1.3954   -2.0000   -1.9734
+%!     2.0000    4.0000    7.0178    6.6827    2.0000         0
+%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
+%!    -0.8536         0    0.3536    2.4749    1.2071    3.5000
+%!     0.3536    2.5000   -0.8536   -0.7071   -1.7071   -1.0000
+%!     1.7071    4.0000    6.3498    6.0418    1.7071         0
+%!     0.8536    1.0000    0.8536    0.7071    0.8536    1.0000
+%!    -0.3536   -4.0000    0.8536    0.7071    1.7071    1.0000
+%!     0.8536         0   -0.3536   -3.5355   -1.2071   -5.0000
+%!     1.7071    4.0000    6.3498    7.1213    1.7071         0
+%!     0.8536    1.0000    0.8536    0.7071    0.8536    1.0000
+%!          0   -4.0000    1.2071    3.5355    2.0000    5.0000
+%!     1.0000    4.0000   -0.2071   -3.5355   -1.0000   -5.0000
+%!     2.0000    4.0000    7.0178   10.1924    2.0000         0
+%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
+%!    -2.5000   -4.0000   -0.5429    3.5355    1.0000    5.0000
+%!          0    4.0000   -1.9571   -3.5355   -3.5000   -5.0000
+%!     2.0000    4.0000    8.5444   10.1924    2.0000         0
+%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
+%!    -2.4379         0   -0.0355    3.5355    1.9527    5.0000
+%!     0.9527    4.0000   -1.4497   -0.7071   -3.4379   -1.0000
+%!     2.0000    4.0000    9.4508    7.1213    2.0000         0
+%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000];
+%! coefs = reshape (coefs, 4, 4, 3, 9);
+%! horseshoe = nrbmak (coefs, knots);
+%! nrbplot (horseshoe, [6, 6, 50], 'light', 'on');