6    Návrh a tvorba automatizovaného procesu pro generování prostorových map

Proces generování prostorového modelu map bych rozdělil do několika částí:

získání výškové složky z mapy

tvorba VRML modelů

skládání jednotlivých modelů vedle sebe do větších celků a vytváření méně podrobných modelů pro využití v uzlu LOD.

Je pravda, že existují programy, které řeší dílčí úlohy, ale komplexně se tímto problémem ještě nikdo nezabýval. Existují vektorizační programy, např. Adobe Streamline. 3D modely lze vytvářet např. ve 3D Studiu s následným exportem do VRML. Dokonce i MicroStation, který používá mnoho geodetů, již obsahuje export do VRML, což ukazuje, jak se virtuální realita rozvíjí. Tyto programy jsou ale příliš univerzální a nepodporují všechny možnosti VRML, rovněž optimalizace pro prohlížení na internetu je většinou mizivá. Zkoušel jsem například exportovat z MicroStationu poměrně složitý model. Export proběhl celkem bez problémů, ale výsledný soubor byl tak velký, že ani nešel pořádně zobrazit. S vektorizací to bylo obdobné. Vektorizační program sice některé čáry rozpozná, ale vznikne jen soubor krátkých čar, protože vrstevnice jsou často přerušované. Proto jsem přistoupil k vývoji vlastních programů, které jsou „šité na míru“ a které mohu podle svých představ upravovat tak, abych dosáhl co nejlepšího výsledku.

K splnění úkolů jsem napsal čtyři rozsáhlejší programové moduly v jazyce C++. Použil jsem vývojové prostředí C++ Builder 5, které ovládám nejlépe a už jsem v něm dříve pracoval. C++ Builder nabízí velice kvalitní vizuální vývojové prostředí pro návrh a tvorbu graficky orientovaných aplikací pod operačním systémem MS Windows. Celková velikost zdrojového kódu, který jsem napsal, je zhruba 270 kB.

První program nazvaný Filtr získává výškovou složku z naskenované mapy. Rozpoznává ji podle barvy a vytváří dvoubarevný obraz, jenž obsahuje už jen výškovou složku a který se potom použije pro vektorizaci. Druhý program s názvem Vektorizator vektorizuje vrstevnice a následně se je snaží pospojovat. Ve třetím programu pojmenovaném Editor se výsledky vektorizace opravují, zadává se výška vrstevnic a dá se vytvořit jednoduchý model VRML. Čtvrtý program nazvaný Generator pak vytváří celkový model VRML, který se skládá z jednotlivých modelů.

Tento postup jsem použil pro starší mapy nebo mapy, které jsem měl k dispozici pouze v papírové formě. U dat, která máme již ve vektorové formě (např. ZABAGED), stačí exportovat tato data do programu Editor a dále postupovat jako u mapy analogové.

Podrobný postup je popsán v následujících kapitolách.

6.1   Skenování map

K dispozici jsem měl 6 listů Základní mapy ČR v měřítku 1:10 000, ze kterých jsem vytvářel prostorový model větší oblasti, a 3 orientační mapy pro tvorbu menších modelů. V průběhu vývoje programu pro vektorizaci jsem zjistil, že při skenování je zapotřebí rozlišení minimálně 600 DPI, aby rozpoznání vrstevnic bylo úspěšné. Ke skenování jsem používal skener formátu A4, takže jsem musel každý mapový list skenovat po čtvrtinách a v počítači jsem ho spojoval. Zde jsem narazil na menší problém, protože se mi nepodařilo mapy naskenovat stejně a jednotlivé skenované části vykazovaly odlišnosti v barevných odstínech, což pak vadilo při filtrování výškové složky. Další zpracování jsem dělal po celých mapových listech. Soubory s naskenovanými mapovými listy jsem ukládal ve formátu bmp o velikost asi 300 MB, které jsem dále použil pro zpracování v programu Filtr. Zpracování velkých celků najednou mělo své výhody i nevýhody. Spojování částí mapových listů zabere dost času, protože počítač musí pracovat s velkým množstvím dat, na druhou stranu je stejně nutné části mapy pospojovat, protože by ve výsledném modelu nemusely tyto části navazovat. Ideální by bylo mít k dispozici skener formátu A2 pro skenování celé mapy najednou.

