• No results found

MODELOVÁNÍ POVRCHŮ V GIS A JEJICH TRANSFORMACE DO GEOMETRICKÝCH MODELŮ

N/A
N/A
Protected

Academic year: 2022

Share "MODELOVÁNÍ POVRCHŮ V GIS A JEJICH TRANSFORMACE DO GEOMETRICKÝCH MODELŮ"

Copied!
65
0
0

Loading.... (view fulltext now)

Full text

(1)

TRANSFORMACE DO GEOMETRICKÝCH MODELŮ

Bakalářská práce

Studijní program: B2646 – Informační technologie Studijní obor: 1802R007 – Informační technologie Autor práce: Michal Košek

Vedoucí práce: RNDr. Blanka Roučková, Ph.D.

Liberec 2014

(2)
(3)
(4)

Byl jsem seznámen s tím, že na mou bakalářskou práci se plně vzta- huje zákon č. 121/2000 Sb., o právu autorském, zejména § 60 – školní dílo.

Beru na vědomí, že Technická univerzita v Liberci (TUL) nezasahuje do mých autorských práv užitím mé bakalářské práce pro vnitřní potřebu TUL.

Užiji-li bakalářskou práci nebo poskytnu-li licenci k jejímu využití, jsem si vědom povinnosti informovat o této skutečnosti TUL; v tomto pří- padě má TUL právo ode mne požadovat úhradu nákladů, které vyna- ložila na vytvoření díla, až do jejich skutečné výše.

Bakalářskou práci jsem vypracoval samostatně s použitím uvedené literatury a na základě konzultací s vedoucím mé bakalářské práce a konzultantem.

Současně čestně prohlašuji, že tištěná verze práce se shoduje s elek- tronickou verzí, vloženou do IS STAG.

Datum:

Podpis:

(5)

Abstrakt

Bakalářská práce se zabývá analýzou dat, konkrétně modely zemského povrchu a tvorbou geometrického modelu a geometrické sítě pro příslušný model. Popisuje a zkoumá strukturu dat vyexportovaných z programu GIS a jejich možné zpracování a také strukturu a využití programu GMSH, především v oblasti generování 3D sítí. Hlavním předmětem této práce je popis vytváření jednotlivých algoritmů a nakonec i samotného softwaru. Tento software načte na vstupu geoinformatický model rozpukané oblasti a vytvoří dle potřeb z oblasti hydrogeologie objemový model, ve kterém jsou vystiženy pukliny. Výsledný soubor, popisující tento model, je vytvářen dle předepsané struktury programem GMSH, aby bylo možno v tomto softwaru příslušný model zobrazit a dále s ním pracovat.

Klíčová slova:

geometrický model, geometrická síť, GSMH, GIS, objemový model

Abstract

Bachelor thesis deals with the analysis of data, namely models of the earth's surface and creating a geometric model of and geometric network for the appropriate model. It describes and examines the structure of data which are exported from the GIS and their possible processing and also the structure and use of the GMSH, especially for the generation of 3D meshes. The main goal of this paper is to describe the creation of the algorithms and finally the software itself. The input of this software is geoinformational model fractured area and creates according to the needs of hydrogeology volume model, in which are highlighted cracks. The resulting file, describing this model, is generated according to the structure of program GMSH so that it is possible this model to open and viewed in this software.

Keywords:

geometrci model, geometric network, GMSH, GIS, volume models

(6)

5

Obsah

1. Úvod ...7

2. Cíl práce ...8

3. Teoretická část ... 11

3.1 Modelování rozpukaných oblastí... 11

3.2 Geometrické modely a modelové sítě ... 12

3.3 GIS ... 14

3.4 GIS softwary... 15

3.5 Quantum GIS ... 15

3.6 modely povrchu TIN ... 15

3.7 GMSH ... 16

4. Praktická část ... 18

4.1 Návrh organizace dat ... 18

4.1.1 Rozbor vstupních dat, popisující model v GIS ... 18

4.1.2 Rozbor souboru v GMSH ... 21

4.1.3 Návrh objektové struktury ... 22

4.2 Návrh algoritmu ... 25

4.2.1 Rozbor souboru a uložení do proměnných ... 25

4.2.2 Orientace hran ... 26

4.2.3 Vytvoření svislých ploch... 28

4.2.4 Funkce „VytvorPlochy“ ... 29

4.2.5 Tvorba objemů ... 30

4.2.6 Návrh třídy „Objem“... 31

4.2.7 Návrh algoritmizace ... 33

4.2.8 Funkce „PridejPlochu“ ... 35

4.2.9 Tvorba testovacích dat ... 36

4.2.1 Vytvoření algoritmu ... 38

4.2.2 Nový algoritmus pro hledaní uzavřených oblastí ... 41

4.2.3 Uzavírání oblasti metodou přes determinanty ... 41

4.2.4 Debugování algoritmu pro tvorbu objemů ... 44

4.3 Dokumentace k softwaru ... 46

4.3.1 Popis vstupních dat ... 46

(7)

6

4.3.2 Popis grafického prostředí ... 46

4.4 Návrh grafického prostředí... 48

4.4.1 Tvorba grafiky ... 48

4.4.2 Naprogramování komponent ... 48

5. Vyhodnocení řešení ... 50

6. Závěr ... 56

7. Seznam literatury ... 59

8. Seznam obrázků ... 60

9. Seznam zkratek ... 61

10. Přílohy ... 62

10.1 přiložené CD ... 62

10.2 přiložená uživatelská příručka ... 62

10.3 Ukázka deklarace testovacích dat ... 62

(8)

7

1. Úvod

Mám model zemského povrchu v GIS, konkrétně geoinformatický model rozpukané oblasti. Takovýto model je požadovaných vstupem do hydrogeologických modelů. Tyto matematické modely jsou využívány např. pro řešení scénářů kontaminace podzemních vod z úložišť nebezpečného vysoce aktivního odpadu[3]. Pro tyto modely je potřeba vytvořit geometrický model a modelovou síť. V tomto modelu pak chceme vystihnout zlomy a rozpukané horniny, tedy pukliny a vytvořit objemový model. Toto ovšem GIS softwary neovládají, proto je potřeba navrhnout propojení mezi GIS a generátorem sítí a následně vytvořit geometrický model. Mým úkolem tedy bude navrhnout aplikaci, která bude umožňovat automatizaci převodu složitých modelů rozpukaných oblastí do geometrického modelu v programu pro generování 3D sítí. Tímto softwarem je v mém případě GMSH.

Vstupem mého programu bude tedy model vytvořený v GIS, resp. data, která ho popisují a výstupem bude objemový model, vytvořený na základě puklin a tento model bude ve formátu programu GMSH, který tedy umožňuje generování 3D sítí a je vstupem do softwaru pro geometrii modelů proudění a transportu.

Musím zde zmínit, že software GMSH samozřejmě umožňuje vytvářet objemový model jako jednu ze svých funkcí. Tato funkce ovšem nedokáže vytvořit objemový model na základě puklin v modelu, což je potřeba pro náš účel a pokud bychom tuto funkci využili s tím, že bychom pukliny vyhledali a vybrali ručně, byl by proces velmi zdlouhavý.. Je tedy zapotřebí navrhnout algoritmus pro automatizaci tohoto kroku i pro velmi složité modely, který tedy vytvoří v modelu další body, hrany a plochy a zároveň vytvoří v modelu objemy tak, že každý jeden objem je vždy uzavřen buďto hranicí, nebo puklinou. Dále by měl pak tento software tyto zpracovaná data zobrazit ve formátu dat, který podporuje GMSH. Navíc modely, které zahrnují povrch terénu a zároveň objemy vymezené tektonickými poruchami, jsou často požadovány a bylo by tak vhodné mít software, který dokáže zautomatizovat tuto činnost pro urychlení výzkumu.

(9)

8

2. Cíl práce

Vzhledem k potřebě vytvořit geometrický model a modelovou síť pro vstupní model, což není možné pouze v rámci GIS softwaru, je nutné převést tento model do jiného programu, který toto umožňuje, jako např. GMSH. V tomto modelu můžeme vytvářet námi požadované sítě a následně pro daný model vytvořit požadovaný 3D model pro účely v přesně požadované podobě. Proto je pro konverzi těchto GIS modelů, které jsou nejčastěji používané pro zobrazení reálného prostředí do geometrického modelu potřeba vytvořit software, který umožní převod těchto modelů do modelů GMSH. Následně vytvořit algoritmus, který by tento povrchový model přetransformovat na objemový model dle linií, které reprezentují pukliny, řeky nebo jiné přírodní znaky a jsou též modelem vytvořeným v softwaru GIS. Tento software musí mít na vstupu všechny potřebné soubory popisující daný model a také příslušný soubor, který určuje, které linie v rámci modelu jsou puklinami. Tyto linie pak následně vytáhneme, resp. vytvoříme k nim příslušné „svislé“ plochy a totéž provedeme i s liniemi, které leží na hranici celého povrchového modelu. Nyní tedy máme povrchový model, který reprezentuje v našem případě trojúhelníková síť a vytvořené svislé plochy, které vystupují dolu z modelové sítě.

