Mercurial > forge
changeset 11694:c79a6e375d83 octave-forge
added funcion to compute line length
author | cdf |
---|---|
date | Fri, 10 May 2013 12:53:12 +0000 |
parents | 213fe8b0c3d7 |
children | f93a77b972f0 |
files | extra/nurbs/INDEX extra/nurbs/inst/nrbmeasure.m |
diffstat | 2 files changed, 91 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/extra/nurbs/INDEX Thu May 09 19:37:51 2013 +0000 +++ b/extra/nurbs/INDEX Fri May 10 12:53:12 2013 +0000 @@ -44,6 +44,7 @@ surfderiveval NURBS geometric entities and functions nrbbasisfun + nrbmeasure nrbbasisfunder nrbnumbasisfun nrbcrvderiveval
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extra/nurbs/inst/nrbmeasure.m Fri May 10 12:53:12 2013 +0000 @@ -0,0 +1,90 @@ +%% Copyright (C) 2013 Carlo de Falco +%% +%% 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 3 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 Octave; see the file COPYING. If not, see +%% <http://www.gnu.org/licenses/>. + +%% -*- texinfo -*- +%% @deftypefn {Function File}{[@var{dist}, @var{ddds}, @var{ddde}]=} +%% nrbmeasure (@var{line}, @var{start}, @var{end}, @var{tol}) +%% Compute the distance @{dist} between the points @var{start} and @{end} along the +%% line @var{line}. +%% Use the tolerance @var{tol} when computing integrals. The output +%% parameters @var{ddds}, @var{ddde} are the derivatives of +%% @var{dist} with respect to @var{start} and @var{end} respectively. +%% @seealso{} +%% @end deftypefn + +%% Author: Carlo de Falco + + +function [dist, ddistds, ddistde] = nrbmeasure (nrbline, s, e, tol) + + if (nargin < 4) + tol = 1e-6; + if (nargin < 3) + e = 1; + if (nargin < 2) + s = 0; + end + end + end + + if (ismatrix (s) && isscalar (e)) + e = repelems (e, size(s) .'); + elseif (ismatrix (e) && isscalar (s)) + s = repelems (s, size(e) .'); + end + + [ders, ders2] = nrbderiv (nrbline); + dist = quad (@(u) len (u, nrbline, ders), s, e, tol); + + if (nargout > 1) + ddistds = -len (s, nrbline, ders); + if (nargout > 2) + ddistde = +len (e, nrbline, ders); + end + end + +end + +function l = len (u, nrbline, ders) + [ignore, d] = nrbdeval (nrbline, ders, u); + f = d(1, :); + g = d(2, :); + h = d(3, :); + l = sqrt (f.^2 + g.^2 + h.^2); +end + +%!test +%! c = nrbcirc (1, [0 0], 0, pi/3); +%! l = nrbmeasure(c, 0, 1, 1e-7); +%! assert (l, pi/3, 1e-7) + +%!test +%! c = nrbcirc (1, [0 0], 0, pi/2); +%! s = zeros (1, 100); e = linspace (0, 1, 100); +%! for ii = 1:100 +%! l(ii) = nrbmeasure (c, s(ii), e(ii), 1e-7); +%! endfor +%! xx = nrbeval (c, e); +%! theta = atan2 (xx(2,:), xx(1,:)); +%! assert (l, theta, 1e-7) + +%!test +%! c = nrbcirc (1, [0 0], 0, pi/2); +%! s = 0; e = linspace (0, 1, 100); +%! for ii = 1:100 +%! l(ii) = nrbmeasure (c, s, e(ii), 1e-7); +%! endfor +%! l2 = nrbmeasure (c, s, e, 1e-7);