%  Contour plots mit GUI

%  Zuweisung der Handles
hStatus=findobj(gcbf,'Tag','Status');
hButton=findobj(gcbf,'Tag','Button');
hValue=findobj(gcbf,'Tag','Value');
hCheck=findobj(gcbf,'Tag','Check');

%  Umwandlung String->Value fuer n
n=eval(get(hValue,'String'));

%  Range-Check fuer n
if or(and(or((n<1),(n>4)),(get(hCheck,'Value')==1)),and(or((n<5),(n>30)),(get(hCheck,'Value')==0)));
  set(hStatus,'String','Wrong range !');
  set(findobj(gcbf,'Tag','Axes1'),'Children','');
else                    % Programm nur bei 1-3 

%-------------------BEGINN HAUPTPROGRAMM-----------------------------

set(hStatus,'String','please wait ...');

%  Anstehende Grafikausgaben aktualisieren
drawnow;

%  Schrittweite festlegen
h=1/64; 

%  Grenzen festlegen (xmin,xmax,ymin,ymax)
bounds=[-3.25 .75 -3.375 3.375];

%  Dynamische Korrektur der Grenzen und Schrittweite fuer n>4
if n>4 
  bounds=[n*(-0.26)-2.5 n*0.45-1.4 n*(-0.49)-1.42 n*0.49+1.42];
  h=h*n/2;
end;

%  Konturniveaus fuer Modulus & Phasen festlegen
vabs0=[0:.1:1];
vang0=[-.875:.125:1]*pi;

%  Matrix X und Y
x=bounds(1):h:bounds(2);
y=bounds(3):h:bounds(4);

%  meshgrid-Ersatz:
% [xx,yy]=meshgrid(x,y); a=xx+i*yy;
a=ones(size(y'))*x+i*y'*ones(size(x));

%  Einsermatrix t bzw. f
t=ones(size(a));         f=t;

% Festlegung der intersecting Lines bei n=2,3,4
if n <= 2, vabs=vabs0; vang=vang0;    % wegen kritischer Linien
  elseif n==3, vabs=[vabs0 .47140452]; vang=vang0;
  else vabs=[vabs0 .58882535 .27039477];
       vang=[vang0 1.48185376 -1.48185376];
end;


for count=1:n                           % NICHT i verwenden !!!!
                                        % i ist hier KEINE Variable
                                        % sondern Imaginaer !
  t=t.*a/count;                         % aktuelles Summenglied
                                        % 1, z, z*z/2, z*z*z/(2*3)
  f=f+t;                                % addieren der Summenglieder
end;

cla;                                    % letzte Ausgabe loeschen!
hold off;                               % grafische Vorbereitungen
axis(bounds);          axis image;      %  -"-
contour(x,y,abs(f), vabs);              % Ausgabe
hold on;
contour(x,y,angle(f), vang);            %  -"-

% --------------------HAUPTPROGRAMM ENDE----------------------------------

set(hStatus,'String','Enter value and press GO!');

end; 