6.2   Filtrace výškové složky mapy

Pro tento úkol jsem již napsal první program Filtr, protože mě neuspokojovaly výsledky jiných programů a chtěl jsem mít plnou kontrolu nad touto operací.

K filtraci výškové složky jsem použil jednoduchou metodu, kdy jsem procházel postupně jednotlivé pixely obrázku a testoval je podle zadaného kritéria. Tak jsem vytvořil černobílý obraz, který obsahoval jen výškovou složku. Jako kritérium program testuje, zda je daný obrazový bod v zadaném rozsahu barev. Barevný interval se zadává ve třech složkách barevného modelu HSB (hue - odstín, saturation - sytost, brightness - jas), který se mi zdál nejvhodnější. Vstupní obrázek je v barevném modelu RGB, a proto jsem musel naprogramovat převod RGB do HSB. Za tímto účelem jsem vytvořil dvě třídy RGBColor a HLSColor a funkci RGB_TO_HLS.

Po spuštění programu Filtr je uživatel vyzván k otevření souboru s obrázkem, který se má filtrovat. Určení intervalu barev zadává uživatel pomocí sady posuvníků v pravé polovině okna. Aby mohl uživatel vybrat optimální interval, umožňuje program zobrazit náhled výsledného obrazu (zaškrtávací políčko Zapnout test) nebo obrazu původního v kombinaci s výsledným (zaškrtávací políčko Podbarvit + políčko Zapnout test). Dále umožňuje zobrazit hodnoty barevných složek, podle kterých se pak může upravit barevný interval, a to kliknutím na konkrétní pixel na obrázku. Jestliže jsou zaškrtnuta výše zmíněná políčka, pak při podržení tlačítka myši je zobrazena hodnota aktuálně zobrazeného pixelu a při uvolnění tlačítka je zobrazena hodnota pixelu v původním obrázku.

Jestliže je uživatel spokojen s filtrací v náhledu, spustí konečnou filtraci tlačítkem Selekce a program provede filtraci celého obrázku. Pak už zbývá obrázek jen uložit do souboru tlačítkem Uložit (výsledný soubor má příponu bis).

Pro zmenšení velikosti výsledného souboru se obrázek ukládá jako bitová mapa, kdy jeden bit reprezentuje jeden pixel, takže je výsledný soubor oproti vstupnímu 24x menší (vstupní obrázek je v barevném modelu RGB 3 x 8 bitů na pixel). Program si nastavení barevných intervalů zaznamená do svého inicializačního souboru. To je výhodné, jestliže zpracováváme více map podobných barevných odstínů.

Obr. 6.1 Program první: Filtr.

6.3   Příprava pro vektorizaci

Po selekci vrstevnic následuje další krok, a to vektorizace. Dříve, než bude mapa vektorizována, je nutné opravit některé chyby v obraze a také celkově obraz upravit. Když jsem přemýšlel, jak udělat nejjednodušší a nejefektivnější program pro vektorizaci vrstevnic, musel jsem zjednodušit obraz tak, aby výsledek vektorizace za něco stál. Proto jsem přistoupil ke zjednodušení, kdy se vektorizují pouze vrstevnice zdůrazněné, které se kreslí v mapě silnější čarou.

Důvodů je hned několik:

jednodušší zpracování – menší množství dat

mapa občas obsahuje doplňující vrstevnice, které jsou kresleny čárkovaně a mátly by program při spojování vrstevnic

ve svažitějším terénu, kde by se základní vrstevnice slily dohromady, bývají naopak vynechány

mapa obsahuje technické šrafy, další zdroj možných chyb při rozpoznání vrstevnic; ty jsou kresleny stejně silnou čarou jako základní vrstevnice

