% ******************* MATEMATICKÝ SEMINÁŘ č. 9 ************************
% 9.1. GRAFICKÝ SUBSYSTÉM MATLABU
% 9.2. ZÁKLADY KRESLENÍ 2-D GRAFŮ
% 9.3. ZÁKLADY KRESLENÍ 3-D GRAFŮ
%
% Copyright (C) 1996-7 by V. Veselý (Masaryk University Brno, Czech Republic)



colordef none           

echo on
more on
format compact
clc
%======================================================================
% 9.1. GRAFICKÝ SUBSYSTÉM MATLABU
%%----------------------------------------------------------------------
%% Používá technologii grafických objektů hierarchicky uspořádaných
%% do stromové struktury typu rodič-děti (parent-children):
%%
%%                                    ROOT
%%                                     |
%%                                   FIGURE
%%                                     |
%%                        *------------*-------------*
%%                        |            |             |
%%                    UICONTROL       AXES         UIMENU
%%                                     |             |
%%                                     |           UIMENU
%%                                     |
%%                    *-----*------*-------*-------*------*     
%%                    |     |      |       |       |      |     
%%                  IMAGE  LINE  PATCH  SURFACE   TEXT  LIGHT   
%%
%% ROOT   = OBRAZOVKA
%%
%% FIGURE = OBRÁZEK: OBRAZOVKA je rodič, který může mít jako děti 
%%                   několik obrázků.
%%
%% UICONTROL = OVLÁDACÍ PRVEK
%%             - tlačítko: Push button nebo Radio button.
%%             - menu voleb: Popup menu.
%%             - stavové políčko: Check box.
%%             - numerický vstup ze seznamu: Slider.
%%             - editační vstupní pole: Editable text.
%%
%% AXES   = OSY   = SOUŘADNICE PRO KRESLENÍ GRAFŮ mohou mít za své děti:
%%
%%          IMAGE = DIGITÁLNÍ OBRAZ: matice barevných pixelů.
%%          LINE = KŘIVKA V ROVINĚ Nebo PROSTORU: lomená čára nebo
%%                 posloupnost bodů. Používá se při kreslení křivkových grafů.
%%          PATCH = POLYGONÁLNÍ ÚTVAR: mnohoúhelníkové plošky v rovině nebo
%%                  prostoru s možnosti vybarvení a zvýraznění hran.
%%          SURFACE = PLOCHA V Prostoru: čtyřúhelníky určené hodnotami funkce
%%                    dvou proměnných z=f(x,y) na pravoúhlé síti bodů v
%%                    rovině. Čtyřúhelníkové plošky mohou být opět vybarveny
%%                    a hranově zvýrazněny stejně jako u objektu PATCH.
%%                    Používá se při kreslení 3-D grafů.
%%          Elementární plošky objektů SURFACE a PATCH mohou být vybarveny i
%%          kontinuálně proměnnou barvou získanou vhodnou interpolací barev
%%          ve vrcholech.
%%          TEXT = TEXTOVÝ ELEMENT: Používá se k popisu os, titulkování grafů
%%                 apod.
%%          LIGHT = ZDROJ SVĚTLA: Používá se k osvětlení objektů typu 
%%                  SURFACE a PATCH. 
%%                                             
%% UIMENU = UŽIVATELSKÉ MENU: Po zvolení položky se provede uživatelem
%%                            definovaná akce, resp. se otevře podřízené
%%                            menu (menu mohou mít za své děti opět menu).
%%
%%
%% Každý objekt je identifikován číslem, tzv. 'handle' a má také
%% přiřazeny jisté vlastnosti, z nichž každá má své jméno 'PropertyName' ('PN')
%% a hodnotu 'PropertyValue' (PV): zpravidla skalár, někdy také text nebo
%% i číselná matice (většinou vektor).
%% Všechny vlastnosti mají definovány své implicitní (default) hodnoty, které 
%% lze měnit buď při vytváření objektů nebo i později pomocí příkazu 'set'.
%% Některé vlastnosti se dědí z rodičů na děti.
%%
%% ROOT má vždy handle=0,
%% FIGURE má za handle přirozené číslo, které se zobrazuje v jeho záhlaví.
%% Ostatní handly jsou reálná čísla, s nimiž je nutno pracovat V PLNÉ 
%% PŘESNOSTI.
%%
%%
%% Objekt se vytvoří pomocí příkazu stejného jména. Například:
%% ----------------------------------------------------------------------
%% h = figure ... vytvoří nový obrázek, jehož číslo 'handle' uloží do h.
%%                OBRÁZEK se může vytvořit tímto způsobem také zcela 
%%                automaticky, jestliže je zadán nějaký kreslící příkaz za 
%%                situace, kdy žádný obrázek neexistuje.
%%
%% h = figure('PN1',PV1,'PN2',PV2,...)
%%     ... totéž, ale s počátečním nastavením vybraných vlastností.
%%
%% figure(h)  ... aktivuje existující obrázek h pro následující kreslící 
%%                příkazy; každý obrázek je automaticky aktivován po svém 
%%                vytvoření; obrázek může být aktivován také asynchronně 
%%                (nekoordinovaně s programem) kliknutím myši do plochy 
%%                obrázku.
%%
%% h = gcf ... vrací handle aktivního obrázku (get current figure)

% Vytvoříme tři prázdné obrázky:
  figure
pause(1);
 figure
pause(1);
  figure
  h=gcf      % poslední vytvořený obrázek je aktivní
pause;
%----------------------------------------------------------------------
  figure(2)
  gcf        % nyní je druhý obrázek aktivní
pause;       % KLIKNĚTE Do Kreslící Plochy PRVNÍHO Obrázku
%----------------------------------------------------------------------
  gcf        % nyní je první obrázek aktivní
pause;
close all

%% Osy (AXES)
%% ----------------------------------------------------------------------
%% h = axes ... vytvoří objekt AXES v aktivním obrázku s implicitními 
%%              vlastnostmi. Číslo 'handle' uloží do h.
%%              OSY se mohou vytvořit také zcela automaticky, jestliže je zadán
%%              nějaký kreslící příkaz za situace, kdy žádný obrázek neexistuje
%%              (ten se vytvoří také automaticky) nebo v aktivním obrázku osy
%%              nejsou.
%%
%% h = axes('PN1',PV1,'PN2',PV2,...)
%%     ... totéž, ale s počátečním nastavením vybraných vlastností, většinou
%%         nastavujeme umístění a rozsah os:
%%
%% h = axes('Position',[x0,y0,xs,ys],'Xlim',[xmin,xmax],'Ylim',[ymin,ymax])
%%     x0,y0 ... umístění počátku souřadnic v normalizovaných souřadnicích:
%%               levý dolní roh = (0,0), pravý horní roh = (1,1)
%%     xs,ys ... délka osy x a y v normalizovaných délkách v intervalu [0,1].
%%     xmin,xmax ... rozsah nezávislé proměnné na ose x.
%%     ymin,ymax ... rozsah   závislé proměnné na ose y.
%%
%% axes(h)  ... aktivuje existující osy pro následující kreslící příkazy;
%%              aktivace os se řídí analogickými pravidly jako aktivace 
%%              obrázku.
%%
%% h = gca  ... vrací handle aktivních os v aktivním obrázku.
%%              (get current axes)
%% h = gco  ... vrací handle objektu, který byl naposledy aktivován myší;
%%              může to být buď okno nebo některé jeho dítě.
%%              (get current object)
%%
%% h = gco(fh) ... vrací handle objektu z fh, který byl naposledy aktivován 
%%                 myší; může to být buď přímo fh nebo některé jeho dítě.
%%