Vytvoříme ještě podstavu pro model, abychom měli skutečný 3D model, přičemž podstava nebude pouze jedna, ale několik vždy pro danou uzavřenou oblast.

Uzavřenou oblastí myslíme seznam linií, ohraničující několik trojúhelníkových ploch v modelu, přičemž linie musí být puklinou nebo hranicí modelu a tato oblast nesmí obsahovat žádnou další uzavřenou oblast. Nalezneme ji tak, že vyjdeme z libovolného bodu a vrátíme se zpět do něj, přičemž se pohybujeme pouze buďto po hranici nebo po puklině a neustále se snažíme uzavírat oblast. Je tedy logické, že každá puklina přísluší právě dvěma uzavřeným

Obrázek 1 - Povrchový model se svislými plochami, vytaženými pouze z hranice modelu

(10)

9

oblastem a každá hrana, která leží na hranici modelu odpovídá právě jedné uzavřené oblasti.

Obrázek 2 - 9 uzavřených oblastí / 9 objemů

Následně pak definujeme v rámci programu GMSH samostatné objemy a to na základě již zmíněných uzavřených oblastí, kdy každá uzavřená oblast odpovídá právě jednomu objemu. Horní plocha objemu je část původní trojúhelníkové sítě oddělena puklinami od zbytku, stěny objemu jsou právě vytvořené svislé plochy, které leží pod liniemi, tvořící uzavřenou oblast a podstava objemu je ohraničena „spodními“ liniemi, ležící pod liniemi ohraničující uzavřenou oblast, přičemž tedy počet linií ohraničují podstavu je shodný s počtem linií, které ohraničují příslušnou uzavřenou oblast.

Objem je dán v rámci struktury programu GMSH seznamem ploch, které jej ohraničují. V našem modelu se bude jednat o „horní“ trojúhelníkové plochy z původního modelu, které jsou „uvnitř“ uzavřené oblasti, nově vytvořené „svislé boční“ plochy, nacházející se pod liniemi, tvořící uzavřenou oblast a podstavu, příslušná k danému objemu.

Nyní se podívejme na jednotlivé dílčí cíle, které budou vést k celkovému, výše zmíněnému výsledku a tedy funkčnímu softwaru přímo pro tento účel.

1 - Na začátek je potřeba prostudovat modely v GIS a také vyexportovaná data, popisující tyto modely a následně navrhnout strukturu a formát dat, který bude vstupem do aplikace

2 - Najít vhodný způsob, jak tyto modely zpracovat do objektové struktury a navrhnout grafické prostředí pro moji aplikaci

3 - Prostudovat strukturu softwaru GMSH, dle které budu vytvářet model

4 - Poté, co se nám podaří zobrazit původní model z GISU v programu GMSH přes náš software, navrhnout a aplikovat algoritmus pro vytváření 3D modelu a příslušných objemů

(11)

10

K bodu 1 - Souborů, popisujících model v programu GIS je několik, záleží na způsobu jejich vytvoření. Zvolil jsem si tedy jednu z možností a popsal následně přesnou podobu vstupních dat, jak je bude načítat moje aplikace. Soubory, které budu potřebovat jsou celkem tři, přičemž jeden z nich, jak jsem již zmínil, obsahuje informace o tom, jak prochází modelem pukliny a ostatní dva popisují trojúhelníkovou síť, která určuje daný povrch pomocí bodů, linií a jednotlivých trojúhelníků.

K bodu 2 - Nyní je potřeba vyřešit, jak tyto data načítat. Každý model se skládá v GIS z několika vrstev, přičemž každá popisuje jiné elementy a vztahy mezi nimi. Každá vrstva je pak vyexportována jako specifický soubor, v pěti různých formátech, přičemž jeden z nich je i „.dbf“ a vstupem mého programu pak budou soubory ve formátu „.txt“. Je ovšem potřeba prostudovat, ze kterých souborů a jak získat všechny potřebné informace pro moji aplikaci a najít způsob, jak uživatel zadá, kde se příslušné informace nachází pomocí dialogové okna programu.

K bodu 3 - Poté je potřeba prostudovat strukturu formátu GMSH. Tento software načítá soubory, resp. modely ve formátu „geo“. Tento formát má obrovskou výhodu v tom, že je velmi dobře strukturovaný a tuto strukturu si lze prohlédnout v obyčejném poznámkovém bloku. Mým úkolem je tedy vytvořit software, jehož výstupem bude soubor je formátu

„.geo“ a bude mít požadovanou podobu.

K bodu 4 - Poté, co se mi podaří „překonvertovat“ model z GISU a zobrazit jej v programu GMSH a budu mít zároveň uchované v objektové struktuře všechny potřebné údaje, musím najít uzavřené oblasti. Poté, co navrhnu tento algoritmus, je potřeba navrhnout další, který mi vytvoří samotné objemy. Objemů bude stejný počet, jako uzavřených oblastí. Konkrétně algoritmus takový, který mi na základě uzavřené oblasti, která vlastně definuje příslušný objem, najde všechny plochy, které tento objem určují.

Následně pak už jen vytvořím soubor v příslušném formátu, kde dle struktury, předepsané programem GMSH vypíšu obsah všech patřičných listů v algoritmu, tedy listů, obsahujících seznam bodů, linií, ploch a objemů v modelu.

(12)

11

3. Teoretická část

3.1 Modelování rozpukaných oblastí

Geoinformatické modely rozpukaných oblastí jsou požadovaným vstupem do hydrogeologických a transportních modelů. Tyto matematické modely jsou využívány např.

pro řešení scénářů kontaminace podzemních vod z úložišť nebezpečného vysoce aktivního odpadu. Pro tyto hydrogeologické modely je vždy nutné zpracovat reálná geologická a hydrogeologická data modelované oblasti, vytvořit tzv. geometrický model, modelovou síť a tyto naplnit daty. Model oblasti, ve kterém chceme kromě tvarů povrchu a horninového složení vystihnout také zlomy a rozpukání hornin ve vertikálním směru a vrstevnatost či rozpukání horizontálního průběhu, je velmi komplexní a složitý. Lze modelovat v různém rozlišení a podrobnosti, která se promítá buď do geometrického modelu, nebo do modelové sítě, vzniká tedy celá množina modelů navázaných na zdrojová data. Zpracování reálných dat o území vyžaduje nasazení GIS a přístupů geoinformatického modelování společně se speciálními aplikacemi pro propojení GIS a generátoru sítí. Tyto aplikace jsou vytvořeny pro automatizaci celého procesu generování složitých modelů rozpukaného horninového prostředí, využívají databáze a nástroje GIS, byla vytvořena samostatná aplikace pro generování geometrických modelů a jejich zápis v kódu generátoru 3D sítí. [3]

Soubory geometrického modelu a modelové sítě fungují jako vstupní soubory do hydrogeologických a transportních modelů. Jsou nezbytné pro konkrétní výpočty v simulované oblasti. Pro výpočty pro danou zájmovou oblast se vždy musí vytvořit geometrický model a modelová síť této oblasti, která respektuje geologické a geografické charakteristiky daného území. Jakkoli jsou zájmová území odlišná, postupy výstavby geometrických modelů a modelových sítí a jejich naplňování daty lze zobecnit, vytvořili jsme postupy a metodiku, jak tyto modely vytvářet efektivně a automaticky. [3]

Modelované území je vždy vymezeno předem. Je dána jeho hranice horizontální (např.

na mapě), ale také je vymezeno do hloubky. Zájmové území je popsáno pomocí různorodých dat. Jsou k dispozici mapy v analogové a digitální formě, data týkající se hydrologie území - vodních toků, povodí, průběhu rozvodí, dále data popisující povrch reliéfu. Je rovněž nutno zpracovat geologická data - horninové složení, tektonické oblasti, puklinové zóny, rozhraní hornin, fyzikální vlastnosti hornin, vlastnosti puklin v horninovém prostředí, nutno zahrnout hydrogeologická data popisující studny, prameny, geologické vrty, výšky hladiny podzemní vody a potřebné výsledky měření, důlní mapy, geologické profily a data v tabulkách či databázích, která popisují oblast pomocí atributů vybraných objektů a jevů v území. Nezřídka je nutné zařadit rovněž data týkající se socioekonomických aktivit způsobujících kontaminace povrchu či data o objektech a jevech, které mohou být kontaminací ovlivněny. [3]