zdůrazněné vrstevnice jsou silnější a lépe se rozpoznávají

Z těchto důvodů jsem se rozhodl zanedbat základní vrstevnice a generovat prostorový model jen na základě vrstevnic zdůrazněných. V méně členitém terénu tento způsob plně vyhovuje a v terénu členitějším je možno v následujícím kroku zpracování doplnit další výškové údaje. Dalším faktorem, který zvýrazňuje chyby způsobené tímto zanedbáním, je velikost výškového zkreslení. U malého výškového zkreslení se tyto chyby prakticky neprojeví, ale při větším zkreslení je tomu naopak.

Vrame se nyní k opravě a úpravě obrazu. Oprava obrazu spočívá pouze v doplnění chybějících pixelů, které čáry obsahují. Použil jsem jednoduchý postup, kdy jsem testoval okolí všech obrazových bodů, které jsou bílé, kolik mají ve svém přímém okolí černých pixelů. Jestliže jsou tři, maximálně čtyři, bod je změněn na černý. Tím se doplní chybějící body v čarách. Samozřejmě tato oprava není příliš dokonalá, ale je rychlá a důležitá pro další úpravy.

Po základní opravě obrazu následuje úprava, kdy se mažou tenké vrstevnice. Pro tento úkol jsem použil opět velice jednoduchý algoritmus, při němž se testují vždy dva sousední pixely, a to se sousedy buï v horizontálním, nebo vertikálním směru. Jestliže jeden z nich je černý a druhý bílý, potom se změní černý pixel na bílý. Tímto postupem dochází k tomu, že jsou mazány všechny okraje čar; ve výsledku tenké čáry zmizí úplně a silné čáry se změní v tenké. K tomuto algoritmu jsem přidal ještě jeden, který maže čáry silné jeden pixel, a to na základě testu dvou sousedů černého pixelu, které sousedí v jednom směru od něj. Jestliže jsou oba pixely bílé, potom se změní prostřední pixel také na bílý. Pomocí těchto dvou algoritmů je potom dosaženo celkem dobrého výsledku.

Tento krok je vykonáván ve druhém programu, který jsem pojmenoval Vektorizator. Po spuštění se nejdříve musí otevřít soubor vytvořený v programu Filtr. Otevřený soubor se objeví v okně a lze si ho prohlédnout. V pravé části okna aplikace je sada ovládacích tlačítek. Funkce oprava se spustí tlačítkem téhož názvu. Protože je tato funkce časově náročná, je v dolní části okna umístěn indikátor průběhu (ProgressBar), který dává uživateli informaci o průběhu operace.

Pro úpravu, která odstraní silnější čáry, jsou zde dvě funkční tlačítka. Tlačítko Štíhlení auto je vhodné pro většinu map. Pokud by výsledek této funkce nebyl uspokojivý z důvodů nestandardně širokých nebo naopak tenkých čar, je možné použít tlačítko Štíhlení, které ztenčuje čáry po krocích, na rozdíl od Štíhlení auto, které dělá tyto čtyři kroky najednou. Pomocí tlačítka Štíhlení je tedy možné ztenčovat čáry v malých krocích do té doby, než je většina tenkých čar smazána, ale přitom zesílené čáry (vrstevnice) jsou stále nepřerušované. Pokud by bylo v obraze více tenkých čar, které představují základní vrstevnice, může se stát, že je dále vektorizační funkce rozpozná jako čáry. Tím by vzniklo mnoho chyb, které by bylo třeba v dalším kroku opravovat. Naopak jestliže budou zesílené vrstevnice příliš ztenčené, může se stát, že je vektorizační funkce nerozpozná a budou potom v mapě chybět. Tyto problémy jsou způsobeny složitostí tohoto úkolu, který se už dotýká programování systémů umělé inteligence, které jsou schopny se učit. Dobrým příkladem takového programu jsou např. programy pro rozpoznání písma.