% Vytvoříme dva prázdné obrázky:
  figure(2)
  figure(1)

pause; % V aktivním obrázku (č. 1) nyní vytvoříme osy příkazem axes:
  ha1_1=axes;               % vytvoříme implicitní osy v obr. č.1
  gco                       % na nic jsme dosud neklikli, proto []
  gco(1)
pause; %  KLIKNĚTE DO OBDÉLNÍKU URČENÉHO OSAMI
%----------------------------------------------------------------------
  gco, gco(1)
pause; %  KLIKNĚTE MIMO OBDÉLNÍK URČENÝ OSAMI
%----------------------------------------------------------------------
  gco, gco(1)
pause;
%----------------------------------------------------------------------
% vytvoříme osy vlevo dole s implicitním rozsahem:
  figure(2); ha2_1=axes('Position',[0.1,0.1,0.3,0.2])
% vytvoříme osy uprostřed s předepsaným rozsahem:
  ha2_2=axes('Position',[0.5,0.5,0.3,0.2],'Xlim',[5,10],'Ylim',[-1,2])
pause;
close all

%% Aktuálně nastavené vlastnosti objektů s handlem h lze zjistit 
%% příkazem 'get':
%% ---------------------------------------------------------------------
%% get(h) ... výpis všech vlastností a jejich hodnot na displej.
%%
%% pV=get(h,'PN') ... uložení hodnoty vlastnosti 'PN' do proměnné pV.
%%
%% Vlastnosti existujícího objektu s handlem h lze měnit příkazem 'set':
%%
%% set(h) ... výpis všech vlastností a jejich možných hodnot na displej.
%%
%% set(h,'PN') ... výpis vlastnosti 'PN' a jejích možných hodnot na displej.
%%
%% set(h,'PN1',PV1,'PN2',PV2,...) ... nastavení vyjmenovaných vlastností
%%                                    na nové hodnoty.
%%
%% V rodičovském objektu, resp. v libovolném prarodičovském objektu lze
%% pro potomky ve všech generacích nastavit implicitní hodnoty tak, že
%% před jméno vlastnosti předřadíme slovo 'Default' zřetězené se jménem 
%% potomka. Místo skutečné hodnoty lze použít klíčové řetězce:
%%
%% 'factory': všichni nadále vytváření potomci specifikovaného jména budou
%%            mít implicitně nastavenu 'tovární' implicitní hodnotu.
%%
%% 'remove' : zruší implicitní nastavení pro potomky pro uvedenou vlastnost.
%%
%% reset(h) ... nastaví všechny vlastnosti objektů s handlem h (kromě polohy)
%%              na implicitní hodnoty.

% Vytvoříme tři prázdné obrázky:
  figure(1)
  figure(2)
  figure(3)
pause;
more on
  get(0)     % Aktuální nastavení vlastností obrazovky (ROOT):
  get(2)     % Aktuální nastavení 2.obrázku
pause;
%----------------------------------------------------------------------
  h=figure(3);
  set(h)                       % Možná nastavení
  set(h,'Name','Obrázek č. 3'); % Přiřadíme jméno obrázku (viz záhlaví)
pause;
%----------------------------------------------------------------------
  set(h,'DefaultAxesXlim',[-2,2]);  % Nastaví implicitní rozsah [-2,2] osy x:
  get(h,'DefaultAxesXlim')          % Výpis implicitního nastavení
  ha3_1=axes('Position',[0.1,0.1,0.3,0.2]),  % Vytvořené osy mají tento rozsah;
pause;
%----------------------------------------------------------------------
  set(h,'DefaultAxesXlim','remove');  % Implicitní nastavení zrušíme:
% Vytvořené osy mají opět původní implicitní rozsah (v tomto případě tovární):
  get(h,'DefaultAxesXlim')            % Výpis implicitního nastavení
  ha3_2=axes('Position',[0.5,0.5,0.3,0.2])
keyboard;
close all
more off

%% Libovolný grafický objekt lze zrušit:
%%----------------------------------------------------------------------
%% delete(h) ... zruší kterýkoli existující grafický objekt, jehož handle je h.
%%
%% clf       ... zruší všechny potomky aktivního obrázku (clear figure)
%% clf reset ... totéž + reset(gcf)
%%
%% cla       ... zruší všechny potomky aktivních os (clear axes)
%% cla reset ... totéž + reset(gca)
%%
%% Okna s obrázky lze pohodlněji rušit příkazem 'close':
%%
%% close(h) ... zruší okno h
%% close    ... zruší aktivní okno = close(gcf);
%% close('jmeno') ... zruší obrázkové okno uvedeného jména
%%                    (vlastnost 'Name'=jmeno)
%% close all      ... zruší všechna obrázková okna

% Vytvoříme tři prázdné obrázky:
  figure(1)
  figure(2)
  figure(3)
% V obrázcích nyní vytvoříme osy příkazem axes:
  figure(1); 
    ha1_1=axes;    
  figure(2); 
    ha2_1=axes('Position',[0.1,0.1,0.3,0.2])
    ha2_2=axes('Position',[0.5,0.5,0.3,0.2],'Xlim',[5,10],'Ylim',[-1,2])
  figure(3);
    set(3,'Name','Obrázek č. 3'); % Přiřadíme jméno obrázku (viz záhlaví)
    ha3_1=axes('Position',[0.1,0.1,0.3,0.2])
    ha3_2=axes('Position',[0.5,0.5,0.3,0.2])
  
pause;

% Zrušíme aktivní osy v obr. 3:
  figure(2);         % OBRÁZEK 2 je aktivní
pause;
%----------------------------------------------------------------------
  axes(ha3_2);       % Nyní obr. 3 a osy ha3_2 jsou aktivní
  ha3_2
  get(gcf,'Children')% Výpis handlu dětí - první jsou vždy aktivní osy: ha3_2
pause;
%----------------------------------------------------------------------
  axes(ha3_1);       % Nyní obr. 3  a osy ha3_1 jsou aktivní
  get(gcf,'Children')% Výpis handlu dětí  - teď jsou první ha3_1