(13)

12

3.2 Geometrické modely a modelové sítě

Geometrický model popisuje modelovanou oblast z pohledu geometrie území. Jedná se o objemový 3D model. Je složen z elementů geometrického modelu: 0D – bod, 1D - linie, 2D – rovina, 3D - objem. 1D elementy mohou být i složité – spline, 2D elementy mohou být také např. přímkové plochy, části povrchu koule, atd. Každý geometrický element má speciální definice ve zdrojovém kódu geometrického modelu. Nejblíže tomuto chápání geometrického modelu je drátový model, z toho důvodu používáme také CAD přístup k tvorbě modelů (obr. 3). Geometrické modely vytvářené na základě reálných dat jsou obvykle složité. Např. blok rozpukané horniny s puklinami jak vertikálního tak horizontálního průběhu. Tyto pukliny rozdělují jediný blok horniny na mnoho objemů (obr. 4). Dále je geometrie oblasti ovlivněna dalšími jevy - konfigurací terénu, říční sítí, průběhem hranic povodí, polohou hladiny podzemní vody a dalšími. Které objekty a jevy budou zahrnuty do geometrie modelu závisí na účelu modelu, na požadovaném rozlišení a

Obrázek 3 - Geometrický model a jeho elementy Zdroj: [3]

Obrázek 4 - Objemy geometrického modelu definované podle rozpukání oblasti Zdroj: [3]

(14)

13

přesnosti modelu. Geometrický model neurčuje pouze dekompozici na dílčí objemy a povrchy v prostoru, ale také definuje jejich množiny v souladu s jejich fyzikálními vlastnostmi. Tedy jeden tzv. fyzikální objem je tvořen množinou všech objemů, které mají danou vlastnost důležitou pro budoucí matematické modelování (vlastnost je např. druh horniny, propustnost dané horniny, porozita, …) Stejně tak definujeme fyzikální plochy (např.

podle vlastností rozhraní hornin, charakteristik puklin, aj.) nebo fyzikální linie (vodní toky, rozvodí, aj.) (obr.5 a 6). [3]

Modelová síť je model tvořený 2D a 3D elementy v prostoru. 2D elementy jsou trojúhelníky, 3D elementy jsou čtyřstěny. Objekty uložené v originálním GIS, které je

Obrázek 6 - Svislé pukliny a vodní toky v modelu – fyzikální plochy a fyzikální linie Zdroj: [3]

nutné do geometrického modelu zařadit, jsou postupně diakritizovány a je odvozován geometrický model. Modelová síť pak vyplní plochy a objemy geometrického modelu konečným počtem trojúhelníků a čtyřstěnů. Jak je na základě geometrického modelu vytvořena modelová síť, závisí na rozlišení modelu, požadavcích na výsledný počet elementů sítě. Dle požadovaného rozlišení nebo počtu elementů sítě je nastavena délka strany/hrany elementu a ta spolu s geometrickým modelem určuje výslednou hustotu, přesnost, kvalitu, počet elementů modelové sítě (obr. 7). [3]

Obrázek 5 - Vizualizace vertikálních a horizontálních puklin části modelu. Barevně odlišené rozdílné fyzikální vlastnosti. Zdroj: [3]

(15)

14

Obrázek 7 - Modelová síť. Vlevo pouze 2D síť pro plochy modelu, vpravo kompletní 3D síť. Zdroj: [3]

3.3 GIS

Geografický informační systém (GIS) je na počítačích založený informační systém pro získávání, ukládání, analýzu a vizualizaci dat, která mají prostorový vztah k povrchu Země.

Geodata, se kterými GIS pracuje, jsou definována svou geometrií, topologií, atributy a dynamikou.

Geografický informační systém umožňuje vytvářet modely části zemského povrchu pomocí dostupných softwarových a hardwarových prostředků. Takto vytvořený model lze pak využít například při evidenci katastru nemovitostí, předpovídání vývoje počasí, určování záplavových zón řek, výběru vhodné lokace pro čistírnu odpadních vod, plánování výstavby silnic apod.[5]

GIS je velmi obecné prostředí pro vytváření a především analýzu prostorově orientovaných údajů. Jedná se tedy o systém pro zpracování geografických informací, tedy ucelených informací o hmotném nebo nehmotném objektu s údajem o geografické poloze objektu. GIS zachovává jakousi souřadnici objektů.

Již z názvu GIS nacházíme pojem "informační systém", ze kterého přebíráme databázovou podporu a základy datového modelování. Mapový výstup GISu naznačuje napojení grafiky. Jádro GISU spočívá v matematickém zpracování složitých a různorodých údajů v kontextu geografického prostoru a času. GIS má mnoho uživatelů mimo rámec informačních technologií, jako je obrana, státní správa, zemědělství, geologie a další. [8]

(16)

15 3.4 GIS softwary

Software patří hned z několika důvodů mezi klíčové momenty celého GIS. Začněme od financí – jedná se skutečně o finančně náročnou část celé technologie. Přirozeně existují finančně nenáročná řešení, která jsou zajímavá především pro školy a vzdělávací instituce. Ne vždy musí být ale ideálním řešením – cena má samozřejmě vliv na funkcionalitu a uživatelskou přívětivost. Software GIS je definován jako systém pro sběr, ukládání, správu, dotazování, analyzování a prezentaci geografických informací. Z tohoto tvrzení plyne, že je to vlastně systém programových prostředků, který nám slouží k naplnění funkcí GIS.

V historii GIS se programové prostředky vyvíjely směrem ke vzniku komplexních systémů s příjemným uživatelským prostředím (klikání na ikony namísto příkazů vkládaných do příkazového řádku). Moderní GIS používají pro uživatelské přizpůsobení programové jazyky jako jsou Microsoft Visual Basic nebo Javasoft Java.[2]

3.5 Quantum GIS

Quantum GIS ve zkratce QGIS patří mezi otevřené desktopové prohlížeče a editory dat geografických informačních systémů. Tento software je šířen pod licencí GNU GPL, což znamená licence pro svobodný software. GPL je copyleftová licence vyžadující dostupnost upravených děl pod původní licencí. QGIS lze spustit na systémech Windows, Linux, Unix a Mac OSX. Podporuje vektory, rastry a databázové formáty.

K rozšíření programu jsou k dispozici zásuvné moduly, které nám slouží například k importování shapefile do PostgreSQL (relační databázový systém s otevřeným zdrojovým kódem). Dále můžeme QGIS využít jako grafické rozhraní pro funkce programu GRASS.

Open source, kam spadá i QGIS, je software s otevřeným zdrojovým kódem. Můžeme si pod tím představit legální dostupnost licence, kde pokud dodržujeme určité podmínky, je možné zdrojový kód využívat. Tento typ softwaru se neustále vyvíjí a stále se na něm pracuje.

V současnosti je pro Quantum GIS dostupná verze 1. 3. 0 „Mimas“.

Quantum GIS má malou velikost souboru v porovnání s komerčním GIS a vyžaduje méně paměti, proto ho lze použít pro starší počítače nebo spouštět současně s ostatními aplikacemi.[4]

3.6 modely povrchu TIN

Jedná se o trojúhelníkovou nepravidelnou síť, tedy rastrový model používaný k digitálnímu popisu reliéfu krajiny. Takovýto model je soustavou navazujících trojúhelníkových plošek, kde každý vrchol trojúhelníka má přiřazenu výškovou souřadnici.

(17)

16

TIN vystihuje terén přesněji a s menším nárokem na objem dat, než pravidelný rastr. Přesně zobrazuje i nerovnoměrné rozložení měřicích bodů. [7]

Jedním z univerzálních způsobů, jak zobrazit modelový povrch je triangulovat vstupní body do podoby TINu. Takovýto model se skládá z mnoha trojúhelníků, popisující daný povrchový model, přičemž výsledné trojúhelníky (plošky) se považují za rovinné, což znamená, že tvoří plně definovaný, spojitý model povrchu. Výhodou tohoto modelu je, že zahrnuje vstupní měření, tedy body, což pravidelný rastr neumožňuje, přičemž díky tomu předcházíme náchylnosti k chybám vzhledem k interpolaci vstupních dat. Hustota vzorková je přizpůsobitelná vzhledem k vstupním datům, tedy vzhledem k modelu, kdy tedy některou oblast můžeme pokrýt body hustě s malými trojúhelníky například tam, kde je členitý terén a naopak v oblastech konstantního sklonu bude pokrytí body řídké a trojúhelníky budou velké.