Jistým nedostatkem funkcí v programu Vektorizator je, že aplikace nemůže tyto kroky vrátit nazpět a uživatel se musí vždy, když ztenčí čáry příliš, vrátit na začátek a otevřít soubor znovu.

Obr. 6.2 Program druhý Vektorizator.

6.4   Vektorizace vrstevnic

Nejobtížnější operací v tomto postupu byla vektorizace. Základní myšlenkou tohoto algoritmu je, že program postupně prochází celý obraz a hledá čáry. Jestliže na nějakou čáru narazí, snaží se ji sledovat a zároveň ji za sebou maže. Tím zabraňuje tomu, aby tutéž vrstevnici nevektorizoval vícekrát.

Hledání čar spočívá v procházení celého obrázku postupně po řádcích a zjišování, kolik pixelů v určité čtvercové oblasti je černých. Jestliže počet černých pixelů překročí určitou mez, je toto místo pokládáno za část čáry a začíná její procházení. Když potom bude mít dostatečnou délku, uloží se do paměti pro další zpracování.

Zjišování průběhu čáry spočívá v tom, že si program vybírá ze čtyř směrů, kam jít. Vhodný směr se vybírá podle toho, ve kterém směru je nejvíce černých pixelů. Program si pokaždé vybere nejvhodnější směr a v tomto směru postoupí o jedno políčko, znovu si vybere nejvhodnější směr, a tak postupuje až do té doby, kdy klesne počet černých pixelů v daném místě pod určitou mez. Potom uloží rozpoznanou čáru do paměti.

Tento základní postup je dále doplněn o některé kontroly, např. kontrolu větvení, kdy program zjišuje, zda se čára nerozvětvuje, což by mohlo znamenat, že čára není vrstevnice, ale výšková šrafa.

Postup vektorizace lze shrnout do těchto základních kroků:

Procházíme celý obrázek po jednotlivých pixelech. Jestliže daná oblast u pixelu obsahuje větší množství černých bodů než je daná mez, považujeme toto místo za část čáry a přejdeme na bod 2).

Na tomto místě zjistíme směr, ze čtyř možných, ve kterém je nejvíce černých bodů.

V tomto směru se posuneme a zároveň v opačném směru smažeme černé body.

Opakujeme bod 2) a 3), dokud neklesne počet černých bodů v dané oblasti pod určenou mez.

Pokud je čára delší než zadané kritérium, uložíme ji do paměti a pokračujeme v prohledávání od bodu 1)

Pro práci s rozpoznanými čarami jsem vytvořil několik tříd. Protože se předem neví, kolik bude čar a bodů, je nevhodné použít pole. Proto jsem použil pro ukládání čar a bodů kontejneru vector. První vytvořená třída je Hmapa, která obsahuje popis celé rozpoznané mapy. Obsahuje velikost mapy, dále již zmíněné kontejnery, a to pro ukládaní jednak celých čar (třída Hcara) a dále i jednotlivých bodů (třída Hbod3D). Pro přístup do těchto datových struktur obsahuje tato třída také metody; dále obsahuje metody pro uložení a načtení dat této třídy do a ze souboru. Třída Hcara obsahuje body, které ukládá také do kontejneru třídy Hbod2D. Dále obsahuje nadmořskou výšku, která bude při editaci doplněna, počet bodů a informaci, zda je vrstevnice uzavřena. Třída obsahuje metody pro práci s čarou a pro uložení a načtení čáry ze souboru. Další údaj, který se ukládá spolu s těmito čarami, je pravděpodobný směr konců rozpoznaných čar, který potom slouží ke spojování vrstevnic. Další výhodou použití kontejnerů je jednodušší programování editačních funkcí.

Vektorizace se spouští tlačítkem Vektorizace, které je umístěno v pravé části okna aplikace. O průběhu funkce informuje indikátor průběhu jako v programu Filtr.

6.5   Spojování vrstevnic