pause;
%----------------------------------------------------------------------
  delete(gca);       % Zrušíme aktivní osy
pause;
%----------------------------------------------------------------------
  delete(gca);       % a ještě jednou
pause;
%----------------------------------------------------------------------
  figure(2);
  clf                % Zrušíme všechny potomky (v tomto případě jen osy)
pause;
%----------------------------------------------------------------------
  close('Obrázek č. 3')  % Zrušíme 3. obrázek
  pause;
  close all             % Zrušíme zbývající obrázky

%% Vlastností jednotlivých objektů je mnoho a v online dokumentaci 
%% k MATLABU jsou popsány v hlavní nabídce (příkaz 'doc') v odkazu 
%% 'Handle Graphic Objects'. 
%%
%% Existuje interaktivní prostředek (příkaz 'guide') pro návrh uživatelského
%% grafického rozhraní při programování složitých aplikací.
%% Podrobnosti - viz online PDF manuál: Building GUIs with MATLAB.
%%
%% Některé speciální grafické příkazy zprostředkovávají nastavení některých
%% vlastností, např. příkaz 'subplot' (viz. dále), který usnadňuje kreslení
%% více grafů do jednoho obrázku, takže uživatel nemusí osy umísťovat sám.
%% Podobně příkaz 'axis' nastavuje rozsah os a jejich další vlastnosti.
%% Vlastní příkazy pro kreslení (např. 'plot') však umí nastavit tyto rozsahy
%% i automaticky podle rozměru vykreslovaného útvaru (křivky, plochy apod.).
%%
%% V dalším probereme prozatím pouze nejdůležitější příkazy pro kreslení
%% v rovině a prostoru.
help graphics
pause;

%======================================================================
% 9.2. ZÁKLADY KRESLENÍ 2-D GRAFŮ
%----------------------------------------------------------------------
%% Příkaz plot pro kreslení elementárních x-y grafů:
%% ------------------------------------------------
%% Nechť x je vektor n x 1, X a Y matice n x m.
%% Pak
%% plot(x  ,Y)
%% plot(x.',Y)   ... vykreslí m křivek Y(:,1),...,Y(:,m) vůči x.
%% plot(x  ,Y.')
%% plot(x.',Y.') ... totéž, pokud m~=n (vykresluje podél téhož rozměru jako 
%%                   má x)
%% plot(Y)       ... totéž jako plot(1:n,Y), tj. vykreslení vůči indexům.
%% plot(X,Y)     ... vykreslí m křivek: Y(:,j) vůči X(:,j) pro j=1,2,..,m.
%% Je-li vykreslováno více křivek současně, pak se automaticky kreslí jiným
%% typem čáry.
%% Typ čáry je však možno předepsat přidáním třetího parametru typu řetězec, 
%% např.
%% plot(X,Y,s) ... všechny křivky se vykreslí týmž způsobem dle s takto:
%%
%%    s='b' | 't' | 'tt' | 'bt' | 'btt' | 'tb' | 'ttb'
%% kde
%% b           ... znak udávající barvu
%% t, resp. tt ... jeden, resp. dva znaky pro typ čáry případně tvar bodů
%%
%%            barva                          čárový graf
%%    -----------------------         -------------------------------
%%    y ... žlutá (yellow)            -  ... plnou čarou (implicitní)
%%    m ... fialová (magenta)         -- ... čárkované
%%    c ... tyrkysová (cyan)          :  ... tečkované
%%    r ... červená (red)             -. ... čerchované
%%    g ... zelená (green)
%%    b ... modrá (blue)                     bodový graf
%%    w ... bílá (white)              -------------------------------
%%    k ... černá (black)             .  ... z teček
%%    i ... neviditelná (invisible)   o  ... z kroužků (písmeno 'o')
%%          (smazání čáry)            x  ... z křížků  (písmeno 'x')
%%                                    +  ... z plusů
%%                                    *  ... z hvězdiček
%%
%% Trojice X,Y,s lze opakovat a vykreslit tak několik skupin křivek,
%% každou skupinu jiným způsobem:
%% plot(X1,Y1,s1,X2,Y2,s2,...)
%%
%% Na konec seznamu vstupních parametrů lze také přidat nastavení 
%% některých vlastností pro všechny objekty LINE vytvářené příkazem 'plot':
%% plot(...,'PN1',PV1,'PN2',PV2,...)
%%
%% Pro všechny tvary příkazu plot lze též užít formu:
%% h = plot(...) ... vrací sloupcový vektor handlů všech objektů LINE
%%                   vytvořených příkazem 'plot'.
%%
%% Příkaz plot automaticky nastaví rozsah optimálně pro všechny hromadně
%% vykreslované křivky.
%%

% Vykreslíme 5 sinusovek s různou amplitudou:
  A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]
  plot(x,Y)
pause;
%----------------------------------------------------------------------
% Implicitní tloušťka čáry 'LineWidth'=0.5
% Hned v příkazu 'plot' můžeme doplnit na konec seznamu vstupních parametrů
% např. požadavek na nastavení větší tloušťky čar:
  plot(x,Y,'LineWidth',2);
pause;
%----------------------------------------------------------------------
% Bodové:
  plot(x,Y,'bo');
pause;
%----------------------------------------------------------------------
% Každou křivku jinak:
  h=plot(x,Y(:,1),'b*',x,Y(:,2),'b--',x,Y(:,3),'b-.',x,Y(:,4),'b:',...
         x,Y(:,5),'bx');
pause;
close
%% Příkaz subplot pro kreslení několika x-y grafů do jednoho obrázku:
%% ---------------------------------------------------------------------
%% Příkaz usnadňuje umístění několika os do jednoho obrázku (viz příkaz 
%% 'axes').
%% OSY se umísťují dlaždicovitě do matice m x n a číslují se pořadovým číslem p
%% po řádcích zleva doprava a odshora dolů.
%%
%% h = subplot(m,n,p) ... vrátí handle os na p-té pozici ve schématu m x n,
%%                        tyto osy se současně stávají aktivní pro následující
%%                        kreslící příkazy, např. 'plot'.
%% Jestliže 1 <= m,n,p <= 9 lze použít zkrácenou formu, kde místo tři parametrů
%% m,n,p se žádá pouze jeden ve tvaru tříciferného čísla mnp:
%% h = subplot(mnp)
%%
%% subplot(h) ... aktivuje osy s handlem h
%% h = subplot('Position',[x0,y0,xs,ys]) ... vytvoří a aktivuje osy jako 
%%                                           'axes':
%%     x0,y0 ... umístění počátku souřadnic v normalizovaných souřadnicích:
%%               levý dolní roh = (0,0), pravý horní roh = (1,1)
%%     xs,ys ... délka osy x a y v normalizovaných délkách v intervalu [0,1].
%%
%% !POZOR! Jestliže mnp forma příkazu subplot vytváří osy, které se překrývají
%%         s již existujícími osami, pak původní osy se zruší.
%%         Ostatní formy příkazu subplot však tuto vlastnost nemají a chovají 
%%         se podobně jako příkaz 'axes'. Zejména subplot(111) zruší všechny
%%         existující osy a vytvoří standardní osy přes celý obrázek.
  
  A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]
 for k=1:5
      subplot(2,3,k);
      plot(x,Y(:,k),'k');
  end