V modelu TIN máme množinu bodů, linií a ploch. Každý bod v rámci množiny je uložen společně se svými výškovými daty, tedy souřadnicemi. Body nejsou uloženy v mřížce a mají rozdílnou hustotu v rámci modelu a právě na těchto bodech probíhá rovinná triangulace. Pokud bod neleží ve vrcholu, tak je jeho výška získána lineární interpolací (ze dvou bodů, pokud leží na hraně, ze tří, pokud leží uvnitř trojúhelníku). [6]

3.7 GMSH

GMSH je automatický generátor konečných sítí ve 3D (zejména Delaunay) s vestavěným CADem a schopnostmi dalšího zpracování. Je vytvořen tak, aby poskytl jednoduchý akademický nástroj pro testování jednotlivých případů sítí s parametrickým vstupem a schopnostmi současného zobrazení.

Obrázek 8 - Ukázka modelu v GMSH

(18)

17

GMSH se skládá ze čtyř hlavních modulů: geometrie, uzlů, řešitele a dalšího zpracování. Specifikace libovolného vstupu těchto modulů je dána buď interaktivně pomocí grafického uživatelského rozhraní nebo pomocí textových souborů ASCII používajících vlastní skriptovací jazyk GMSH. [1]

(19)

18

4. Praktická část

4.1 Návrh organizace dat

4.1.1 Rozbor vstupních dat, popisující model v GIS Pojmy

Za pojmem „line“ si lze představit hranu (dále také jako line) a její identifikační číslo (dále jen id), která spojuje dva kontrérní body, které mají také svoje id. Právě tyto body tvoří celkovou strukturu.

Pojem „body“ představuje tedy id bodu, který tvoří základní kostru modelu a každý bod má tři souřadnice, které udávají jeho polohu.

V neposlední řadě tu mám heslo „area“, pod kterým si lze představit plochu (dále také jako area) resp. ohraničenou oblast, která je dána čarami, které ji tvoří a má samozřejmě také tvoje id. V našem modelu se jedná vždy o trojúhelníkovou oblast, tvořenou právě třemi hranami, tedy třemi line. (obr. 9)

Obrázek 9 - Ukázka dat zobrazených softwarem Quantum GIS

(20)

19 Formát

Vstupem do mého softwaru budou celkem tři soubory, odpovídající modelu vytvořeném v GISU. Každá vstupní data, vyexportovaná z GISU, jsou v několika formátech, přičemž jedním z nich je i formát „.dbf“. Tento formát je tabulkový a lze tedy otevřít v libovolném tabulkovém editoru. Vždy se jedná o tabulku, resp. seznam příslušných elementů, charakterizující daný model, ať už z hlediska bodů, linií nebo ploch. Jelikož není problém takto otevřený soubor vyexportovat do formátu „.txt“, v mém případě „jako text oddělený tabulátorem“, bude vstupem do mého softwaru soubor formátu „.txt“. Takto vyexportovaná data mohou mít různou podobu, ovšem pro můj software musí mít konkrétní podobu, jelikož program samozřejmě pracuje s konkrétní podobou dat. Celkem budu potřebovat tři soubory v určité podobě, přičemž sloupec, ve kterém se data budou nacházet příslušná data, která očekávám, bude zadávat uživatel.

Soubory

Teď se zaměřím na jednotlivé soubory. Jedním ze souborů, který potřebujeme, je soubor bodů a linií, který mimochodem zpracovávám jako první, jelikož zde vyčteme, které body resp. jejich id odpovídá jednotlivým čarám. Zde mám každou hranu s jejím id na dvou řádkách a na každém je vždy jeden bod, který ji ohraničuje. Mimo jiné z toho vyplývá, že id bodu je na několika řádcích v závislosti na tom, kolik hran bod spojuje. Zároveň také tento soubor obsahuje souřadnice bodu, čehož využiji a po zpracování tohoto souboru dostanu tabulku bodů s jejich souřadnicemi a také získám tabulku čar a bodů, které ji ohraničují.

Mimo jiné také z tohoto souboru získám potřebnou informaci o tom, zda daná linie leží na hranici modelu, či nikoliv. (obr. 10)

Soubor ploch (viz obr. 12) obsahuje id jednotlivých ploch, obsažených v povrchovém modelu a k nim příslušné id line, které ji tvoří, v tomto případě, jelikož se jedná o trojúhelníkový model, se daná oblast skládá z tří hran. Tento soubor musí být v takovém formátu, kdy každá area se nachází právě na třech řádcích, takže postupným načítáním souboru zjistíme, které linie odpovídají dané ploše a pokud tedy tento soubor zpracuji vhodným algoritmem (viz dále), můžu dostat tabulku (v našem případě list), ve které bude vidět, které hrany tvoří daný trojúhelník, tedy v našem případě přísluší k danému id area.

Dalším souborem, který si projdeme, je soubor puklin. V tomto souboru se nachází pouze id jednotlivých čar, které mám v objektu a k nim příslušné číslo pukliny, které tvoří. Pokud hrana není puklinou, pak je u ní číslo pukliny nulové. Pokud zpracuji tento soubor, mohu následně vytvořit objemový model právě na základě puklin, které hrají v našem softwaru velkou roli, jelikož dle nich se objemový model rozdělí na jednotlivé 3D oblasti. (obr. 11)

(21)

20

Obrázek 12 - Ukázka souboru ploch Obrázek 11 - Ukázka souboru body-linie ve formátu ".dbf"

Obrázek 10 - Ukázka souboru puklin ve formátu ".dbf"

(22)

21 4.1.2 Rozbor souboru v GMSH

Soubor vytvořený nebo načítaný programem GMSH má velice jednoduchou strukturu a to především z toho důvodu, že lze otevřít a zobrazit v obyčejném poznámkovém bloku ve Windows. Tento formát souboru má sice speciální koncovku „.geo“, ovšem mezi ním a formátem „.txt“ je rozdíl pouze v názvu. Ovšem samotná organizace a způsob zápisu dat má přesnou podobu, kterou je potřeba dodržet. na druhou stranu samotná organizace dat je velice přehledná.

Jedná se o soubor, kde na začátku jsou vypsané všechny body, které tvoří danou strukturu i se svými souřadnicemi a samozřejmě má každý bod své id, které v našem případě si přenáším i se souřadnicemi z GISU a to vše ve specifickém, předem daném tvaru (viz obr.

10).

Hned pod body se nachází seznam všech linií resp. hran, které tvoří danou strukturu a to ve formátu, který jsem již naznačoval v předchozí kapitole, tedy vždy k dané hraně přísluší dva body, které jsou zde dané svým identifikačním číslem. V rámci modelu v GMSH u linií záleží na pořadí bodů, jak jsou zapsány, jelikož program GMSH řeší orientaci hrany, která je tedy vždy orientovaná od počátečního bodu do koncového, přičemž samozřejmě bod, který je uveden jako první, je ten počáteční.

Poté už následují plochy, označované ve struktuře souboru GMSH jako „Line loop“.

Každá plocha je zde na dva řádky. V prvním se nachází id dané plochy a seznam hran, ohraničující danou plochu, což v našem případě znamená, vzhledem k tomu, že jsou plochy trojúhelníkové, že zde jsou uvedeny 3 id jednotlivých linií. Na druhém řádku je pak znovu id plochy s heslem „Plane Surface“.

Nakonec po spuštění našeho softwaru zde bude krom původních bodů, linií a ploch také několik dalších, později přidaných elementů, přičemž plochy již nebudou tvořeny pouze třemi hranami, jelikož již nebudou mít podobu trojúhelníku, ale čtyřúhelníku, jelikož se jedná o plochy, které se nachází vždy pod puklinou a jsou tvořené čtyřmi hranami a mluvil jsem o nich v předchozí kapitole.

Jako poslední jsou zde samotné objemy, označené jako „Surface Loop“, které jsou stejně jako plochy rozloženy na dva řádky, přičemž na tom prvním se nachází kromě identifikačního čísla tentokrát id samotných ploch, které logicky tvoří daný objemový tvar.

Nyní se ještě zaměřím na zápis dat, konkrétně zápis desetinných čísel. Program GMSH, na rozdíl od dat vyexportovaných z GISU, která obsahují desetinnou čárku, očekává desetinnou tečku (viz obr. 13). Bude tedy potřeba na to dbát při vytváření samotného souboru.

(23)

22

Obrázek 13 - Ukázka struktury formátu ".geo"

4.1.3 Návrh objektové struktury

Jak jsem již naznačil v rozboru vstupních dat, jednotlivé soubory po načtení do aplikace zpracuji do přehlednější struktury. Ovšem v našem případě to nebude tabulka, kterou by nejspíš představovalo pole, ale objektová struktura. Budu mít konkrétně čtyři struktury.

(24)

23