Po vektorizaci je nutné pospojovat jednotlivé části rozpoznaných vrstevnic. To je prováděno rovněž v programu Vektorizator. Funkce se spouští tlačítkem Pospojovat. Program se v této funkci snaží správně spojit jednotlivé části rozpoznaných vrstevnic. V této funkci nejprve hledám konce vrstevnic, které jsou velice blízko u sebe, a spojím je. Dále hledám napojení vrstevnic podle jejich pravděpodobného směru; jestliže je v tomto směru vrstevnice, spojím je také. A do třetice hledám dvojice vrstevnic, které se v pravděpodobném směru pokračování protínají. Nakonec ještě dohledám vrstevnice na okraji mapy, jejichž konce zde pravděpodobně začínají.

Tento proces nefunguje vždy spolehlivě; problémy mu dělají zejména tenké vrstevnice, které by neměly být rozpoznány, proces si s nimi neví rady a někdy je napojí na silné vrstevnice. Tyto a jiné chyby se potom dají opravit v programu Editor.

Po pospojování již zbývá vrstevnice jen uložit. Program ukládá dva soubory se stejným názvem. Jeden s příponou car, kde se ukládají vlastní čáry, a druhý s příponou kon, kde se ukládají informace, jak jsou jednotlivé vrstevnice pospojované (kvůli dodatečné editaci pospojovaných vrstevnic). Soubory jsou v textovém formátu, a to hlavně z důvodu ladění vyvíjených programů.

6.6   Oprava a editace dat

Jestliže jsou vrstevnice pospojovány, zbývá už jen opravit případné chyby a zadat výšky vrstevnic, než bude možné vygenerovat první jednoduchý prostorový model. Oprava a zadání výšek vrstevnic se provádí ve třetím programu s názvem Editor, který jsem vytvořil. Ten umožňuje opravu a editaci vrstevnic, vložení nových vrstevnic, vložení jednotlivých bodů jako doplnění modelu, zadání výšek vrstevnic a vygenerování základního modelu terénu. Program obsahuje menu s funkcemi, klientskou oblast, kde se zobrazují vrstevnice, a několik tlačítek pro rychlý přístup k nejdůležitějším funkcím.

V první fázi je tedy třeba opravit rozpoznané vrstevnice, a to hlavně jejich špatné pospojování, doplnění nerozpoznaných částí a nakonec smazání špatně rozpoznaných vrstevnic. U kvalitní předlohy může být tento krok velice krátký, ale jestliže není předloha dobrá, může se oprava dosti protáhnout.

Po spuštění programu Editor je nutné nejprve otevřít soubor s rozpoznanými vrstevnicemi. Zároveň s rozpoznanými vrstevnicemi se načte soubor s popisem jejich pospojování. Vrstevnice se zobrazí v okně, kde si je můžeme prohlédnout. V okně jsou barevně rozlišeny dva typy čar. Červeně se zobrazují vlastní rozpoznané vrstevnice a světle modře se zobrazují čáry, které představují pospojování vrstevnic provedené v programu Vektorizator. Obraz s vrstevnicemi lze zvětšovat nebo zmenšovat. Pro zjištění pravděpodobného počtu chyb je v okně aplikace umístěno tlačítko Počet chyb. Po stisknutí tohoto tlačítka se zobrazí číslo, které představuje počet vrstevnic, jež nejsou spojené s žádnou další vrstevnicí a jejich konec není definován jako konec vrstevnice na okraji mapy. Pro procházení jednotlivých chyb je zde tlačítko Další chyba, které po zmáčknutí přesune zobrazení na další chybu, aby ji bylo možno opravit. S pomocí tohoto tlačítka je možné rychle opravit všechny chyby. Pro vlastní opravu jsou zde tlačítka, která umožňují vrstevnici smazat (tlačítko Smazat), změnit její napojení (tlačítko Změnit) anebo ji nastavit jako vrstevnici s koncem na okraji mapy (tlačítko Okraj). Hromadně lze smazat vrstevnice tlačítkem Smazat výřez.