pause;
close

%% Příkaz hold umožňuje přidávat grafy k existujícím grafům:
%% ----------------------------------------------------------------------
%% hold on  ... zapne režim přidávání pro aktuální osy (hold=podrž).
%% hold off ... vypne režim přidávání (implicitní stav po spuštění MATLABu), 
%%              kdy následující plot maže předchozí graf.
%% hold     ... přepne tento režim z on->off nebo z off->on.
%% n=ishold ... =1, je-li režim přidávání zapnut
%%              =0, je-li režim přidávání vypnut

% Grafy z předchozích příkladů vykreslíme v cyklu:
  A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]

  typ=char('b*','b--','b-.','b:','bx')            
  close all;
  hold on;
  ishold
  for k=1:5
      plot(x,Y(:,k),typ(k,:));
      pause(1);
  end
  hold off
  ishold
pause;
close 

%% Zcela analogicky jako 'plot' se používají příkazy:
%% -------------------------------------------------------------------
%% semilogx ... x-osa logaritmicky při základu 10, y lineárně
%% semilogy ... y-osa logaritmicky při základu 10, x lineárně
%% loglog   ... obě osy logaritmicky při základu 10
%% polar    ... graf v polárních souřadnicích: x=theta, y=rho
%%              v tomto případě však X i Y musí být vektory.
   
  A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]

  figure;
  semilogx(1+x,Y);
pause;
%----------------------------------------------------------------------
  semilogy(x,10+Y);
pause;
%----------------------------------------------------------------------
  loglog(1+x,10+Y);
pause;
%----------------------------------------------------------------------
% Nakreslíme kružnici o poloměru 1:
  rho=ones(length(x),1);
  polar(x,rho);
pause;
%----------------------------------------------------------------------
% Parametrickou křivku však můžeme vykreslovat i pomocí 'plot' takto:
  plot(rho.*cos(x),rho.*sin(x));
pause;
%----------------------------------------------------------------------
% Nebo více kružnic současně o poloměrech 1 až 5:
  plot((rho.*cos(x))*A,(rho.*sin(x))*A);
pause;
%----------------------------------------------------------------------
% Přikreslíme ještě dvě elipsy:
  hold on;
  plot(2*cos(x),sin(x));
  plot(4*cos(x),2*sin(x));
  hold off;
pause;
close

%% Konverze kartézských souřadnic na polární a naopak:
%% ---------------------------------------------------------------------
%% [theta,rho]=cart2pol(x,y) ... konverze kartézských souřadnic na polární
%% [x,y]=pol2cart(theta,rho) ... konverze polárních souřadnic na kartézské
%%
%% kde
%%
%% theta, rho, x, y jsou matice stejných rozměrů, přičemž
%% theta(r,s), rho(r,s) jsou polární souřadnice bodů [x(r,s),y(r,s)]
%% pro každé r,s (theta(r,s) v radiánech).
%%

  x=linspace(0,2*pi).';                   % sloupec
  xe=2*cos(x); ye=sin(x);                 % Kartézské souřadnice elipsy
  th=atan2(ye,xe); ro=sqrt(xe.^2+ye.^2);  % Polární souřadnice elipsy 
  [thh,roo]=cart2pol(xe,ye);
  max(abs(thh-th)), max(abs(roo-ro))
  [xee,yee]=pol2cart(th,ro);
  max(abs(xee-xe)), max(abs(yee-ye))     
% Výsledky konverze souhlasí v rámci numerických chyb
pause;

%% K objektu os lze přidat mříž ('grid') pro snadnější odečítání souřadnic
%% -----------------------------------------------------------------------
%% grid on  ... zapnutí režimu přidání mříže k aktuálním osám
%% grid off ... vypnutí režimu přidání mříže k aktuálním osám
%%              (implicitní stav po spuštění MATLABU)
%% grid     ... přepne tento režim z off->on nebo z on->off

  figure(1);
  grid;
pause;
grid;
pause;
close

%% TEXTOVÉ POPISY (děti os):
%% -------------------------
%% title(t) ... textový vektor t umístí jako titulek aktuálních os
%% title (t,'PN1',PV1,'PN2',PV2,...)
%%          ... totéž, ale s počátečním nastavením vybraných vlastností:
%%
%% Zcela analogicky se provádí popis os:
%% xlabel(t) ... popis osy x
%% ylabel(t) ... popis osy y
%%
%% TEXT umístěný na zadané souřadnice aktuálních os:
%% text(x,y,t) ... - x,y skaláry: umístí text t na pozici (x,y)
%%                 - x,y vektory téže délky n:
%%                   umístí text t na všechny pozice (x(k),y(k)), k=1,...,n;
%%                   je-li t textová matice o n řádcích, umístí t(k,:) na
%%                   pozici (x(k),y(k)) pro k=1,...,n.
%%
%% TEXT umístěný pomocí myši:
%% gtext(t) ... v aktuálním okně zobrazí kříž a čeká až jej obsluha umístí
%%              na požadovanou pozici a stiskne některé tlačítko myši nebo
%%              nějakou klávesu na klávesnici.
%%
%% POZNÁMKA: Při vhodné volbě fontu (viz příslušné vlastnosti objektů TEXT)
%%           lze grafy popisovat i česky. Problémy jsou ovšem při jejich tisku
%%           příkazem 'print' - ten totiž nemá zabudovány české fonty pro tisk,
%%           takže kódy českých znaků se vytisknou jako jiný znak.
%%

  figure(1);
% Vykreslíme 5 sinusovek s různou amplitudou:
  A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]
  plot(x,Y)
pause;

  title('Několik sinusovek');
  xlabel('osa x');
  ylabel('osa y');
  text(5,4,'SINUSOVKY');
  disp('UMÍSTĚTE TEXT DO OBRÁZKU POMOCÍ MYŠI');
  gtext('UMÍSTĚNÝ TEXT');
