BPC2E_C08 Parametrické 3D grafy v Matlabu Cílem cvičení je procvičit si práci se soubory a parametrickými 3D grafy v Matlabu. Úloha A. Protože budete řešit transformaci z kartézských do sférických souřadnic, ve kterých budete vykreslovat grafy, resp. objekty, jako parametrické 3D funkce s definicí barvy povrchu a protože to představuje jistou představivost ve 3D prostoru a tedy pro matlabovské začátečníky jistý obtížný kousek, je součástí zadání i názorný příklad, viz bpc2e_c08ex.m. V tomto příkladu je nejprve pomocí meshgridu vytvořena sít v kartézské soustavě, kde lon (zeměpisku délka) koresponduje s osou x a lat (zeměpisná šířka) s osou y: [lon,lat] = meshgrid(-180:0.5:180, -90:0.5:90); Máme tedy síť, která má definovaná oka s délkou 0,5 a je položená na rovné zemi (v soustavě x, y). Následně je vygenerována matice c jako funkce lon+lat, to znamená, že její hodnota bude stoupat s rostoucí hodnotou lon i lat: c = lon+lat; Pro nízké indexy řádků i sloupců se budou její hodnoty pohybovat okolo -270, tedy -180 + (90), naopak pro nejvyšší indexy se budou hodnoty v matici C blížit +270. Pokud použijeme následující skript pro vykreslení síťového grafu pomocí funkce mesh(): figure(1) mesh(lon,lat,0*lon,c) xlabel('lon') ylabel('lat') axis equal colormap('Lines') view(0,90) získáme graf 8.1. Souřadnice x a y tedy odpovídají lon i lat. Třetí matice odpovídající ose z je nulová (násobení je zde kvůli zajištění rozměru nulové matice). Ve funkci mash() matice c figuruje jako čtvrtý parametr, což znamená, že hodnotou c pro dané lon a lat je nějaká barva z vybrané palety. Protože je z vždy nulové graf leží v rovině xy a jenom se mění jeho barva podle matice c a vybrané palety colormap(). Pro ilustraci je vybrána paleta Lines, proto tolik proužků, ale zkuste si jinou paletu, např. Winter, která lépe ukáže, jak roste c pro dané místo (souřadnice) sítě umístěné v rovině xy. Máme tedy vytvořen určitý vzor, který je rozložený na podlaze (z = 0) jako koberec. A nyní přichází kýžená transformace, kdy pro parametry lon a lat definujeme transformované proměnné x, y a z ve sférických souřadnicích. Z hlediska představivosti jde jen o to, že vezmeme původní síť (koberec položený na zemi) a stočíme jej do koule, přičemž musíme někde oka (koberec) trochu
roztáhnout, jinde přitlačit k sobě. Výsledkem je kouli v 3D soustavě a příslušné barevné proužky teď figurují na povrchu koule. V našem případě máme poloměr koule r = 1, obecně však pro uvedenou transformaci platí:
x = r ⋅ cos(α ) ⋅ cos( β ) y = r ⋅ sin(α ) ⋅ cos( β ) z = r ⋅ sin( β )
(8.1)
kde α odpovídá námi definované proměnné lon a β proměnné lat. Hodnota r určuje poloměr výsledné koule. V testovacím příkladě je síť tak hustá, že se nám jednotlivé hrany slévají dohromady. Zkuste navrhnout síť řidší a uvidíte, že transformace do koule v některých místech oka roztáhne a jinde smrskne (to je kvůli sinům a kosinům v transformačním vztahu).
Obr. 8.1. Barevný plot na zemi. Sestavíme-li skript pro transformaci kulových souřadnic: x = cos(lon*pi/180).*cos(lat*pi/180); y = sin(lon*pi/180).*cos(lat*pi/180); z = sin(lat*pi/180); a aplikujeme již skutečné 3D zobrazení (z již není nulové, viz třetí vztah v transformaci) pomocí funkce mesh(): figure(2) mesh(x,y,z,c) title('Striped ball') xlabel('x') ylabel('y') zlabel('z') axis equal colormap('Lines') view(45,20) Získáme krásnou barevnou mičudu, na které je vidět zhuštění původního 2D zobrazení v oblasti pólů a zředění okolo rovníku.
Vašim úkolem je na základě uvedeného příkladu sestavit matlabovský skript, který vygeneruje grafy rozložení teploty v severním Atlantiku. Abyste mohli oddělit oceány od souše, je k dispozici binární soubor earth.dat obsahující jednobajtové hodnoty, kdy 1 odpovídá moři a 0 souši na zemském povrchu. Rozdělení je po 0,5° jak v zeměpisné délce <180°, +180°>, tak i v zeměpisné šířce <-90°, +90°>. Řádky odpovídají zeměpisné šířce, sloupce zeměpisné délce. Sestavte skript, který zobrazí masku souší a moří Země, viz obr. 8.3. Jde v podstatě o řešení z ukázkového příkladu s vlastní paletou o dvou barvách. Data ze souboru masky souší a moří načtete následujícím skriptem: fid1 = fopen('earth.dat', 'r') e_mask = fread(fid1, [361 721]); fclose(fid1)
Obr. 8.2. Barevný plot srolovaný do mičudy pomocí transformace. Proveďte jak zobrazení rozložené do roviny xy (obr. 8.3a) tak i zobrazení po transformaci, čímž získáte vykreslený globus souší a moří. Pro další úkol je v souborech NATemp1985.dat a NATemp2010.dat uložena mapa teploty severního Atlantiku měřená v roce 1985 a 2010 v zeměpisné délce <-135°, +35°> a v zeměpisné šířce <+15°, +90°>. Rozdělení je opět po 0,5° a stejné uspořádání dat jako pro masku souší a moří avšak jako hodnoty ve formátu float odpovídající průměrné teplotě v daném roce. Souše mají přidělenu fixní hodnotu -10. Sestavte výřezy grafů teploty vod v severním Atlantiku pro oba roky i rozdíl (pro zjištění globálního oteplování), viz obr. 8.4. V závěrečné části proveďte transformace do sférických souřadnic a zobrazte teploty moří na povrchové mapě Země, u rozdílové hodnoty zobrazte jen měřenou oblast (máte jen kousek plotu na kousek koule), viz obr. 8.5. Pro zobrazení stačí používat funkci mesh(), protože síť je dostatečně hustá. Jak je patrné z výsledků i severní Atlantik se nám pomalu ohřívá. Kdo za to může?
Obr. 8.3. Maska souší a moří Země.
Obr. 8.4. Teplota moře ve 2D. Hodnocení: 3 body.
Bonusová úloha V rámci bonusové úlohy upravte kód příkladu A tak, že transformaci budete definovat jako vlastní funkci. Řešení ověřte na stejných datech, musíte získat shodné výsledky. Kontrolní otázky 8.1) Kam se bude vykreslovat graf při definici: subplot(1,2,2)? 8.2) K čemu slouží příkaz: axis equal? 8.3) K čemu slouží funkce view()u zobrazování grafů jaké má parametry?
Obr. 8.5. Teplota moře ve 3D.
Literatura [8.1] [8.2] [8.3]
DOŇAR, B., ZAPLATÍLEK, K. MATLAB pro začátečníky. Praha: BEN – Technická literatura, 2003. DOŇAR, B., ZAPLATÍLEK, K. MATLAB – začínáme se signály. Praha: BEN – Technická literatura, 2006. KATTAN, P. I. MATLAB for Beginners. A Gentle Approach. Lousiana: Peter I. Kattan, 2009.