Pro snadnější opravu je zde možnost zobrazit jako pozadí rozpoznaných vrstevnic obrázek s mapou. Tím je možné rychleji zjistit, jak správně opravit danou chybu. Po opravě všech chyb se nechají tyto části vrstevnic pospojovat (nabídka Spojování příkaz Pospojovat). Tím vzniknou už celkové čáry, které reprezentují jednotlivé vrstevnice. Dalším krokem je možné zredukovat počet bodů v modelu, což zrychlí jeho prostorové generování (nabídka Spojování příkaz Převzorkovat).

Následuje zadání výšek jednotlivých vrstevnic. Pro usnadnění tohoto úkolu je v okně aplikace 5 tlačítek. První tlačítko Výška zadat slouží pro přímé zadání výšky vrstevnice. Další tři tlačítka slouží pro hromadné zadání výšek. Vychází se vždy od vrstevnice s již známou výškou. Tažením kurzoru přes tuto vrstevnici dále k vrstevnicím o neznámé výšce je definována fiktivní spádnice. Podle toho, jakou jsme zvolili funkci (Z kopce, Do kopce nebo Rovina) se potom doplní výšky u dalších vrstevnic v zadaném intervalu. Pro tyto funkce je proto nutné zadat interval vrstevnic v dialogu Nastavení (nabídka Úpravy příkaz Nastavení). Pro zadání všech výšek je zde tlačítko Další výška, kterým se prochází vrstevnice s nezadanými výškami, a tak urychluje práci. Po zadání všech výšek je dobré soubor uložit. Program Editor ukládá navíc ještě soubor s jednotlivými body, kterými je možné mapu doplnit, zejména na kopcích, o výškové kóty. Soubor s čarami má příponu car a soubor se samostatnými body má příponu bod.

Jestliže máme zadané výšky, je soubor připraven na tvorbu prvního modelu. Můžeme si vybrat ze dvou základních typů modelu, a to buï model tvořený uzlem IndexFaceSet, nebo ElevationGrid. Před začátkem generace prvního modelu je ještě nutné zadat výškové zkreslení a název výsledného souboru. U modelu tvořeného uzlem IndexFaceSet je třeba zadat, které vrstevnice se mají použít (použijí se pouze vrstevnice, které mají nulový zbytek po dělení zadaným číslem), a u modelu ElevationGrid hustotu výškové sítě (dále je nutné mít správně nastaven výškový interval v dialogu Nastavení). Rychlost tvorby modelu závisí na počtu bodů, které tvoří model, výkonu počítače, případně hustotě výškové sítě.

Obr. 6.3 Program Editor.

6.7   Výstup dat ve formátu VRML

Generování VRML souborů se liší podle toho, jakým uzlem je model tvořen. Co mají ale oba typy modelů společné, je použití základních uzlů nutných pro zobrazení modelu. Proto jsem vytvořil knihovnu funkcí (soubor vrmlform.cpp a vrmlform.h), která mi usnadňuje generování VRML souboru. Je to soubor tříd, které reprezentují každá jeden uzel a zabezpečují správný výstup do souboru.

Pro tvorbu vlastního modelu je potom třeba získat buï trojúhelníkovou sí, nebo množinu výšek. Funkce pro tvorbu VRML modelů jsou uloženy v souborech vrml.cpp a vrml.h, pomocné funkce v souborech geometrie.cpp a geometrie.h.

6.7.1  Trojúhelníková sí