pause;
%----------------------------------------------------------------------
% Popíšeme jednotlivé křivky údaji o amplitudě:
  At=[ones(5,1)*'A=',num2str(A.')]
  text(ones(1,5)*pi./2,A*sin(pi./2)+0.2,At);
  grid on;    % zapneme mříž
pause;
close

%% Legenda ke grafu:
%%----------------------------------------------------------------------
%% h=legend(t1,t2,t3, ...) ... 
%%        ... umístí legendu do aktuálních os, přičemž jednotlivé čáry 
%%            jsou v pořadí, jak byly vytvářeny, popsány svým typem a 
%%            textovými vektory t1,t2,t3,...
%% h=legend(s1,t1,s2,t2, ...) ... 
%%        ... analogicky, typ/barva čáry (viz plot) se však nepřebírá z 
%%            grafu, ale je explicitně určen řetězci s1 k t1, s2 k t2,...
%% h=legend(h,...) ... analogicky jako výše přiřadí legendu ke grafu v osách
%%                     určených handlem h. 
%% h=legend(T)   ... T=[t1;t2;...] je textová matice s popisy do legendy
%% h=legend(H,T) ... totéž, avšak pro popis čar určených (v daném pořadí) 
%%                   explicitně vektorem handlu H.
%% h=legend off  ... odstraní legendu z aktuálních os.
%% h=legend(...,tol) ... nastaví toleranci pro překrytí datových bodů 
%%                       legendou, nelze-li toleranci dodržet, bude graf 
%%                       rozměrově transformován a legenda umístěna vně. 
%%                       Speciální volby:
%%                  tol = -1 ... legenda bude vždy vně grafu 
%%                  tol =  0 ... legenda bude uvnitř grafu i za cenu, že
%%                                   dojde k překrytí, kterému se nelze 
%%                                   vyhnout
%%
%% Legendu lze tažením myši přemístit na jiné místo.
%%
%% !POZOR! Legenda je realizovaná jako osy s handlem h překrývající osy grafu. 
%%         Po vytvoření nejsou osy legendy aktuální.
%%         Proto před tiskem je nutno zařídit aktualizaci os legendy příkazem
%%         axes(h), aby do tisku šly nejdříve vlastní grafy a pak teprve 
%%         legenda. Jinak by se mohlo stát, že čáry mřížky (grid), resp. čáry 
%%         grafu poškodí legendu.
%%         Naopak při běžné práci NESMÍ Být osy legendy aktuální, jinak
%%         následné kreslící příkazy budou nechtěně zapisovat do os legendy.
%%


  A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]

  fig3=figure
  plot(x,Y)
  hl=legend('sin1','sin2','sin3','sin4','sin5')
  get(gcf,'Children')  % OSY legendy nejsou aktivní, neboť nejsou 
                       % první v seznamu Children
pause;
%----------------------------------------------------------------------
  axes(hl)             % Aktivuje osy legendy
  get(gcf,'Children')  
line(x,Y);           % Kreslí nechtěně do legendy    
pause;
%----------------------------------------------------------------------
  delete(hl);          % Zrušíme legendu
pause;
%----------------------------------------------------------------------
% Vytvoříme legendu znovu pomocí handlu čar:
  hl=get(gca,'Children'), nhl=length(hl)              % čáry jsou děti os
  sintxt=char('sin1','sin2','sin3','sin4','sin5')  % matice popisu legendy  
  legend(hl(nhl:-1:1),sintxt);      % POZOR: čáry jsou v seznamu v opačném
                                    % pořadí než jak byly vytvářeny.
                                    % Předpokládáme, že jsou to jediné děti.
keyboard;   % Zrušte legendu pomocí legend off a vyzkoušejte ostatní způsoby 
close 

%% SNÍMÁNÍ Souřadnic Z Aktuálních Os Pomocí 'ginput' a příkaz 'zoom':
%% ------------------------------------------------------------------
%% [x,y,b]=ginput(N) ...
%%    ... V aktuálním okně zobrazí kříž. Snímá souřadnice nejvýše N bodů, na
%%        kterých obsluha stiskne některé tlačítko myši nebo klávesu na
%%        klávesnici. Klávesa ENTER ukončí vstup ještě před dosažením limitu N.
%%        x,y,b jsou sloupcové vektory, kde
%%        x(k) ... x-souřadnice k-ho sejmutého bodu
%%        y(k) ... y-souřadnice k-ho sejmutého bodu
%%        b(k) ... číslo tlačítka myši (1=levé, 2=prostřední, 3=pravé), resp.
%%                 ASCII kód klávesy, kterým byl sejmut k-tý bod.
%%                 Ukončovací ENTER nesnímá bod.
%% [x,y,b]=ginput ... snímá nekonečně mnoho bodů - nutno ukončit pomocí ENTER.
%% Lze též užít formy se dvěma nebo jedním výstupním parametrem:
%% [x,y]=ginput(N) nebo XY=ginput(N) (podobné s vynecháním N), kde
%% XY je dvousloupcová matice [x,y].
%%-------------------------------------------------------------------
%% Příkaz 'zoom' pro zvětšení/zmenšení detailů na aktuálním obrázku:
%% zoom on  ... zapne režim Zoom, v němž každý stisk levého tlačítka myši
%%              vždy zvětší na dvojnásobnou velikost detail v okolí bodu 
%%              kliknutí. Zpětné zmenšování se provádí postupným stiskem 
%%              pravého tlačítka až do původní velikosti (zmenšovat nelze).
%%              Zvětšovanou oblast lze přesněji vymezit tažením myši při
%%              stisknutém levém tlačítku.
%% zoom off ... vypne režim Zoom (zvětšení zůstane zachováno).
%% zoom     ... přepne režim Zoom ze stavu off->on nebo z on->off.
%% zoom out ... odstraní zvětšení, tj. obnoví původní graf (i při vypnutém
%%              režimu Zoom).
%% !POZOR: nepoužívejte příkaz 'ginput' přímo v zapnutém režimu Zoom.
%%         Po zvětšení detailů Zoom vypněte a pak teprve snímejte. 

 A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]

 plot(x,Y)


  zoom on;     
pause;      % ZVĚTŠETE DETAIL V OKOLÍ PRŮSEČÍKU KŘIVEK
%----------------------------------------------------------------------
  zoom off 
  disp('SEJMĚTE DVA BODY')
  [x,y,b]=ginput(2)

pause;
  zoom out
  disp('JEŠTĚ JEDNOU JINAK - snímání ukončete klávesou ENTER');
  xY=ginput
keyboard;
close;