První třída, kterou logicky budu vytvářet je třída „bod“. Následně pak od této třídy, stejně jako od ostatních, vytvořím v samotné aplikaci strukturu typu List dané třídy. Třída bod se skládá pouze z šesti proměnných, přičemž prvních pět je prakticky předem daných. Jedná se o čtyři souřadnice, potřebné k zápisu bodu do speciální struktury programu GMSH a také jsem si vytvořil pomocnou proměnnou, kterou využívám při tvorbě bodů, které se vždy nachází pod daným bodem.

Tato proměnná je typu bod, to znamená, že se jedná o referenci na objekt, který je stejného typu, jako tato třída samotná. Jde o to, že potřebuji vytvořit linii pod každou linií, která patří mezi puklin, přičemž pro tuto novu linii samozřejmě je potřeba vytvořit body, které ji budou ohraničovat a ke kterým povede svislá hrana od bodů nahoře a právě tato proměnná pomáhá při jejich vytváření. Pak pomocí těchto bodů a čár vytvořím plochu, která bude

Obrázek 14 - UML aplikace

(25)

24

čtyřúhelníková a poslouží mi k vytvoření objemů, což bude podrobněji vysvětleno dále.

Obrázek 15 - tvorba nových linií

Dále definuji třídu „line“ (viz obr. 14). Tato třída už obsahuje reference na objekty jiné třídy a to samozřejmě dvě reference na třídy typu „bod“, svoje id a pomocnou proměnnou třídy „line“, která mi bude v algoritmu sloužit pro uchování odkazu na linii, která se nachází pod touto linií, tedy nově vytvořená linie, o které jsem se nedávno zmiňoval. Mimo to má také každá třída svou metodu „ToString“, která slouží k tomu, abych následně mohl zapsat do souboru obsah tohoto listu dle struktury, kterou určuje program GMSH tak, aby jej zpracoval a bylo možné tato data následně zobrazit v tomto programu.

Definuji také třídu area (viz obr. 14). Ta obsahuje kromě třech referencí na objekt typu

„line“ a svého id také další pomocné proměnné. Proměnná „mamed“ mi říká, zda se jedná o plochu trojúhelníkovou nebo čtyřúhelníkovou, resp. pokud je tato „boolovská“ proměnná na hodnotě „true“, znamená to, že se jedná o plochu tvořenou čtyřmi liniemi.

Další čtyři proměnné typu „bool“ mi říkají, zda daná linie má či nemá mít zápornou hodnotu, tedy zda je orientovaná správně. Jedná se o komplikaci, která nastává při zápisu dat do GMSH. Totiž v programu GMHS záleží na orientaci hran v ploše, která musí být po směru hodinových ručiček. O tomto problému se zmíním ještě dále. Ve funkci „ToString“ se pak na tyto proměnné odkazuji, abych věděl, u které hrany má být znaménko mínus. Pokud tam nedodám znaménka pro orientaci dané plochy, není program GMSH vůbec schopen načíst data a jakýmkoli způsobem je zobrazit.

(26)

25 4.2 Návrh algoritmu

4.2.1 Rozbor souboru a uložení do proměnných

Pomocí třídy „StreamReader“ načtu jako první soubor (samotné načítání souborů a jejich obsluha je vysvětlena o pár kapitol níže) s body a liniemi. Jak jsem se již zmínil, v tomto souboru je vždy každá hrana na dvou řádcích. Procházím tedy soubor po řádcích a vždy na každém řádku si všímám pouze údajů, které se nachází patřičném sloupci. V našem případě, jelikož jsou vždy sloupce odděleny tabulátorem, pomocí funkce „Split“ třídy „String“

rozdělím jednotlivé prvky řádku do pole. Zajímám se pouze o prvky s daným indexem, odpovídající danému sloupci. Ty musím následně, jelikož se jedná o textový soubor, přičemž i pole je tím pádem typu „string“, převést pomocí funkce „TryParse“ na prvky typu „int“ resp.

„double“. Zde využívám pomocné proměnné. Poté vždy projedu celý list bodů, který mám již vytvořený a zjistím, zda už bod, jehož id je právě obsahem pole s indexem dva, není již v listu obsažen. Pokud není, přidám nový bod do struktury i se svými souřadnicemi, pokud tam již je, tak nedělám nic.

Následuje obdobný proces, ovšem tentokrát se zaměřím na „line“, tedy hrany v objektu. Nyní musím znovu načíst soubor přes již zmíněný „StreamReader“, abych začal číst celý soubor opět od začátku. Následuje tedy obdobný proces s tím, že je potřeba si uvědomit, že id hrany je v souboru vždy dvakrát, tedy jedna hrana je na dvou řádcích. Opět postupně přidávám liny do listu a kontroluje, zda už linie s daným id není v listu obsažena. Pokud ano, znamená to, že jsem nalezl druhý bod, který přísluší této linii, a přiřadím ho tedy do příslušné proměnné. Pokud obsažena není, přidané hranu s daným id a bodem, který ji na daném řádku v souboru přísluší, přičemž musím do „konstruktoru“ vyplnit i druhý bod. Vytvořím si tedy nějaký bod, například s nulovými hodnotami a ten tam pro zatím dosadíme, než ho nalezneme. Následně zjistím, zda linie na daném řádku není již obsažen v listu, který neobsahuje všechny linie, ale jen takové, které tvoří hranici objektu a tato proměnná má název

„linehranice“. Poté je postup obdobný, ale ještě před přidáním hrany zkontroluji, zda se jedná o hranu, který tvoří hranici, přičemž tato informace je obsažena na příslušném indexu v poli, jehož pozici zadává uživatel.

Nyní ještě vytvořím list bodů, které tvoří hranici objektu. To udělám tak, že cyklicky projdu list „linyhranice“, kde jsou obsaženy všechny hrany ležící na hranici modelu a postupně přidávám oba body tak, že se nejprve podívám, jestli už tam daný bod není.

V neposlední řadě se zaměřím na soubor s plochami a na vytvoření listu obsahujícího tyto plochy s názvem „arey“. Opět samozřejmě musím znovu načíst soubor. Procházím postupně řádky a zaměřím se na dva konkrétní sloupce, jejichž polohu zadává uživatel.

Jelikož každá plocha se svým id je tam třikrát, opět musím postupně dané oblasti přiřadit do objektové struktury tři hrany, které ji ohraničují. Tzn., že opět pro každý řádek procházím již naplněný list s plochami a pokud se zadaná plocha zde ještě nenachází, přidám ji s nulovými liniemi, které postupně, jak nacházím danou plochu v souboru, nahrazuji správnými.

(27)

26

V programu GMSH na pořadí prvků nezáleží, to znamená, že není problém s postupným přidáváním a tím, že by id bodů resp. linií nešli přímo za sebou. Pouze musí být ve formátu, který GMSH přečte. Také není žádný problém tento konečný soubor vytvořit přes

„obyčejný StreamWriter“, jelikož se jedná o obyčejný textový soubor, pouze s příponou

„.geo“.

4.2.2 Orientace hran

Jak jsem již zmínil výše, program GMSH vyžaduje orientaci hran v rámci plochy, která se zde označuje jako „Plane Surface“. Po podrobnějším testování jsem došel k výsledku, že absolutně nezáleží na pořadí, v jakém jsou id hran, ohraničující danou plochu, napsány za heslem „Plane Surface“ a složenými závorkami, jinými slovy řečeno hrany nemusí na sebe navazovat vzhled k pořadí. Ovšem i přesto musí mít orientaci takovou, aby ve směru hodinových ručiček na sebe skutečně navazovaly. Hrana, která po směru hodinových ručiček navazuje na předešlou, musí mít počáteční bod stejný, jako má předešlá hrana bod konečný, což je ten bod, který je uveden za heslem „line“ ve složených závorkách jako druhý.

Pokud jsem takto opravil orientace hran, vše fungovalo jak má. Tento problém jsem řešil několika způsoby, které se nakonec ukázaly jako nefunkční. Z počátku se mi nezdálo, že by tento problém vyžadoval nějak složité řešení, proto jsem zkoušel jednoduché postupy.

Vzal jsem nejnižší bod a z ostatních dvou jsem hledal ten více vlevo. Poté jsem si našel hranu, která je mezi nimi a dle toho, v jakém pořadí byly uvedeny body, určil její orientaci. Pak jsem vzal úsečku, která vede z bodu, který nebyl tím nejnižším, tedy z konečného bodu do bodu, který „mi zůstal“. Následně určil orientace. Ovšem poté mi došlo, že pokud bude mít trojúhelník vnitřní úhly velmi malé, může se stát, že bod, který leží více vlevo ve skutečnosti není ten správný.

Po všech těchto neúspěšných pokusech jsem navrhl metodu, která se ukázala jako funkční, jelikož po otestování tohoto algoritmu se model správně zobrazil v programu GMSH.