K tvorbě trojúhelníkové sítě jsem vytvořil základní funkci Mnozina_ploch, která z množiny bodů a vrstevnic generuje trojúhelníkovou sí. Funkce si vytváří kvůli zrychlení práce vlastní datové struktury. Nejprve si funkce zjistí počet bodů v modelu pro alokaci paměti. Načte seznam bodů z vrstevnic a samostatných bodů a zároveň množinu čar z vrstevnic, které musí použít jako strany trojúhelníků (předurčené hrany). Pak kvůli zrychlení následuje rozdělení bodů do čtverců přibližně po padesáti bodech. Funkce nemusí při hledání vrcholů nových trojúhelníků prohledávat všechny vrcholy, ale stačí projít body v okolí. Následuje vlastní tvorba trojúhelníků. Funkce začíná uprostřed mapy, kde vznikne první trojúhelník. Potom se prochází strany tohoto trojúhelníku, tvoří se nad nimi nové trojúhelníky a nad jejich novými stranami se pak dokola tvoří další trojúhelníky. Jako základní kritérium pro hledaný bod nového trojúhelníku jsem použil součet dvou délek nových stran vytvářeného trojúhelníku. Tímto jednoduchým postupem se vytvoří trojúhelníková sí.

Postup lze shrnout do těchto základních kroků:

Zjistíme počet bodů a vrstevnic a alokujeme pro ně pamě.

Načteme do této paměti všechny body v modelu a vrstevnice, které použijeme jako předurčené hrany.

Model rozdělíme do přibližně čtvercových oblastí zhruba po padesáti bodech.

Pro každý čtverec vytvoříme seznam bodů a seznam hran, které obsahuje.

Vytvoříme první trojúhelník, tedy nalezneme první bod nejblíže středu mapy a k němu nejbližší dva body.

Vlastní tvorba modelu:

Procházíme vytvořené trojúhelníky a testujeme, zda mají ze všech stran sousedy a nemá-li se tedy tvořit nad touto stranou nový trojúhelník.

Nad neobsazenou hranou trojúhelníku hledáme nový bod. Procházíme všechny body v území tvořené devíti čtvercovými oblastmi.

Nejdříve vypočteme délku nově vytvořených stran pomocí tohoto bodu jako kritérium a porovnáme s předchozí nejkratší.

Dále testujeme, zda je bod ve správné polorovině.

Poté testujeme, zda v nově vytvořeném trojúhelníku není jiný bod.

Dále testujeme, zda se nově vytvořené strany trojúhelníku nekříží s jinými trojúhelníky.

Nakonec testujeme, zda se nově vytvořené strany nekříží s některou vrstevnicí.

Jestliže zkoumaný bod splňuje všechny tyto podmínky, uloží se jeho kritérium, číslo bodu a prohledávání pokračuje od bodu 8).

  Po prohledání všech bodů se vytvoří nový trojúhelník, který je tvořen stranou původního trojúhelníku a bodu uloženého v paměti z bodu 13).

Dokud program neprojde všechny trojúhelníky a všechny jejich hrany, pokračuje od bodu 6).

6.7.2  Množina výšek

Pro tento úkol jsem vytvořil funkci Vyskova_mapa. Jejím úkolem je vytvořit množinu výšek nad body pravidelné sítě. Tato funkce – obdobně jako funkce Mnozina_ploch – nejdříve rozdělí body a vrstevnice do čtvercových oblastí, čímž se zvýší rychlost funkce. Výšky získává funkce pomocí lineární interpolace ze dvou nejbližších výšek, a to získaných buï z vrstevnic, nebo samostatných bodů, k hledanému bodu výškové sítě. Jestliže je požadovaný bod na okraji mapy, převezme se výška od nejbližšího samostatného bodu nebo vrstevnice.

Postup lze shrnout do následujících kroků:

Zjistíme počet bodů a vrstevnic a alokujeme pro ně pamě.

Načteme do této paměti všechny samostatné body v modelu a vrstevnice jako dvojice bodů (vrstevnicové úseky).

Model rozdělíme do přibližně čtvercových oblastí zhruba po 25 vrstevnicových úsecích.

Pro každý čtverec vytvoříme seznam bodů a seznam vrstevnicových úseků.

Vlastní program.

Funkce prochází jednotlivé vrcholy výškové sítě, aby získala jejich výšku.

Pro každý bod sítě funkce nejdříve hledá vrstevnici, která je nejblíže.