%% Příkaz 'axis' pro snadné nastavení často používaných vlastností
%% aktuálních os
%%-------------------------------------------------------------------
%% Nechť r=[xmin,xmax,ymin,ymax] značí vektor 1 x 4 udávající rozsah os, pak
%% r=axis  ... vrací rozsah aktuálních os
%% axis(r) ... nastaví aktuální osy na daný rozsah a vypne režim automatické
%%             volby rozsahu pro následující grafy, tj. nastaví
%%             tzv. režim 'manual'.
%%             Speciálně: axis(axis) ... zafixuje stávající rozsah os.
%% axis('auto') ... zapne režim automatické volby rozsahu
%%                  (implicitní stav po spuštění MATLABU).
%% axis('equal')... sjednotí měřítka os x a y tak, aby kružnice nevypadala jako
%%                  elipsa.
%% axis('square') ... oblast os změní na čtvercovou
%% axis('image') ... v grafu digitálního obrazu (objet IMAGE) změní měřítko 
%%                   tak, aby jednotlivé pixely byly ve formě vybarvených 
%%                   čtverečků, nikoliv obdélníků (což je implicitní stav).
%% axis('normal') ... Oblast os změní na normální plný rozsah, tj. odstraní
%%                    účinek předchozích tří forem 'equal', 'square' a 'image'.
%%                    (implicitní stav po spuštění MATLABu).
%% axis('ij') ... reverzuje číselný rozsah na ose y, tak aby odpovídal
%%                maticovému formátu, kdy je počátek v levém horním rohu a
%%                řádkový index i vzrůstá odshora dolů a
%%                sloupcový index j zleva doprava.
%% axis('xy') ... zapne normální kartézský souřadný systém s levým dolním
%%                rohem jako počátkem souřadnic.
%%                (implicitní stav po spuštění MATLABU).
%% axis('off') ... vypne popis os včetně zátrhu
%% axis('on')  ... zapne popis os včetně zátrhu
%%                 (implicitní stav po spuštění MATLABU).
%% [s1,s2,s3]=axis('state') ... vrátí řetězce indikující okamžitý stav
%%                              těchto tří vlastností aktuálních os:
%%                              S1 = 'auto' | 'manual'
%%                              S2 = 'on'   | 'off'
%%                              S3 = 'xy'   | 'ij'
%%

  
A=1:5;                 % amplitudy
  x=linspace(0,2*pi).';  % sloupec
  Y=sin(x)*A;            % Y = [A(1)*sin(x),A(2)*sin(x),...]

 figure(1);
 plot(x,Y);

  

  [S1,S2,S3]=axis('state')
  r=axis
  axis([r(1)-1,r(2)+1,r(3)-0.5,r(4)+0.5]); % Zvětšíme rozsah os
  [S1,S2,S3]=axis('state')
pause;
%-------------------------------------------------------------------
  axis('auto');     % Přepneme zpět do automatického režimu
  [S1,S2,S3]=axis('state')
pause;
%-------------------------------------------------------------------
  axis('off');      % Zrušíme osy
  [S1,S2,S3]=axis('state')
pause;
%-------------------------------------------------------------------
  axis('on');       % Obnovíme osy
  [S1,S2,S3]=axis('state')
pause;
%-------------------------------------------------------------------
  axis('ij');       % Maticový souřadný systém
  [S1,S2,S3]=axis('state')
pause;
%-------------------------------------------------------------------
  axis('xy');       % Kartézský souřadný systém
  [S1,S2,S3]=axis('state')
pause;
%-------------------------------------------------------------------
  figure(2)
  rho=ones(length(x),1);
  plot((rho.*cos(x))*A,(rho.*sin(x))*A);
  axis('equal');    % Odstraní oválnost kružnic
pause;
%-------------------------------------------------------------------
  axis('normal');   % Opět obnoví původní stav
pause;
%-------------------------------------------------------------------
  axis('square');   % Opět odstraní oválnost, neboť graf kružnice má
                    % stejně rozsahy na obou osách.
keyboard;
close all 

%======================================================================
% 9.3. ZÁKLADY KRESLENÍ 3-D GRAFŮ
%----------------------------------------------------------------------
%% Příkaz 'plot3' pro kreslení parametrických křivek v prostoru  
%% ------------------------------------------------------------  
%% Je analogií příkazu plot:
%% Nechť x,y,z jsou vektory n x 1, resp. X,Y,Z matice n x m.
%% Pak
%% plot3(x,y,z) ... vykreslí parametricky zadanou křivku [x(t),y(t),z(t)]
%%                  t=1,2,...,n
%% plot3(X,Y,Z) ... vykreslí m křivek plot3(X(:,k),Y(:,k),Z(:,k)), k=1,2,...,m.
%% plot3(X,Y,Z,s) ... vykreslí typem čáry s (viz 'plot') 
%% plot3(X1,Y1,Z1,s1,X2,Y2,Z2,s2,...) ... více skupin čar zadaných typů
%% plot3(...,'PN1',PV1,'PN2',PV2,...) ... navíc s počátečním nastavením
%%                                        některých vlastností vytvářených v 
%%                                        objektu LINE.
%% h=plot3(...) ... vrací sloupcový vektor handlů všech objektů LINE
%%                   vytvořených příkazem 'plot3'.

  close all
  t = 0:pi/50:10*pi;
  x=cos(t); y=sin(t); z=t;
  plot3(x,y,z);
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
close

%% Většinu relevantních příkazů 2-D grafiky lze užít i v případě 3-D grafiky:
%% subplot, hold, grid 
%% [theta,rho,z]=cart2pol(x,y,z) ... konverze kartézských souřadnic na 
%%                                   cylindrické (místo polárních)
%% [x,y,z]=pol2cart(theta,rho,z) ... a zpět.
%%
%% Navíc jsou k dispozici další dva konverzní příkazy:
%%
%% [az,el,rho] = cart2sph(x,y,z) ... konverze kartézských souřadnic na sférické
%% [x,y,z] = sph2cart(až,el,rho) ... a zpět.
%%            rho       ... délka úsečky spojující bod s počátkem (průvodič)
%%           -pí<=až<pí ... azimut=úhel, který svírá průmět průvodiče do
%%                          roviny x-y s kladnou poloosou x proti směru
%%                          hodinových ručiček.
%%           -pí<=el<pí ... elevační úhel=úhel, který svírá průvodič
%%                          s rovinou x-y (kladné hodnoty pro poloprostor z>0) 
%%
%% TEXTOVÉ POPISY: title, text, gtext, legend, xlabel, ylabel a navíc:
%% zlabel(t) ... popis osy z
%%
%% Interaktivní příkazy: ginput (Nikoliv 'zoom')
%% Vlastnosti os: axis, 
%% kde rozsah os je 6-prvkový vektor r=[xmin,xmax,ymin,ymax,zmin,zmax].
%%
  
  t = 0:pi/50:10*pi;
  x=cos(t); y=sin(t); z=t;
  plot3(x,y,z);

  grid on;     
  r=axis
  [az,el,rho] = cart2sph(x,y,z);
keyboard;  % Prostudujte vektory az, el a rho.
close

