X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fgeometry-1.5.0%2Fgeom2d%2FdrawArrow.m;fp=octave_packages%2Fgeometry-1.5.0%2Fgeom2d%2FdrawArrow.m;h=0fc846c5fded766b02e0c62d904c897420ed9712;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/geometry-1.5.0/geom2d/drawArrow.m b/octave_packages/geometry-1.5.0/geom2d/drawArrow.m new file mode 100644 index 0000000..0fc846c --- /dev/null +++ b/octave_packages/geometry-1.5.0/geom2d/drawArrow.m @@ -0,0 +1,142 @@ +%% Copyright (c) 2011, INRA +%% 2004-2011, David Legland +%% 2011 Adapted to Octave by Juan Pablo Carbajal +%% +%% All rights reserved. +%% (simplified BSD License) +%% +%% Redistribution and use in source and binary forms, with or without +%% modification, are permitted provided that the following conditions are met: +%% +%% 1. Redistributions of source code must retain the above copyright notice, this +%% list of conditions and the following disclaimer. +%% +%% 2. Redistributions in binary form must reproduce the above copyright notice, +%% this list of conditions and the following disclaimer in the documentation +%% and/or other materials provided with the distribution. +%% +%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +%% POSSIBILITY OF SUCH DAMAGE. +%% +%% The views and conclusions contained in the software and documentation are +%% those of the authors and should not be interpreted as representing official +%% policies, either expressed or implied, of copyright holder. + +%% -*- texinfo -*- +%% @deftypefn {Function File} {@var{h} = } drawArrow (@var{x1}, @var{y1}, @var{x2}, @var{y2}) +%% @deftypefnx {Function File} {@var{h} = } drawArrow ([@var{ @var{x1}} @var{ @var{y1}} @var{x2} @var{y2}]) +%% @deftypefnx {Function File} {@var{h} = } drawArrow (@dots{}, @var{L}, @var{W}) +%% @deftypefnx {Function File} {@var{h} = } drawArrow (@dots{}, @var{L}, @var{W},@var{TYPE}) +%% Draw an arrow on the current axis. +%% +%% draw an arrow between the points (@var{x1} @var{y1}) and (@var{x2} @var{y2}). +%% The points can be given as a single array. @var{L}, @var{W} specify length +%% and width of the arrow. +%% +%% Also specify arrow type. @var{TYPE} can be one of the following : +%% 0: draw only two strokes +%% 1: fill a triangle +%% .5: draw a half arrow (try it to see ...) +%% +%% Arguments can be single values or array of size [N*1]. In this case, +%% the function draws multiple arrows. +%% +%% @end deftypefn + +function varargout = drawArrow(varargin) + + if isempty(varargin) + error('should specify at least one argument'); + end + + % parse arrow coordinate + var = varargin{1}; + if size(var, 2)==4 + @var{x1} = var(:,1); + @var{y1} = var(:,2); + x2 = var(:,3); + y2 = var(:,4); + varargin = varargin(2:end); + elseif length(varargin)>3 + @var{x1} = varargin{1}; + @var{y1} = varargin{2}; + x2 = varargin{3}; + y2 = varargin{4}; + varargin = varargin(5:end); + else + error('wrong number of arguments, please read the doc'); + end + + l = 10*size(size( @var{x1})); + w = 5*ones(size( @var{x1})); + h = zeros(size( @var{x1})); + + % exctract length of arrow + if ~isempty(varargin) + l = varargin{1}; + if length( @var{x1})>length(l) + l = l(1)*ones(size( @var{x1})); + end + end + + % extract width of arrow + if length(varargin)>1 + w = varargin{2}; + if length( @var{x1})>length(w) + w = w(1)*ones(size( @var{x1})); + end + end + + % extract 'ratio' of arrow + if length(varargin)>2 + h = varargin{3}; + if length( @var{x1})>length(h) + h = h(1)*ones(size( @var{x1})); + end + end + + hold on; + axis equal; + + % angle of the edge + theta = atan2(y2- @var{y1}, x2- @var{x1}); + + % point on the 'left' + xa1 = x2 - l.*cos(theta) - w.*sin(theta)/2; + ya1 = y2 - l.*sin(theta) + w.*cos(theta)/2; + % point on the 'right' + xa2 = x2 - l.*cos(theta) + w.*sin(theta)/2; + ya2 = y2 - l.*sin(theta) - w.*cos(theta)/2; + % point on the middle of the arrow + xa3 = x2 - l.*cos(theta).*h; + ya3 = y2 - l.*sin(theta).*h; + + % draw main edge + line([ @var{x1}'; x2'], [ @var{y1}'; y2'], 'color', [0 0 1]); + + % draw only 2 wings + ind = find(h==0); + line([xa1(ind)'; x2(ind)'], [ya1(ind)'; y2(ind)'], 'color', [0 0 1]); + line([xa2(ind)'; x2(ind)'], [ya2(ind)'; y2(ind)'], 'color', [0 0 1]); + + % draw a full arrow + ind = find(h~=0); + patch([x2(ind) xa1(ind) xa3(ind) xa2(ind) x2(ind)]', ... + [y2(ind) ya1(ind) ya3(ind) ya2(ind) y2(ind)]', [0 0 1]); + + + if nargout>0 + varargout{1}=h; + end + +endfunction +