Musel jsem využít matematických funkcí konkrétně funkce cosinus pro výpočet úhlu mezi přeponou a přilehlou odvěsnou, jelikož jsem počítal úhel mezi dvěma hranami, v našem případě spíše vektory, vycházející z jednoho bodu.

Nejprve si pro lepší přehlednost označím a popíšu body A, B a C. V našem případě představuje bod A ten nejnižší, tedy bod s nejnižší hodnotou souřadnice „y“, který potřebuju vždy najít, pro správně fungování našeho algoritmu. Bod B představuje bod, ke kterému vede první hrana právě ve smyslu hodinových ručiček. To znamená, že tato hrana musí mít uveden jako první bod A a jako druhý bod B, v opačném případě musí být uváděna se znaménkem mínus a v neposlední řadě bod C, který mi zbývá. V algoritmu ovšem do těchto bodů uložím body v podstatě náhodně a až podle zjištění s nimi patřičně pracuji. Já ovšem popíši tento problém přes body A, B a C pro lepší pochopení.

Takže naleznu bod s nejmenší hodnotou souřadnice „y“, tedy bod A. Nyní hledám bod B, tedy ten, ke kterému jde první hrana po směru hodinových ručiček. Následně spočtu dva úhly. Nejprve úhel, který je mezi hranou, resp. vektorem, který se nachází mezi body A, B a

(28)

27

mezi vektorem, který jde vodorovně doprava od bodu A, může mít souřadnice například (1,0).

Poté úhel, který je mezi vektorem AC a vodorovným vektorem (1,0). Mám tedy dva úhly, přičemž větší úhel mi říká, který bod je B. Nyní tedy už mám správně nalezené a označené body A, B a C. (viz obr. 16)

Obrázek 16 - řešení orientace hran uvnitř plochy

Algoritmus je v této fázi proto rozdělen do dvou částí, dle toho, který bod je bodem B, ovšem v obou částech dělám stejný proces. Nejprve naleznu hranu, která je dána krajními body A a B. Nyní se podíváme, jak je tato hrana definována, resp. který bod je uveden jako bod A v objektové struktuře, což znamená, že bude uveden v zápisu programu GMSH v složených závorkách jako první. Pokud je to ten správný, nic nedělám, pokud jsou ovšem body prohozené, nastavím orientaci dané hran tak, že uložím do patřičné proměnné

„preorient“, odpovídající dané hraně, hodnotu „true“, což znamená, že při výpisu do souboru

„.geo“ se u ní objeví znaménko mínus. Následně provedu stejný proces pro hrany, které jdou mezi body B a C a mezi body C a A. Samozřejmě na prvním místě, resp. jako bod A dané hrany musí být vždy uveden ten, který byl u předešlé hrany uveden jako ten koncový, tedy bod B.

Nyní jsem narazil na menší problém, ovšem kvůli němu se model nezobrazil úplně kompletní. Jedná se o problém „se zápornou nulou“. Pokud jsou elementy ve vstupních datech číslované od nuly, může dojít k tomu, že hrana, která má id rovno nule bude mít v rámci dané plochy záporné znaménko, což program GMSH nedokáže zpracovat. Tento algoritmus jsem zařadil ještě před algoritmus s přeorientováváním hran. Jedná se o to, nahradit line s id nulovým za nové, které jsem určil jako to následující volné. A zároveň změnit všechny reference na tuto hranu za nově vytvořenou. Algoritmus tedy musí projít nejen list „liny“ , ale také projet list „arey“ a nahradit referenci za novu.

(29)

28 4.2.3 Vytvoření svislých ploch

Naším cílem je vytvořit pod hranami, které tvoří nějakou puklinu a pod hranami, které tvoří hranici objektu svislou kolmou plochu, která mi poslouží k vytvoření vyžadovaného objemového modelu. Jinými slovy se jedná se o jakési „vytažení modelu dolu“. Pokud je tedy původní linie puklinou či hranicí, vytvořím pod jejími krajními body nové dva body, které budou mít stejné x,y souřadnice, ale liší se s souřadnici z. K těmto bodům povede svislá čára dolů a poté samozřejmě vytvořím hranu mezi body dole. (viz obr. 17)

Obrázek 17 - svislá plocha

Nyní už mám vytvořené hrany pro vytvoření nové plochy, která je ohraničena čtyřmi hranami. Pro tuto plochu následně přiřadím id a také ji přiřadím ji příslušné hrany. Algoritmus pro toto přiřazení popíši níže.

Ještě než se dostanu k popisu algoritmu, musím zpracovat do přijatelné podoby pukliny, abych měl jejich seznam. Konkrétně potřebuji seznam bodů, tvořící danou puklinu a seznam čar, které ji též tvoří, tak jako tomu mám i u hranic, tedy obdobu výše zmiňovaných listů „bodyhranice“ a „linehranice“. Jelikož se jedná o proces, který se bude opakovat a uplatním ho na jednotlivé pukliny a i na samotnou hranici objektu, vytvořím si funkci.

Konkrétně funkci s názvem „vytvorplochy“, viz dále. Teď tedy k vytvoření listu bodů a linií pro jednotlivé pukliny.

Načtu soubor puklin, ve kterém se nachází informace o tom, které puklině daná linie odpovídá (pokud je vůbec puklinou). Vytvořím si list „ppl“, do kterého budu přidávat postupně všechny hrany, které tvoří danou puklinu a list „ppb“, do kterého budu přidávat body. Také pole s názvem „polepuklin“, kam si ze souboru uložím tabulku, jedná se tedy o dvourozměrné pole, kde bude vždy id hrany a k ní číslo příslušné pukliny. Procházím tedy

(30)

29

postupně soubor řádek po řádku, a pokud se jedná o puklinu, což poznám, že číslo pukliny není nulové, uložím si do pole potřebné údaje, abych je měl v té podobě, o které jsem mluvil.

Nyní mám tedy tabulku (v našem případě dvourozměrné pole), ve které je sezam hran s jejich id a k nim přiřazené číslo pukliny.

Nyní je tedy potřeba postupně zpracovat všechny pukliny. Nyní tedy postupně procházím „polepuklin“ a vytvářím postupně všechny pukliny, které jsou v souboru uloženy.

Jejich počet mám mimo jiné uložený v dočasné proměnné s názvem „velpuklin“. Začnu tedy od čísla pukliny jedna a pokračuji až do hodnoty, která je právě uložena v proměnné

„velpuklin“. Projdu tedy celé „polepuklin“ a hledám takové hrany, které mají číslo pukliny jedna. Ty přidám do listu „ppl“. Následně přes funkci „foreach“ procházím „ppl“ a vytvářím postupně „ppb“ tak, že prozkoumám oba body ohraničující danou hranu, a pokud nějaký z nich ještě není obsažen v poli „ppb“, tak jej přidáme.

Nyní mám vytvořené dvě pole, jedno obsahuje seznam čar, které tvoří puklinu a druhé seznam bodů, které ji též tvoří. Nyní zavolám funkci „vytvorplochy“ (viz dále) a opakuji celý proces pro ostatní pukliny, než se dostanu na poslední. Poté už stačí jen zavolat tuto funkci i pro „bodyhranice“ a „linehranice“ a mám vytvořené všechny elementy pro výslednou objemovou strukturu mimo spodní plochy resp. podstavy objektu, kterou přidám později.

Nyní je ještě potřeba vytvořit resp. určit a definovat jednotlivé objemy v modelu.

4.2.4 Funkce „VytvorPlochy“

Na začátku se zmíním o parametrech této funkce, které jsou vyžadovány. Samozřejmě především jde o list s hranami, které je potřeba „vytáhnout“ a odpovídající list bodů. Navíc je zde ještě proměnná typu „int“, která mi říká, kolik je bodů v listu, což využiji dále v kódu.

Vytvořil jsem si také tři proměnné typu „int“, do kterých si uložím velikost listů „body“,

„liny“ a „arey“. Tyto proměnné využiji pro vytváření nových prvků do listu a to konkrétně jako jejich nová identifikační čísla, což platí pro všechny tři případy. Další proměnné, které jsem si vytvořil, jsou „puvdelka1“ a „puvdelka2“, které využiji při procházení původních hran a bodů, kdy nepotřebuji vždy procházet celý list. Konstantní proměnná s názvem „konst“

slouží pro vytváření bodů, které mají stejné souřadnice jako původní, pouze se nachází pod nimi. Tuto hodnotu dosadím za souřadnici z, aby nově vytvořené body ležely přesně pod těmi původními, kterým odpovídají. Pomocná proměnná „spodní“ slouží k označení indexu listu

„liny“, od kterého se nachází v danou chvíli hrany, která spojují spodní body.