%% Příkaz 'mesh' pro kreslení drátového grafu parametrických ploch 
%% v prostoru 
%%-------------------------------------------------------------------
%% Nechť 
%% x je vektor x-ových souřadnic délky n 
%% y je vektor y-ových souřadnic délky m
%% X,Y,Z,C ... matice rozměru m x n (sloupce=směr osy x dle v,  
%%                                     řádky=směr osy y dle u)
%% Potom
%% mesh(X,Y,Z) ... vykreslí drátový graf parametrické plochy zadané body
%%                 v prostoru o souřadnicích X(u,v),Y(u,v),Z(u,v).
%% mesh(x,y,Z) ... vykreslí funkci dvou proměnných z=f(x,y), kde
%%                 Z(u,v)=f(x(v),y(u)) <=> mesh(X,Y,Z), kde 
%%                 X(u,v)=x(v) pro každé u=1,...,m
%%                 Y(u,v)=y(u) pro každé v=1,...,n
%%                 Matice X,Y pro tento případ lze pohodlně sestavit pomocí
%%                 příkazu 'meshgrid':
%%                 [X,Y]=meshgrid(x,y), resp. pro y=x jeho jednodušší formou:
%%                 [X,Y]=meshgrid(x), což je ekvivalentní s meshgrid(x,x).
%% mesh(Z) ... totéž jako mesh(1:n,1:m,Z) ... plocha nad geometricky
%%                                            obdélníkovou indexovanou sítí 
%% Jako další parametr lze přidat matici C, která určuje přiřazení barev:
%% mesh(...,C) ... (u,v)-tý bod má přiřazenu barvu určenou hodnotou C(u,v),
%%                 která určuje zobrazení do palety barev, tzv. barevné osy
%%                 (viz příkazy caxis a colormap). Implicitně C=Z.
%% 
%% Pro všechny tvary příkazu mesh lze též užít formu:
%% h = mesh(...) ... vrací handle vytvářeného objektu SURFACE.
%% 
%% Analogicky se pracuje s příkazy meshc, surf a surfl, které pouze vytváří
%% jiný typ grafu:
%% meshc ... jako mesh, ale navíc se zobrazením vrstevnic v rovině x-y
%%           (c=contour), v tomto případě musí x,y, resp X,Y určovat
%%           vždy pravoúhlou síť v rovině x-y.
%% surf  ... plocha je tvořena barevně stínovanými ploškami.
%% surfl ... osvětlená plocha (l=light) s barevně stínovanými ploškami, tj.
%%           jako surf, ale pomocí dodatečných parametrů lze určit umístění
%%           a parametry světelného zdroje (viz help surfl).         
%% 
  x=-8:0.5:8;
  y=-10:0.5:10;
  nx=length(x), ny=length(y)
  [X,Y]=meshgrid(x,y);  % Vytvoří matice X a Y souřadnic pro vykreslení
                        % funkce z=f(x,y), kterou chápeme jako parametrickou
                        % plochu: x=v, y=u, Z(u,v)=f(v,u)                    
  XX=ones(ny,1)*x;
  max(max(abs(X-XX))) % Tedy X = zopakované řádky x, neboť x nezávisí na y=u
  YY=y.'*ones(1,nx);
  max(max(abs(Y-YY))) % Tedy Y = zopakované sloupce y, neboť y nezávisí na x=v
  R=sqrt(X.^2+Y.^2) + eps;  % Ošetření výrazů 0/0 v následujícím příkazu
  Z=sin(R)./R;              % Funkce z=f(x,y)
  figure; mesh(X,Y,Z); grid on;    
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
%-------------------------------------------------------------------
% Ekvivalentně přímo pomocí x,y: 
  figure; mesh(x,y,Z); grid on
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;  % Zkontrolujte, že obr. 1 a 2 jsou identické.
%-------------------------------------------------------------------
% Jinak pomocí meshc:
  figure
  h=meshc(X,Y,Z); grid on     
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
%-------------------------------------------------------------------
% Jinak pomocí surf:
  figure
  surf(X,Y,Z); grid on       
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
%-------------------------------------------------------------------
% Jinak pomocí surfl:
  figure
  surfl(X,Y,Z); grid on       
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
close all

