% POLYROOTS  GUI pro demostraci hledani a zobrazovani korenu polynomu.
% ~~~~~~~~~  Umoznuje zadat koeficienty polynomu a nasledne vypocte 
%            a zobrazi jeho koreny.
% 
% Volani:  polyroots(akce)
% ~~~~~~~
%          IN:  akce ...... identifikator provadene akce,
%                           jestlize zadny, potom 'init'
%
% Poznamky: Opravdu jen ukazkovy programek ...
% ~~~~~~~~~

% Verze: 1
% Datum: 19.4.2003
% Autor: Michal Hajzman

function polyroots(akce)
  
  
if nargin == 0                                        % v pripade nezadanych parametru
  akce = 'init';
end


switch akce
  
  % Inicializace
  % ************
  case 'init'                                                % definice mluvi za vse ... 
    
    figure('Name', '/// Poly Roots ///', ...
	   'NumberTitle', 'off');
    
    axes('Tag', 'axOsy', ...
	 'Units', 'normalized', ...
	 'Position', [ 0.4 0.1 0.55 0.80]);
  
    
    uicontrol('Style', 'frame', ...
	      'Units', 'normalized', ...
	      'Position', [0.02 0.02 0.28 0.96]);	       

    uicontrol('Style', 'text', ...
	      'Units', 'normalized', ...
	      'Position', [0.05 0.7 0.2 0.06], ...
	      'String', 'Koeficienty polynomu:', ...
	      'HorizontalAlignment', 'left');    

    uicontrol('Tag', 'edKoefy', ...
              'Style', 'edit', ...
	      'Units', 'normalized', ...
	      'Position', [0.05 0.6 0.2 0.06], ...
	      'HorizontalAlignment', 'left');


    uicontrol('Tag', 'pbPerform', ...
              'Style', 'PushButton', ...
	      'Units', 'normalized', ...
	      'Position', [0.05 0.2 0.2 0.08], ...
	      'String', 'Perform', ...
	      'CallBack', 'polyroots(''perform'')');

  % Find Roots 'n' Draw
  % *******************
  case 'perform'
  
   strKoefy = get(findobj('Tag','edKoefy'),'String');        % nacteni koeficientu polynomu - retezec
   if ~strcmp(deblank(strKoefy),'')                          % jestlize bylo neco zadano
     koefs = str2num(strKoefy);                              %   prevedeni na cisla 
     if ~isempty(koefs)                                      %   jestlize spravne zadana cisla  
       koreny = roots(koefs)                                 %     nalezeni korenu
       max_k = max(real(koreny));                            %     maximuma a minimum pro
       min_k = min(real(koreny));                            %     vykreslovani ...
       x = [min_k-5:0.01:max_k+5];                           %     x-ove hodnoty
       y = polyval(koefs,x);                                 %     y-ove hodnoty
       axOsy =  findobj('Tag','axOsy');                      %     handle na vykreslovaci osy pro funkci
       axes(axOsy); hold on;                                 %     nastaveni os
       delete(get(axOsy,'Children'));                        %     vymazani predesle cary
       plot(x,y);                                            %     vykresleni polynomu 
       line([min_k-5 max_k+5],[0 0],'LineStyle','--');       %     vykresleni nulove cary 
       for k = koreny'                                       %       zobrazeni realnych korenu    
         if imag(k) == 0
	   h = plot(real(k),0,'ro');
	 end  
       end	 
     end
   end 
    
end   
