www.pudn.com > ellipse.rar > ellipse.m


function h=ellipse(ra,rb,ang,x0,y0,C,Nb)  
% Ellipse adds ellipses to the current plot  
%  
% ELLIPSE(ra,rb,ang,x0,y0) adds an ellipse with semimajor axis of ra,  
% a semimajor axis of radius rb, a semimajor axis of ang, centered at  
% the point x0,y0.  
%  
% The length of ra, rb, and ang should be the same.  
% If ra is a vector of length L and x0,y0 scalars, L ellipses  
% are added at point x0,y0.  
% If ra is a scalar and x0,y0 vectors of length M, M ellipse are with the same  
% radii are added at the points x0,y0.  
% If ra, x0, y0 are vectors of the same length L=M, M ellipses are added.  
% If ra is a vector of length L and x0, y0 are  vectors of length  
% M~=L, L*M ellipses are added, at each point x0,y0, L ellipses of radius ra.  
%  
% ELLIPSE(ra,rb,ang,x0,y0,C)  
% adds ellipses of color C. C may be a string ('r','b',...) or the RGB value.  
% If no color is specified, it makes automatic use of the colors specified by  
% the axes ColorOrder property. For several circles C may be a vector.  
%  
% ELLIPSE(ra,rb,ang,x0,y0,C,Nb), Nb specifies the number of points  
% used to draw the ellipse. The default value is 300. Nb may be used  
% for each ellipse individually.  
%  
% h=ELLIPSE(...) returns the handles to the ellipses.  
%  
% as a sample of how ellipse works, the following produces a red ellipse  
% tipped up at a 45 deg axis from the x axis  
% ellipse(1,2,pi/8,1,1,'r')  
%  
% note that if ra=rb, ELLIPSE plots a circle  
%  
% rewritten by Din-sue Fon. Dept. of Bio-Industrial Mechatronics Engineering,  
% National Taiwan University March 10,2001  
% dsfong@ccms.ntu.edu.tw  
% % rewritten by Din-sue Fon. Dept. of Bio-Industrial Mechatronics Engineering,  
% National Taiwan University March 10,2001  
% dsfong@ccms.ntu.edu.tw  
% written by D.G. Long, Brigham Young University, based on the  
% CIRCLES.m original  
% written by Peter Blattner, Institute of Microtechnology, University of  
% Neuchatel, Switzerland, blattner@imt.unine.ch  
  % Check the number of input arguments  
switch nargin  
case 0  
   ra=1;rb=1;ang=0;x0=0;y0=0;C=[];Nb=300;  
case 1  
   rb=ra;ang=0;x0=0;y0=0;C=[];Nb=300;  
case 2  
   ang=0;x0=0;y0=0;C=[];Nb=300;  
case 3  
   x0=0;y0=0;C=[];Nb=300;  
case 4  
   y0=zeros(1,length(x0));C=[];Nb=300;  
case 5  
   C=[];Nb=300;  
case 6  
   Nb=300;  
end  
   
 % set up the default values  
 if isempty(ra),ra=1;end;  
if isempty(rb),rb=1;end;  
if isempty(ang),ang=0;end;  
if isempty(x0),x0=0;end;  
if isempty(y0),y0=0;end;  
if isempty(Nb),Nb=300;end;  
if isempty(C),C=get(gca,'colororder');end;  
 % work on the variable sizes  
 x0=x0(:);  
y0=y0(:);  
ra=ra(:);  
rb=rb(:);  
ang=ang(:);  
Nb=Nb(:);  
 if isstr(C),C=C(:);end;  
if length(x0)~=length(y0),  
   if length(y0)==1,  
      y0=ones(1,length(x0))*y0;  
   elseif length(x0)==1,  
      x0=ones(1,length(y0))*x0;  
   else  
      error('The lengths of x0 and y0 must be identical');  
   end;  
end; if length(ra)~=length(rb),  
   if length(ra)==1,  
      ra=ones(1,length(rb))*ra;  
   elseif length(x0)==1,  
      rb=ones(1,length(ra))*rb;  
   else  
      error('The lengths of ra and rb must be identical');  
   end;  
end;   % how many inscribed elllipses are plotted  
 if length(ra)~=length(x0)  
  maxk=length(ra)*length(x0);  
else  
  maxk=length(ra);  
end;  
    % drawing loop  
route=0;  
if length(x0)==1, route=1; end  
if length(ra)==1, route=2; end  
if length(x0)==length(ra), route=3; end  
if length(ang)>1 & length(ra)==1,  
   route=4;maxk=length(ang);  
end  
 for k=1:maxk  
  switch route  
  case 1  
    xpos=x0;  
    ypos=y0;  
    radm=ra(k);  
    radn=rb(k);  
    if length(ang)==1, an=ang; else an=ang(k); end;  
  case 2  
    xpos=x0(k);  
    ypos=y0(k);  
    radm=ra;  
    radn=rb;  
    if length(ang)==1, an=ang; else an=ang(k); end;  
  case 3  
    xpos=x0(k);  
    ypos=y0(k);  
    radm=ra(k);  
    radn=rb(k);  
    if length(ang)==1, an=ang; else an=ang(k); end;  
  case 4  
    xpos=x0;  
    ypos=y0;  
    radm=ra;  
    radn=rb;  
    an=ang(k);  
  otherwise  
    rada=ra(fix((k-1)/size(x0,1))+1);  
    radb=rb(fix((k-1)/size(x0,1))+1);  
    an=ang(fix((k-1)/size(x0,1))+1);  
    xpos=x0(rem(k-1,size(x0,1))+1);  
    ypos=y0(rem(k-1,size(y0,1))+1);  
  end;  
   co=cos(an);  
  si=sin(an);  
  the=linspace(0,2*pi,Nb(rem(k-1,size(Nb,1))+1,:)+1);  
%  x=radm*cos(the)*co-si*radn*sin(the)+xpos;  
%  y=radm*cos(the)*si+co*radn*sin(the)+ypos;  
  h(k)=line(radm*cos(the)*co-si*radn*sin(the)+xpos,radm*cos(the)*si+co*radn*sin(the)+ypos);  
  set(h(k),'color',C(rem(k-1,size(C,1))+1,:));  
 end;  
axis equal;grid on;