Na začátku algoritmu procházím parametrem přidaný list, tedy list bodů, které tvoří puklinu resp. hranici a přidám do listu s názvem „body“ nové body, které leží pod nimi.

Zároveň si ukládám nově vytvořený bod do reference s názvem „puv“, abych věděl, který bod je „pod“ tím původním bodem, což budu potřebovat pro následné vytváření čar. Zároveň v tomto kroku přidávám hranu mezi původním bodem a bodem nově vytvořeným, jinými slovy svislou hranu dolů. Nyní si do proměnné spodní uložím pozici, na které jsem, tedy index hrany, která je poslední přidaná, abych věděl, od které pozice začínají spodní hrany.

Následně přes „foreach“ procházím parametrem přidaný list hran a pro každou hranu

(31)

30

vytvořím novou hranu „pod ní“ (viz obr. 17) s novými body, které jsem nyní zrovna vytvořil a mám je právě uložené přes referenci v proměnné „puv“. V tomto okamžiku již mám vytvořeny všechny hrany pro to, abych mohl vytvořit resp. definovat čtyřúhelníkové plochy, které se nachází pod puklinami resp. hranicemi objektu a představují svislé plochy našeho 3D modelu (viz obr. 17). Procházím tedy list „liny“, ovšem ne celý, procházím pouze hrany, které nazývám „spodní“. Potřebuji dočasné proměnné pro lepší orientaci.

Zavedu si dočasné proměnné b a d, které mi představují dvě svislé hrany. Nyní projdu postupně všechny pukliny (parametrem předaný list) a najdu pro každou příslušné svislé hrany b a d tak, že projdu list „liny“, který obsahuje všechny linie v modelu a najdu ty, které ohraničují stejné body jako danou hranu a k ní příslušnou spodní hranu, uloženou v proměnné

„spodniline“. Nyní už jen přidám do listu „arey“, který obsahuje všechny plochy v mnou vytvářeném modelu novou plochu, ohraničenou aktuální hranou, k ní příslušnou spodní hranou a hranami b a d, které jsem právě našel. Následně nastavím orientaci hran tak, aby byly orientované v rámci plochy ve směru hodinových ručiček, o čemž jsem se již zmiňoval, přičemž v tomto případě stačí pouze nastavit minusovou hodnotu, tedy hodnotu „false“ k třetí a čtvrté linii.

4.2.5 Tvorba objemů

Dostávám se k samotné tvorbě objemů, resp. k jejich definování v rámci modelu.

Objemy jsou zde konkrétně odděleny puklinou nebo hranicí modelu. Každý objem je zde definován pomocí ploch, které již mám vytvořené. Pokud by se v modelu nacházela hranice a například dvě pukliny, které se nekříží, pouze procházejí modelem (viz obr. 18), budu mít v modelu tři uzavřené oblasti a tím pádem budu mít zároveň tři objemy.

Obrázek 18 - tři uzavřené oblasti

(32)

31

Pro tyto objemy bude hranice modelu či puklina horní hranou. Jelikož mám v modelu již vytvořené svislé plochy pod puklinami a hranicemi objektu (viz obr. 19), mám tedy i plášť pro náš objem. Podstava objemu je pak ohraničena „spodními“ hranami těchto „svislých“

ploch (viz. obr 17) a horní plocha objemu se skládá z jednotlivých trojúhelníkových ploch, které tvoří samotný model, který je vstupem programu na samotném začátku.

Obrázek 19 - rozbor pojmu objem

Nejprve jsem si vytvořil předlohu pro samotný algoritmus. Také jsem si nejprve navrhl třídu objem, jak by měla vypadat a jaké funkce budu potřebovat. Při samotném navrhování předlohy jsem také zjistil, že bude ještě potřeba, kromě vytvoření další třídy s názvem „objem", upravit malinko již vytvořený kód. Konkrétně potřebuji při vytváření a přidávání „spodních“ hran ve funkci „VytvorPlochy“ si ukládat referenci pro danou hranu, pro kterou vytvářím tu novou do proměnné s názvem „spodni", kterou tedy musím přidat do třídy s názvem „line". Také ještě musím poupravit třídu „bod“ a to tak, že přidám proměnnou s názvem „hranice", která bude typu „bool". Ta mi říká, zda daný bod leží na hranici modelu jako takového, či nikoliv, což využiji při rozhodování, po které hraně pokračovat z daného bodu, který je společný pro tři hrany. Zde je potřeba určit, po které hraně „uzavírám“ oblast a po které hraně vytvářím novou uzavřenou oblast, kterou právě potřebuje znát pro vytvoření námi požadovaných objemů.

4.2.6 Návrh třídy „Objem“

Proměnné třídy „objem“ jsou tři listy, identifikační číslo a pomocné proměnné

„zachorni“ a „idpodstavy“ (viz obr. 14). List „hraniceobj“ bude obsahovat po vytvoření objemu, tedy po skončení následujícího algoritmu, seznam hran, které tvoří uzavřenou oblast, která odpovídá danému objemu.

(33)

32

List „spodnihraniceobj“ bude obsahovat hrany, které ohraničují podstavu daného objemu a pro jejich nalezení právě využiji již zmiňované proměnné „spodni“ třídy „line".

List „plochy“ bude na konci obsahovat seznam ploch, které definují celý objem. Tedy příslušné trojúhelníkové plochy, které tvoří původní model a jsou ohraničené právě hranami v listu „hraniceobj“, odpovídající svislé plochy a postavu (viz obr. 19).

Proměnná id představuje samozřejmě identifikační číslo objemu, pro samotný algoritmus není ani potřeba, ale pro výpis objemů v konkrétní podobě do programu GMSH již potřeba bude. Konstruktor této třídy bude mít pouze jeden parametr, a to již několikrát zmiňovaný list „hraniceobj", který je v našem případě nejcharakterističtějším údajem pro identifikování resp. vytvoření nového objemu, přičemž samozřejmě pro samotný zápis objemu do GMSH není vůbec potřeba, jelikož objem je v programu GMSH zaspán pouze jako seznam ploch, které ho tvoří.

První funkcí, o které se zmíním, je funkce „VytvorSpodni". Tato funkce projde list

„hraniceobj", ve kterém jsou hrany, které jsou samozřejmě třídy „line“ a mají tedy vyplněnou proměnou „spodni", ve které je reference na hranu, která leží pod ní, přičemž tato funkce naplní list „spodnihraniceobj“ hranami, které ohraničují podstavu našeho objemu. Tuto podstavu přidávat mezi plochy nebudeme, jelikož bych musel vytvořit další konstruktor vzhledem k většímu počtu linií, které ji ohraničují a jelikož s ní dále nepotřebuji pracovat, pouze ji zapíši před výpisem samotných objemů do výstupního souboru pomocí funkce

„VypisPodstavu“ za ostatní plochy.

Funkce „Odpovida“ mi vrací informaci o tom, zda jsou dva objemy stejné ve smyslu proměnné „hraniceobj", která je pro mě vlastně proměnnou, která objem charakterizuje a která je zároveň i jediným parametrem této funkce. Zároveň také využívám tuto funkci pro určení, ke kterému objemu patří nalezené trojúhelníkové plochy ohraničené uzavřenou oblastí, což podrobně rozeberu dále. Funkce funguje tak, že kontroluji, zda se shoduje parametrem předaný list hran s vnitřní proměnnou „hraniceobj“.

„PridejBoky“ je funkce, která do listu „plochy“ přidá svislé čtyřúhelníkové plochy resp. boční stěny objemu tak, že projedu list „hraniceobj“ a ty plochy, které mají hranu „a“, tedy vrchní hranu obsaženu v tomto listu přidám. Obdobná je funkce „PridejPlochy“, která má jen jeden parametr a tím je list ploch a nedělá nic jiného, než daný list ploch přidá do listu resp. interní proměnné „plochy“.

Funkce „VypisPodstavu“ mi vrací text, který představuje jednu konkrétní plochu resp.

konkrétní podstavu odpovídající danému objemu a tento text je již ve formátu pro program GMSH. Má jediný parametr a to id této právě vytvářené podstavy, které uložím do proměnné

„idpodstavy“. Při volání této funkce za tento parametr dosazuji velikost listu „arey“, aby tato plocha měla další volné id. Na začátku samotné funkce volám funkci „preorientuj“ a pole, které mi vrací tato funkce pak využívám při výpisu k tomu, abych měl správně orientované hrany v rámci této plochy, viz dále. Je tedy možné výstup této funkce přímo zapsat do výsledného souboru.

(34)

33