Potom hledá samostatný bod, který je nejblíže.

Dále hledá druhou nejbližší vrstevnici a zároveň testuje, zda mezi ní a bodem výškové sítě není jiná vrstevnice.

Jestliže je nalezený samostatný bod blíže k vrcholu výškové sítě než druhá nalezená vrstevnice, testuje program, zda mezi samostatným bodem a vrcholem výškové sítě se nekříží s některou vrstevnicí.

Pokud se samostatný bod s žádnou vrstevnicí nekříží, použije se pro výpočet výšky nejbližší vrstevnice a samostatný bod; v opačném případě se výška vypočte ze dvou nejbližších vrstevnic, a to lineární interpolací.

Dokud program neprojde všechny body výškové sítě, pokračuje od bodu 5).

6.8   Skládání světů

Pro tvorbu rozsáhlejšího virtuálního modelu jsem vytvořil čtvrtý program Generator. Tento program umožňuje poskládat jednotlivé modely vedle sebe, vytvořit jejich vícenásobné reprezentace s různým stupněm generalizace a také rozdělit tyto modely na menší části. Dále umožňuje nastavit základní parametry generovaného virtuálního světa.

Program se skládá z několika záložek, pomocí kterých se definují vlastnosti světa.

První záložka se jmenuje Základ. Zde se definují základní parametry modelu, jako je typ modelu[6], měřítko původní mapy, rozlišení použité při skenování mapy, požadované výškové zkreslení generovaného modelu a ekvidistance vrstevnic modelu. Dále zde lze nastavit rozdělení vlastního modelu na menší části, které budou v samostatných souborech a budou se při otevření modelu načítat postupně.

Záložka Avatar, pomocí níž se definují vlastnosti avatara, a to výška, rychlost pohybu, dohled, způsob pohybu a zapnutí svítilny na pomyslném čele avatara.

Na další záložce s názvem Pozadí se dá definovat pozadí modelu, a to pomocí barevného přechodu tří barev pro nebe a tří barev pro zem.

Důležitá je také záložka Světlo a mlha, na které se definují vlastnosti světla ve virtuálním světě, jeho barva, poloha a dosah. U mlhy se dá nastavit barva, maximální viditelnost a způsob houstnutí mlhy.

Na záložce Vlastnosti modelu se definují jak společné vlastnosti pro oba modely (tj. úhel vyhlazení), tak i speciální vlastnosti pro konkrétní model. U výškové mapy je to hustota výškové sítě modelu a u množiny ploch je to stupeň generalizace způsobený vynecháním některých vrstevnic o dané výšce.

Stupeň detailu je záložka, na které se dá definovat vícenásobná reprezentace modelu vytvářená pomocí uzlu LOD. Je zde možnost nastavení způsobu přepínání jednotlivých reprezentací[7] ručně, automaticky nebo kombinací obou způsobů. Dále se zde nastavuje stupeň generalizace těchto pomocných modelů a to snižováním počtu vrcholů výškové sítě a také kolikrát se má zmenšit rozlišení použité textury.

Záložka Skládání světů slouží k poskládání jednotlivých modelů vedle sebe, např. mapových listů.

Do záložky Povrchová textura se zadává název souboru obsahující texturu celého modelu. Dále umožňuje spojit obrázky s texturou jednotlivých mapových listů do jednoho souboru.

Pro usnadnění nastavení stupňů detailů je zde tlačítko Nastav auto, které v závislosti na velikosti mapy, počtu menších částí, na které byl model rozdělen a na nastavení počtu stupňů detailů vypočítá a doplní hustotu výškové sítě ve Vlastnostech modelu a Stupních detailu a zároveň Vzdálenost pro přepínání jednotlivých reprezentací modelu tak aby byla rychlost zobrazení optimální.

Po zadání všech parametrů již stačí jen zmáčknout tlačítko Generuj VRML a začnou se vytvářet jednotlivé části modelu.

Obr. 6.4 Program Generator.