%% Příkaz 'view' pro určení směru pohledu na 3-D graf:
%%---------------------------------------------------------------------
%% view([az,el] ... pohled ze směru určeného azimutem az [stupně] a
%%                  elevačním úhlem el [stupně]
%% az ... úhel [stupně] natočení kolem osy z proti směru hodinových ručiček 
%%        měřeny od záporné poloosy y.
%% el ... úhel s rovinou x-y ve směru poloprostoru z>0, tj.
%%        el>0 => pohled shora, el<0 => pohled zdola     
%% az=0, el=0  ... pohled kolmo na rovinu x-z ze směru záporné poloosy y
%% view(2)     ... implicitní 2-D pohled, tj.:
%%                 až=0, el=90 ... pohled shora kolmo na rovinu x-y      
%% view(3)     ... implicitní 3-D pohled, tj.: az=-37.5, el=30
%%                 (implicitní stav po spuštění MATLABU)
%% view([x,y,x]) ... určení směru pohledu zadáním kartézských souřadnic
%%                   polohy oka (na vzdálenosti od počátku nezáleží).

  x=-8:0.5:8;
  y=-10:0.5:10;
  nx=length(x), ny=length(y)
  [X,Y]=meshgrid(x,y);  % Vytvoří matice X a Y souřadnic pro vykreslení
                        % funkce z=f(x,y), kterou chápeme jako parametrickou
                        % plochu: x=v, y=u, Z(u,v)=f(v,u)                    
  XX=ones(ny,1)*x;
  max(max(abs(X-XX))) % Tedy X = zopakované řádky x, neboť x nezávisí na y=u
  YY=y.'*ones(1,nx);
  max(max(abs(Y-YY))) % Tedy Y = zopakované sloupce y, neboť y nezávisí na x=v
  R=sqrt(X.^2+Y.^2) + eps;  % Ošetření výrazů 0/0 v následujícím příkazu
  Z=sin(R)./R;              % Funkce z=f(x,y)
  figure; mesh(X,Y,Z); grid on;    
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');

pause;
view(2)
pause;
view(3)
pause;
view([0,1,0])
pause;
view([1,0,1])
keyboard;           % zkuste sami
close

%% Příkaz 'fill' a 'fill3' pro vyplnění mnohoúhelníka 
%% ---------------------------------------------------------------------
%% Příkazy jsou vhodné pro vykreslování hodnot funkce na neobdélníkových 
%% oblastech. Použití obou příkazů si uvedeme ve zjednodušené formě, plné 
%% možnosti příkazů lze získat prostudováním dokumentace příkazů fill, fill3 
%% a patch.
%% Nechť x,y,z jsou vektory n x 1, resp. X,Y,Z matice n x m.
%% Pak
%% fill(x,y,z)    ... vyplní mnohoúhelník s vrcholy [x(t),y(t)]
%%                    interpolací z barev z(t),t=1,2,...,n  
%% fill(X,Y,Z)    ... vyplní m mnohoúhelníků fill(X(:,k),Y(:,k),Z(:,k)), 
%%                    k=1,2,...,m.
%% fill(...,'PN1',PV1,'PN2',PV2,...) ... navíc s počátečním nastavením 
%%                                       některých vlastností vytvářených v 
%%                                       objektu PATCH.
%%
%% Zejména se používají tyto 2 páry dvojic vlastnost/hodnota:
%% PN1 =  EdgeColor  ...  barva hran mnohoúhelníka
%% PV1 = 'none'    ... žádná
%%       'flat'    ... konstantní
%%       'interp'  ... interpolovaná
%%        s        ... barva určena řetězcem s, např. s='k' vykreslí hrany 
%%                     černě
%% PN2 = FaceColor   ... barva vnitřku mnohoúhelníka
%% PV2 = 'none'    ... žádná
%%       'flat'    ... konstantní
%%       'interp'  ... interpolovaná
%% 
%% h=fill(...) ... vrací sloupcový vektor handlů všech objektů PATCH
%%                   vytvořených příkazem 'fill'.
%% Obrázek vytvořený příkazem fill je rovinný. Prostorový obrázek získáme 
%% pomocí analogického příkazu
%% fill3(X,Y,Z,Z,'PN1',PV1,'PN2',PV2,...), který vyplní mnohoúhelníky s 
%%                                         vrcholy
%%                 [X(:,k),Y(:,k),Z(:,k)],k=1,2,...,m, interpolací z barev 
%%                 Z(:,k).


% Příklad A   Vykreslení jednoho pravidelného mnohoúhelníka
n=6;                
t=2*pi*(0:1/n:1);
x=cos(t);y=sin(t);
z=sin(5*x).*cos(2*y);
figure
fill(x,y,z);
axis('equal')
keyboard;     % Zkuste sami, pro velké n dostanete kruh!

% Příklad B    % Dirichletova funkce dvou proměnných na trojúhelníkové síti
  
  x=-8:0.5:8;
  y=-10:0.5:10;
  nx=length(x), ny=length(y)
  [X,Y]=meshgrid(x,y);
  XX=ones(ny,1)*x;
  max(max(abs(X-XX))) % Tedy X = zopakované řádky x, neboť x nezávisí na y=u
  YY=y.'*ones(1,nx);
  max(max(abs(Y-YY))) % Tedy Y = zopakované sloupce y, neboť y nezávisí na x=v
  R=sqrt(X.^2+Y.^2) + eps;  % Ošetření výrazů 0/0 v následujícím příkazu
  Z=sin(R)./R;              % Funkce z=f(x,y)


PRVKY=[];                          % pole čísel vrcholu trojúhelníku
echo off
for j=1:ny:nx*ny-2*ny+1            % generování trojúhelníku 
   i=(j:j+ny-2)';
   PRVKY=[PRVKY; [i i+1 i+ny+1]];
   PRVKY=[PRVKY; [i i+ny+1 i+ny]];
end;    
echo on
XX=[X(PRVKY(:,1))';X(PRVKY(:,2))';X(PRVKY(:,3))']; % x-ové souřadnice 
YY=[Y(PRVKY(:,1))';Y(PRVKY(:,2))';Y(PRVKY(:,3))']; % y-ové souřadnice 
ZZ=[Z(PRVKY(:,1))';Z(PRVKY(:,2))';Z(PRVKY(:,3))']; % z-ové souřadnice 
fill(XX,YY,ZZ);
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
pause;
fill(XX,YY,ZZ,'Facecolor','interp','EdgeColor','k','LineStyle',':');
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
pause;
fill(XX,YY,ZZ,'Facecolor','flat','EdgeColor','k','LineStyle','-');
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
pause;  
fill(XX,YY,ZZ,'Facecolor','none','EdgeColor','interp','LineStyle','-');
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
pause  ;
fill3(XX,YY,ZZ,ZZ);
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
fill3(XX,YY,ZZ,ZZ,'Facecolor','flat','EdgeColor','k','LineStyle','-');
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
pause;
fill3(XX,YY,ZZ,ZZ,'Facecolor','none','EdgeColor','interp','LineStyle','-');
  title('Dirichletova funkce dvou proměnných');
  xlabel('osa x');
  ylabel('osa y');
  zlabel('osa z');
keyboard;   % Zkuste sami
close

%% Příkazy pro animaci
%% --------------------------------------------------------------------------
%% M = moviein(n,h) ... alokuje matici o n sloupcích pro uložení n animačních
%%                      záznamů (tzv. frame) grafického objektu s handlem h.
%%                      Každý frame bude v jednom sloupci.
%% M = moviein(n) ... totéž jako M=moviein(n,gca), tj.  graf. objekt=akuální 
%%                    osy
%% fr=getframe(h) ... graf v aktuálních osách zkonvertuje na sloupcový vektor
%%                    animačního záznamu grafického objektu s handlem h.
%%                    h může být handle obrazovky, obrázku nebo os.
%% fr=getframe ... totéž jako getframe(gca) ... uloží záznam os. 
%% movie(M) ... přehraje 1-krát animační záznam v aktuálním objektu.
%% movie(M,N) ... totéž, ale přehraje N-krát
%% movie(M,N,fps) ... totéž jako movie(M,N) s předepsanou rychlostí přehrávání:
%%                    fps záznamů za sekundu (fps=frames per second).
%% movie(h,M,...) ... analogicky, ale přehrání proběhne v objektu s handlem h
%%
%% Příkazy mají ještě další speciální parametry - viz help.

  x=-8:0.5:8;
  y=-10:0.5:10;
  nx=length(x), ny=length(y)
  [X,Y]=meshgrid(x,y);  % Vytvoří matice X a Y souřadnic pro vykreslení
                        % funkce z=f(x,y), kterou chápeme jako parametrickou
                        % plochu: x=v, y=u, Z(u,v)=f(v,u)                    
  XX=ones(ny,1)*x;
  max(max(abs(X-XX))) % Tedy X = zopakované řádky x, neboť x nezávisí na y=u
  YY=y.'*ones(1,nx);
  max(max(abs(Y-YY))) % Tedy Y = zopakované sloupce y, neboť y nezávisí na x=v
  R=sqrt(X.^2+Y.^2) + eps;  % Ošetření výrazů 0/0 v následujícím příkazu
  Z=sin(R)./R;              % Funkce z=f(x,y)
  figure; mesh(X,Y,Z);
   
  az=-37.5:30:360-37.5; n=length(az);
  M=moviein(n,gcf);
  for k=1:n 
      view(az(k),30); pause(1); 
      M(:,k)=getframe(gcf);
  end
  movie(gcf,M,1,4);   % přehrává se do handlu gcf ( stávající obrázek),
                      % 4 záznamy za sekundu
  pause;
%-------------------------------------------------------------------
  for el=30:20:390 
      view(-37.5,el); pause(1); 
  end ;
% Vyzkoušejte Animaci I Pro Tento Případ
keyboard;  
close;
 
%================================= Konec ==============================
%
%
%%
close all
more off
echo off