Funkce „preorientuj“ slouží k přeorientování hran v rámci podstavy. Samozřejmě i zde, jako v rámci kterékoliv plochy v GMSH, musí být hrany orientované dle směru hodinových ručiček a musí na sebe navazovat ve stejném smyslu, jako např. hrany uvnitř trojúhelníkové plochy, jak jsem se již zmínil výše. Zde procházím list „spodnihraniceobj“ a postupně pro každou hranu kontroluji, zda konečný bod této hrany je totožný s počátečním bodem hrany navazující, tedy následující hrany v tomto listu, jelikož hrany v tomto listu jsou seřazeny tak, jak na sebe navazují. Dle toho, zda tomu tak je či nikoliv a také dle toho, jak byla orientovaná předchozí hrana se rozhoduji, zda daná hrana bude mít u sebe znaménko mínus či nikoliv. Tento údaj ukládám do pole tak, aby vždy odpovídalo znaménko na daném indexu pole tolikáté hraně v listu „spodnihraniceobj“.

Poslední funkcí je funkce „ToString“, která pouze zobrazí námi vytvořená data ve správném formátu, tedy za heslem „Surface Loop“ následují obyčejné závorky, ve kterých je id daného objemu a poté za rovnítkem ve složených závorkách jsou vypsané identifikační čísla ploch, které ohraničují daný objem. Vše je samozřejmě vidět při otevření souboru „.geo“

v poznámkovém bloku, kdy objemy, jelikož se skládají z ploch, které je potřeba předem určit pomocí hran a bodů, jsou tedy až na konci souboru.

4.2.7 Návrh algoritmizace

Nejprve se zaměřím na předlohu pro samotný algoritmus, tedy obecný návrh. Jedná se o nastínění níže popsaného algoritmu, přičemž ten samozřejmě přímo neodpovídá tomuto návrhu (viz dále).

Tento algoritmus pro vytvoření objemů následuje hned za algoritmem, který vytváří svislé plochy a popisoval jsem jej o pár kapitol dříve. Nejprve si vytvořím list „objemy“ třídy

„objem“. Následně vytvořím list „kostra“ a list „hranbod“. List kostra naplním na začátku tak, že spojím do jednoho listu všechny listy „ppl“, které obsahují všechny pukliny v modelu a list

„linyhranice“. List „kostra“ bude tedy obsahovat všechny hrany, které tvoří buďto puklinu nebo hranici modelu, tedy jakousi kostru modelu.

List „kostrabody“ vytvořím tak, že spojím pro změnu všechny listy „ppb“ a list

„bodyhranice“ do jednoho listu a budu mít tak všechny body, které tvoří pomyslnou kostru objektu. Nyní projedu celý list „kostrabody“ a zjistím, které body odpovídají, resp. ohraničují tři a více hran zároveň a takovýto bod přidám do listu „hranbod“. V listu „hranbod“ tedy budu mít body, které mi značí „křižovatku“. Zároveň si při přidávání těchto bodů vždy ke každému bodu vyplním ještě jeho proměnnou „hranice“ tak, že pokud tento bod leží na hranici modelu, bude tato proměnná v hodnotě „true“.

Vytvořím rekurzivní funkci s názvem „NajdiOblast“, která má dva hlavní parametry, kterými jsou bod a hrana, tedy proměnné typu „bod“ a „line“. První zavolání této funkce bude s nejnižším bodem v modelu ve smyslu osy y a příslušnou hranou, která jde v rámci hranice modelu po směru hodinových ručiček. jedná se tedy o hranu, ležící na hranici modelu a

(35)

34

zároveň má menší úhel k vektoru (1,0). Toto je velmi důležité pro další rozhodování v algoritmu, jelikož se musím rozhodnout, jakým směrem uzavírám právě hledanou uzavřenou oblast, o čemž jsem se již zmiňoval. Já tedy budu uzavírat po směru hodinových ručiček, což přímo souvisí s tím, po jaké hraně budu pokračovat, pokud se nacházím v bodě, který obsahuje více než dvě hrany a snažím dokončit hledání uzavřené oblasti, což je podrobněji vysvětleno dále. Další volání této funkce je již rekurzivní, takže ji zavolám v samotném programu pouze jednou. Po dokončení této rekurzivní funkce budu mít nejen všechny uzavřené oblasti a k nim vytvořené a přidané objemy do listu „objemy“, ale také rovnou zavolám patřičné metody a kromě trojúhelníkových ploch mám vlastně objem, který v GMSH představuje pouze identifikační číslo a seznam ploch, skoro kompletní.

Na začátku si vytvořím pomocné proměnné, mimo jiné list s názvem „ol“, ve kterém na konci bude seznam hran tvořící uzavřenou oblast. Samotný algoritmus bude celý v cyklu

„while“. Za začátku vždy uložím (pokud nejsem v první kroku) do proměnné „predchozibod“

obsah proměnné „dalsibod“. To samé platí pro proměnné „predchoziline“ a „dalsiline“. Tím se vlastně „posouvám“ postupně po kostře modelu a přidávám postupně hrany do listu „ol“.

Ten „posun“ provádím tak, že vždy vezmu hranu „predchoziline“ a následně do proměnné

„dalsibod“ uložím ten bod, který není shodný s bodem, uloženým v proměnné

„predchozibod“. Nyní zkontroluji, zda tento bod není v listu „hranbod“. Pokud ano, jsem „na křižovatce“ a musím projít list „kostra“ a najít další dvě nebo tři hrany, které obsahují tento bod.

Následně musím spočítat příslušný počet úhlů. K tomu potřebuji tři resp. čtyři vektory, představující hrany, které ohraničuje tento bod. Tyto vektory spočítám klasicky odečtením x a y souřadnic bodů, které danou hranu ohraničují. Nyní hranu, která svírá menší úhel s hranou, uloženou v proměnné „predchoziline“ uložím do proměnné „dalsiline“ a ta tvoří právě vytvářenou oblast. Duhou hranu uložím do proměnné „dalsiline2“ a následně právě pro tuto hranu zavolám rekurzivně funkci „NjadiOblast“, kde za parametr bod dosadím proměnnou

„dalsibod“ a za parametr třídy „line“ dosadím proměnnou „dalsiline2“, ovšem toto udělám pouze v případě, že jsem na hranici, což ověřím tak, že se podívám na proměnnou

„hranice“ od daného bodu zda je v hodnotě „true“. Pokud bod není v listu „hranbod“, pak pouze, stejně jako v předchozím případě, projdu list „kostra“ a najdu hranu, po které pokračuje námi vytvářená oblast a tu uložím do proměnné „dalsiline“.

Po skončení cyklu „while“ mám tedy uzavřenou oblast charakterizovanou jako seznam

„line“ v listu „ol“. Nyní tedy přidám nový objem do listu „objemy“, který jak jsem již zmiňoval charakterizuje právě uzavřená oblast resp. „horní“ hrany objemu a ty jsou právě i součástí konstruktoru třídy „objem“. Potřebuji vytvořit podstavu objemu. Zavolám funkci

„VytvorSpodni“ a ta mi naplní interní proměnou třídy „objem“ s názvem „spodnihraniceobj“

hranami, které ji tvoří za pomocí reference, kterou si pro dané linie ukládám s názvem

„spodniline“. Přičemž podstava našeho objemu je ohraničena právě hranami v tomto listu, takže už mám podstavu objemu.

References

Related documents

Zajímal jsem se také o literaturu menšin, což byl důvod, proč jsem se dlouho zdržel ve stánku s lužicko-srbskou literaturou.. Svět knihy vždy byl a je příležitostí pro

Pokud mají oba entitní typy povinné členství ve vztahu můžeme atributy obou entitních typů zařadit do jednoho schématu relace.. Pokud má jeden povinné členství a

Muzeum je umístěno po svahu s výhledem na celé město a v odstínění od překladiště.. Místo vybrané pro nové muzeum dětské ilustrace se nachází na okraji obce, v samém

V kapitole 1.6 jsou nastíněny problémy při řešení potlačování vibrací jako je shoda reálných a imaginárních částí impedance piezoelektrického vzorku a

Ke každodenním č innostem patří především zajištění vysílacích smluv, pracovní a pobytová povolení, organizace poznávacích pobytů (Pre Assignment Trip), organizace

Seznam ve výpočtu modifikovaným Dijkstrovým algoritmem je vytvořen pomocí struktury, která obsahuje hodnotu počet prvků v seznamu a ukazatel na počáteční a na koncový

Aktivní tempomat (ACC) Airbag, řidič Airbag, spolujezdec Střešní airbag vpředu Střešní airbag vzadu Střešní airbag vpředu/vzadu Boční airbag vpředu Boční airbag

Autorka s pomoci dopliujicich otdzek doch6zi k z6,vdru, Ze dospiv5ni je obdobi hled5ni vlastni identity a nilzory se teprve formuji. V diskusi se hovoiilo o tom, Ze