]> Creatis software - CreaPhase.git/blob - octave_packages/geometry-1.5.0/geom2d/drawEllipse.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / geometry-1.5.0 / geom2d / drawEllipse.m
1 %% Copyright (c) 2011, INRA
2 %% 2003-2011, David Legland <david.legland@grignon.inra.fr>
3 %% 2011 Adapted to Octave by Juan Pablo Carbajal <carbajal@ifi.uzh.ch>
4 %%
5 %% All rights reserved.
6 %% (simplified BSD License)
7 %%
8 %% Redistribution and use in source and binary forms, with or without
9 %% modification, are permitted provided that the following conditions are met:
10 %%
11 %% 1. Redistributions of source code must retain the above copyright notice, this
12 %%    list of conditions and the following disclaimer.
13 %%     
14 %% 2. Redistributions in binary form must reproduce the above copyright notice, 
15 %%    this list of conditions and the following disclaimer in the documentation
16 %%    and/or other materials provided with the distribution.
17 %%
18 %% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 %% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 %% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 %% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 %% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
23 %% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 %% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
25 %% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 %% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 %% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 %% POSSIBILITY OF SUCH DAMAGE.
29 %%
30 %% The views and conclusions contained in the software and documentation are
31 %% those of the authors and should not be interpreted as representing official
32 %% policies, either expressed or implied, of copyright holder.
33
34 %% -*- texinfo -*-
35 %% @deftypefn {Function File} {@var{h} = } drawEllipse (@var{elli})
36 %% @deftypefnx {Function File} {@var{h} = } drawEllipse (@var{xc}, @var{yc}, @var{ra}, @var{rb})
37 %% @deftypefnx {Function File} {@var{h} = } drawEllipse (@var{xc}, @var{yc}, @var{ra}, @var{rb}, @var{theta})
38 %% @deftypefnx {Function File} {@var{h} = } drawEllipse (@dots{}, @var{param}, @var{value})
39 %% Draw an ellipse on the current axis.
40 %%
41 %%   drawEllipse(ELLI);
42 %%   Draws the ellipse ELLI in the form [XC YC RA RB THETA], with center
43 %%   (XC, YC), with main axis of half-length RA and RB, and orientation
44 %%   THETA in degrees counted counter-clockwise.
45 %%   Puts all parameters into one single array.
46 %%
47 %%   drawEllipse(XC, YC, RA, RB);
48 %%   drawEllipse(XC, YC, RA, RB, THETA);
49 %%   Specifies ellipse parameters as separate arguments (old syntax).
50 %%
51 %%   drawEllipse(..., NAME, VALUE);
52 %%   Specifies drawing style of ellipse, see the help of plot function.
53 %%
54 %%   H = drawEllipse(...);
55 %%   Also returns handles to the created line objects.
56 %%
57 %%   -> Parameters can also be arrays. In this case, all arrays are supposed 
58 %%   to have the same size.
59 %%
60 %%   Example: 
61 %%   @example
62 %%   % Draw an ellipse centered in [50 50], with semi major axis length of
63 %%   % 40, semi minor axis length of 20, and rotated by 30 degrees.
64 %%     figure(1); clf; hold on;
65 %%     drawEllipse([50 50 40 20 30]);
66 %%     axis equal;
67 %% @end example
68 %%
69 %%   @seealso{ellipses2d, drawCircle, drawEllipseArc, ellipseAsPolygon}
70 %% @end deftypefn
71
72 function varargout = drawEllipse(varargin)
73
74   % extract dawing style strings
75   styles = {};
76   for i = 1:length(varargin)
77       if ischar(varargin{i})
78           styles = varargin(i:end);
79           varargin(i:end) = [];
80           break;
81       end
82   end
83
84   % extract ellipse parameters
85   if length(varargin)==1
86       % ellipse is given in a single array
87       ellipse = varargin{1};
88       x0 = ellipse(:, 1);
89       y0 = ellipse(:, 2);
90       a  = ellipse(:, 3);
91       b  = ellipse(:, 4);
92       if length(ellipse)>4
93           theta = ellipse(:, 5);
94       else
95           theta = zeros(size(x0));
96       end
97       
98   elseif length(varargin)>=4
99       % ellipse parameters given as separate arrays
100       x0 = varargin{1};
101       y0 = varargin{2};
102       a  = varargin{3};
103       b  = varargin{4};
104       if length(varargin)>4
105           theta = varargin{5};
106       else
107           theta = zeros(size(x0));
108       end
109       
110   else
111       error('drawEllipse: incorrect input arguments');
112   end
113
114
115   %% Process drawing of a set of ellipses
116
117   % angular positions of vertices
118   t = linspace(0, 2*pi, 145);
119
120   % compute position of points to draw each ellipse
121   h = zeros(length(x0), 1);
122   for i = 1:length(x0)
123       % pre-compute rotation angles (given in degrees)
124       cot = cosd(theta(i));
125       sit = sind(theta(i));
126       
127       % compute position of points used to draw current ellipse
128       xt = x0(i) + a(i) * cos(t) * cot - b(i) * sin(t) * sit;
129       yt = y0(i) + a(i) * cos(t) * sit + b(i) * sin(t) * cot;
130       
131       % stores handle to graphic object
132       h(i) = plot(xt, yt, styles{:});
133   end
134
135   % return handles if required
136   if nargout > 0
137       varargout = {h};
138   end
139
140 endfunction
141