1 Úvod Trangulace oblast má dnes využtí například v počítačové grafce nebo numercké matematce, kde základní algortmy pro výpočet parcálních dferencálních rovnc vyžadují rozdělení zadané souvslé oblast na množnu jednoduchých podoblastí, na nchž se parcální dferencální rovnce nahradí rovncem algebrackým. V našem případě budou daným jednoduchým podoblastm trojúhelníky (je možno využívat jné konvexní n-úhelníky). Mez nejčastěj používané algortmy patří tzv. metoda level setů a algortmus vrstvení. Samotný algortmus vrstvení probíhá následujícím způsobem: Vstupem je uspořádána množna křvek, které oblast ohrančují. Tyto okrajové křvky se postupně posouvají ve směru jejch normály dovntř zadané oblast. V každé terac vrstvení se vypočtou průsečíky posunutých křvek a mez nm se poté vytvoří nová vrstva. Nakonec se vznklý pruh mez mnulou a současnou vrstvou vyplní sítí trojúhelníků. Na výstupu pak bude množna trojúhelníku ndexy vrcholů a jejch souřadnce. Oblast může být ohrančena jakýmkolv druhem křvek; v prác se dále zaměříme pouze na úsečky a Bézerovy křvky, kterým se dá popsat celá řada oblastí. Od množny křvek se očekává, že budou zadány v pravotočvém směru. Implementace algortmu, kterou budeme v prác popsovat, je zjednodušením metody vrstvení. Od základního algortmu se lší v tom, že neposouváme původní hladké křvky a nepočítáme jejch průsečíky, což vede na řešení pomocí Newtonovy metody, vz [5], ale posouváme uzly dskretzace ležící na křvkách směrem dovntř oblast. Z výsledných bodů pak souborem několka pravdel, např. elmnujeme pseudoostré úhly, vytvářím jednotlvé trojúhelníky. Z nově přdaných vrcholů vytvoříme další vrstvu, na kterou pak teratvně aplkujeme opět stejný postup. Celý proces bude ukončen v momentě, kdy už nemá smysl pokračovat, např. počet bodů klesne pod předem stanovenou hodnotu. Metoda level setů je založena na mplctním popsu hrance oblast, které je obecnější než parametrcké. Další vrstvy jsou dány řešením evoluční dferencální rovnce vz [6]. Text bude rozdělen do následujících částí: V kaptole 2 více rozebereme jednotlvé křvky, jakým způsobem se zadávají, jejch základní vlastnost a více se budeme také věnovat způsobu, jak spočítat jejch délku. V kaptole 3 zavedeme některé pojmy, důležté pro pops sítě a jednotlvých vrstev, hlavní náplní bude ovšem pops metody vrstvení a to ve 2D. 4. kaptola pak bude věnována konkrétní mplementac algortmu. Jedná se hlavně o jednoduchý pops a návrh datových struktur, které jsou použty, a dále detalnější rozbor některých důležtých procedur. V poslední 5. kaptole pak uvedeme pár příkladů oblastí, na kterých byla metoda použta a některé problémy, kterým je třeba v budoucnu věnovat větší pozornost. 1
2 Křvky a operace s nm 2.1 Základní křvky V této kaptole se budeme věnovat podrobnějšímu rozboru jednotlvých geometrckých tvarů, které mohou ohrančovat oblast. Mohou být lbovolné; ovšem pro účely této práce byly zvoleny 2 druhy úsečka a Bézerova křvka. 2.1.1 Úsečka Úsečka je defnována jako podmnožna U prostoru R n A u, jejíž parametrcký předps je následující: U A v ={A v t R n : A, v R n, t 0,1 }, kde v je směrový vektor úsečky defnovaný: v R n ; v=b A. Body A, B R n jsou po řadě počáteční a koncové body úsečky; t je parametr: Celý algortmus vrstvení je založený na určování vzájemných poloh bodů a úseček, případně úhlů, které svírají. Proto zde uvedu několk základních defnc, vz [3], které se pro určování vzájemných poloh používají. Norma vektoru je zobrazení. : R n R, pro které platí následující 4 podmínky: ) v =0 v= 0; v R n ; 0={0,0,,0} ) v 0; v R n ) v = v ; R ; v R n v) u v u v ; u, v R n Dále budeme výhradně používat tzv. Eukledovskou normu, která je pro vektor u defnována: u R n ; u = u 1 2 u 2 2 u n 2. Skalární součn je zobrazení.,. : R n R n R, které dané dvojc vektorů u a v přřadí reálné číslo. Musí pro něj platt tyto podmínky: ) u v, w = u, w v, w ; u, v, w R n ) u, v = u, v ; R ; u, v R n ) u, v = v, u ; u, v R n v) v, v 0 ; v, v =0 v= 0 ; v R n ; 0={0,0,,0} Dále budeme výhradně používat Eukldův skalární součn vektorů u a v defnovaný následujícím způsobem: u, v R n ; u, v =u 1 v 1 u 2 v 2 u n v n. 2
Eukldova norma je ndukována Eukldovým skalárním součnem následovně: u = u, u. Úhel R svírající dva vektory u a v je defnován takto: u, v cos = u v. Pomocí těchto zobrazení a defnc jsme schopn spočítat úhel R, který svírají dvě úsečky U A u a V B v, které mají aspoň jeden společný bod. Do předchozího vzorce dosadíme směrové vektory úseček. U A u ={A u t R n : A, u R n, t 0,1 }, V B v ={B v s R n : B, v R n, s 0,1 }, u, v =arccos u v. Mějme vektor v R 2 : v= x, y, pak vektor u, kolmý na v v pravotočvém smyslu defnujeme takto: u= y, x. 2.1.2 Bézerova křvka Bézerova křvka je množna P t R n, která je určena řídícím polygonem, což je konečná posloupnost n bodů v P 0, P 1,,P n R n prostoru. Body na Bézerově křvce jsou dány tímto výrazem, vz [4]: n P t = P B n t ; t 0,1, kde B n =0 t jsou Bernstenovy polynomy, konstruované následujícím způsobem: kde kde B n t = n t 1 t n ; =0,, n, n n! = n!! ; n N, {0,1,,n}, 0!: N 0 N je faktorál a je defnovaný tímto předpsem: 0!=1, 1!=! 1, N. Pro lustrac mějme Bézerovu křvku zadanou 4 body, pak její Bernstenovy polynomy vypadají následujícím způsobem: 1. B 4 0 t = 1 t 3, 3
2. 3. 4. a výsledný tvar křvky je: B 1 4 t =t 1 t 2, B 2 4 t =t 2 1 t, B 3 4 t =t 3 P t =P 0 1 t 3 P 1 t 1 t 2 P 2 t 2 1 t P 3 t 3. Z defnce vyplývá, že Bézerova křvka vychází z prvního bodu řídícího polygonu, jelkož pro t=0: P t =P 0, a končí v posledním bodě polygonu t=1: P t = P n. Další důležtou vlastností křvky je to, že její tečna v počátku je spojncí prvního a druhého bodu řídícího polygonu a v koncovém bodu je její tečna ke spojncí posledního a předposledního bodu polygonu. Tyto vlastnost jsou lustrovány na Obrázku 2.1. Obrázek 2.1: Bézerova křvka 2.2 Výpočet délky křvky Pro obecný výpočet délky křvky je nejprve třeba defnovat několk dalších pojmů. Dervace funkce, vz [1]: Mějme funkc f x :R R, pak její dervace je funkce f ' x :R R, která v bodech svého defnční oboru nabývá hodnot, exstuje-l pravá strana rovnost: f ' x =lm h 0 Obdobně platí vztah pro dervac zleva. f x h f x ; x R. h Jednostranná dervace funkce zprava je defnována (opět za předpokladu exstence pravé strany): f x h f x f ' x = lm ; x R. h 0 h 4
Mějme funkc f x 1, x 2,, x n :R n R m, pak parcální dervace f podle x je defnovaná vztahem: f x 1,, x n =lm x h 0 f x 1,, x 1, x h, x 1,, x n f x 1,, x n h Opačným procesem k dervac je ntegrace. Potřebujeme k ní defnc prmtvní funkce: Funkce F x : R R se nazývá prmtvní funkcí k funkc f x : R R na otevřeném ntervalu I, když: x I : F ' x = f x. Prmtvní funkce F x : R R k zadané funkc f x : R R je jednoznačná až na konstantu a značíme j: f x dx=f x c ; c R. Levou stranu této rovnce nazveme neurčtým ntegrálem. Abychom ntegrál vůbec mohl najít, vyžaduje se spojtost funkce f(x) na ntervalu I. Dalším důležtým pojmem pro výpočet délky křvky je určtý ntegrál. Buď funkce f omezená v ntervalu a,b ; tzn., že exstují čísla m,m R taková, že: m f x M ; x a,b. Pro každé dělení D ntervalu a, b označme: Dělení ntervalu a,b je defnováno takto: D : a=x 0 x 1 x n 1 x n =b. a, =1, 2,, n. Je dána funkce f x :R R, pak aby byla funkce dferencovatelná na ntervalu I R : I= a,b, musí být splněny následující tř podmínky: 1. x a, b f ' x R 2. f ' a R 3. f ' b R n s D = k=1 nf f x x x k 1, x k x x k k 1 n S D = k=1 sup f x x x k 1, x k x x. k k 1 resp.: Dolním (resp. horním) Remannovým ntegrálem funkce f od a do b, rozumíme číslo: b a b a f x dx=s up {s D : D je dělení a,b }, f x dx=nf {S D : D je dělení a,b }. 5
Platí-l: b a b f x dx= a pak nazýváme toto číslo Remannovým ntegrálem funkce f od a do b a značíme: b a f x dx. f x dx, Máme-l graf nezáporné funkce f(x), pak hodnota Remannova ntegrálu odpovídá obsahu plochy mez funkcí f(x) a osou x. Pokud funkce leží pod osou x, je hodnota ntegrálu záporná. Nyní jsme schopn spočítat délku lbovolné křvky na ntervalu I a,b. Mějme funkc f(x) dferencovatelnou na a, b, Její délka pak odpovídá následujícímu ntegrálu: Pokud máme křvku : I R m zadanou parametrcky následujícím způsobem: = 1 t, 2 t,, m t, t a, b, kde t jsou dferencovatelné na a,b, pak její délka na ntervalu I a,b je rovna tomuto ntegrálu: b 1 [ f ' x ] 2. a b [ ' 1 t ] 2 [ ' 2 t ] 2 [ ' m t ] 2 dt. a Specálně délka úsečky U A u je dána normou jejího směrového vektoru v. Avšak pro obecnou Bézerovu křvku neznáme obecný analytcký předps, jak vypočítat tento ntegrál. Mějme pro náš případ Bézerovu křvkou v 2D zadanou n body. Její parametrcká rovnce pak vede na tvar: n x t, y t = P t = P B n t ; t 0,1, =0 kde x(t) a y(t) jsou polynomy stupně n. Jejch dervace bude tedy polynom stupně maxmálně n 1. Pokud tento polynom dosadíme do vzorce pro výpočet délky křvek, dostáváme pod odmocnnou polynom stupně maxmálně 2n 2: 1 k 0 k 1 t k 2 t 2 k t 2n 3 2n 3 k t 2n 2 2n 2 dt=? ; k k, k R. 0, 1, 2n 2 0 A zde vznká problém, obecně tento ntegrál totž analytcky řešt nelze. Jsme tedy nucen řešt danou úlohu numercky. Jedna z možností je aproxmovat Bézerovu křvku pomocí krátkých úseček, kdy délku 6
odhadneme jako součet délek těchto úseček. Pokud délka těchto dskretzovaných úseček půjde k nule, pak se lmtně blížíme k délce křvky. Křvku dskretzujeme za pomocí parametru t. Jelkož t 0, 1 stačí zvolt dskretzační krok t, se kterým budeme nterval dělt. Buď tedy D dskretzací defnčního oboru Bézerovy křvky. Pak platí: D = t 0, t 1,,t n : t = t, =0,1,,n U Bézerovy křvky je nutno počítat s dostatečně malým t, jelkož pokud nterval 0,1 dělíme na stejné díly, neznamená to, že jsme schopn stejnoměrně rozdělt křvku vz Obrázek 2.2, kde t=0,05. n k 0 =1 P t P t 1 0 1 k 0 k 1 t k 2 t 2 k 2n 3 t 2n 3 k 2n 2 t 2n 2 dt. Obrázek 2.2: Dskretzace Bézerovy křvky pomocí parametru t 3 Metoda vrstvení V této kaptole popíšeme jednu z nejpoužívanějších metod na trangulac 2D oblastí. Nejprve je ovšem třeba defnovat několk pojmů, které popsují vlastnost oblast, kterou chceme dskretzovat, a vlastnost celé sítě. Defnce jsou převzaty z [2]. 3.1 Defnce Vektorovou funkcí z rozumíme zobrazení z R n R m do R n. R m Křvkou zadanou parametrcky v, dále jen křvka, rozumíme každou spojtou vektorovou funkc: : I R m, kde I =D R je nterval. křvky Množnu = I ={ t :t I } R m pak nazýváme geometrckým obrazem. 7
Křvku nazýváme: 1. jednoduchou, je-l prosté; 2. uzavřenou, je-l I = a,b a,b R ; a b a navíc a = b ; 3. jednoduchou uzavřenou, je-l uzavřená a platí: t 1,t 2 a,b, 0 t 1 t 2 b a t 1 t 2. D Dskretzací defnčního oboru křvky : I R m, I = a,b nazveme tuto konečnou uspořádanou množnu bodů: D = t 1, t 2,,t n kde t I, =1,2,,n ; a=t 1 t 2 t n =b. Množnu R n nazýváme oblastí, je-l současně : 1. je otevřená: x U x : x U x U 2. je souvslá: Každé dva body lze spojt křvkou v ; přesněj pro každé dva body, exstuje křvka : a, b R n taková, že a = a b =. Hrance oblast značíme. Uzávěr oblast je množna všech bodů prostoru R m, jejchž lbovolné okolí U má s oblastí neprázdný průnk: ={x R m : U x,u x } platí, že =. Nechť je jednoduchá uzavřená křvka v R 2. Pak exstují oblast 1, 2 R 2 takové, že: 1. R 2 = 1 2, 2. 1 2 =, 3. 1 = 2 =, 4. 1 je omezená a 2 je neomezená v R 2. Oblast 1 = nt nazýváme vntřkem křvky, oblast 2 =ext se nazývá vnějšek křvky. Oblast nazveme jednoduše souvslou, pokud platí pro každou uzavřenou křvku : : a, b R 2 nt. R 2 Vrstvou v sít označíme posloupnost bodů z. 8
Element (prvek) sítě označme, v našem případě půjde o trojúhelník. Dskretzační síť defnujeme: ={K : =0,1,,n} K kde K jsou trojúhelníkové elementy sítě, které pokrývají dskretzovanou oblast: dom = K. =0 a každé dva různé K, K j mají buď právě jednu společnou hranu, nebo právě 1 společný vrchol nebo K K j =. Snažíme se o to, aby dom, což nelze např. pro nepolygonální. n 3.2 Vrstvení ve 2D Na vstupu algortmu máme zadanou uspořádanou množnu křvek zadaných parametrcky v pravotočvém smyslu, které ohrančují zvolenou konvexní jednoduše souvslou oblast R 2 : = 1, 2,, n kde : I R 2 jsou křvky. Pro množnu musí platt toto pravdlo: Nechť I = a,b : {1,,n}, pak {1,,n 1} b = 1 a 1 n b n = 1 a 1 Jným slovy křvka musí vycházet z posledního bodu předcházející křvky a poslední křvka musí končt v počátečním bodu první křvky. 3.2.1 Krok 1: Vytvoření základní vrstvy Dalším krokem v našem algortmu je vytvoření základní vrstvy V 0 z množny n křvek. Máme zadanou V 0 : délku úseček, na kterou chceme zadané křvky dskretzovat. Základní vrstvu lze popsat následujícím způsobem: Nechť D = t 1,, t m je dskretzací defnčního oboru křvky : I R 2, pak platí pro vrstvu: V 0 ={ 1 t 1 1, 1 t 1 2,, 1 t 1 m1, 2 t 2 2,, 2 t 2 m2,, n t n n 2,, n t mn 1 }. Jak je vdět, tak z první křvky načteme všechny body, z dalších pak vynecháme jejch počátky a z poslední křvky vynecháme navíc její koncový bod, to vše kvůl tomu, že křvky na sebe navazují. Body v 0 1 = 1 t 1 1 až v 0 n k = n t mn 1 označíme jako vrcholy ve vrstvě V 0. Mějme tedy 0 0 0 vrchol v j pak symboly v j 1 a v j 1 jsou myšleny předcházející a následující vrcholy ve stejné vrstvě. Tímto jsme s ze zadaných vstupních křvek vytvořl základní vrstvu, z ní pak začneme 9
postupně vytvářet další vrstvy, přčemž použjeme níže popsaný soubor pravdel. 3.2.2 Krok 2: Výpočet úhlů Mějme tedy vrstvu V s vrcholy v 1,,v k, k N, jako další spočítáme úhly u jednotlvých vrcholů. Tzn. u vrcholu v j úhel, který svírají směrový vektor úsečky určené body v j 1 a v j a směrový vektor úsečky daný body v j a v j 1. Postup je podrobněj popsán v kaptole 2. Abychom generoval téměř rovnostranné trojúhelníky, zkušenost ukázala, že je vhodné rozlšovat následující úhly: ) pseudoostrý úhel α: 0 2 5, ) pseudotupý úhel α: 2 5 4 5, ) pseudopřímý úhel α: 4 5 6 5 Díky předpokládané konvexnost oblast není třeba uvažovat další možné hodnoty úhlů. 3.2.3 Krok 3: Rušení nevhodných vrcholů Nejprve z vrstvy vyškrtneme všechny vrcholy, u kterých jsou ostré úhly (vz Obrázek 3.1). Předpokládejme, že ve vrstvě V je ostrý úhel u vrcholu v j, pak do dskretzační sítě přdáme element K určený vrcholy v j 1,v j,v j 1, vyškrtneme vrchol v j z V vrstvy a dále pak přepočítáme úhly u vrcholů v j 1 a. v j 1 Obrázek 3.1: Zrušení pseudoostrého úhlu ve vrstvě Pak z vrstvy vyškrtneme takovou dvojc po sobě jdoucích vrcholů, kde u obou vrcholů je tupý úhel. Mějme tedy takové dva vrcholy v j,v j 1 ve vrstvě V. Mez body v j 1, v j 2 vytvoříme úsečku a její střed S přdáme do vrstvy. Z vrstvy vyškrtneme body v j, v j 1 a přepočítáme nové úhly. Do dskretzační sítě pak přdáme tyto tř elementy: K 1 určený vrcholy v j 1, v j, S, K 2 určený vrcholy v j, v j 1, S, určený vrcholy v j 1, v j 2, S. K 3 10
Celý postup je opět lustrován na Obrázku 3.2. Obrázek 3.2: Zrušení dvou po sobě jdoucích pseudotupých úhlů ve vrstvě Oba kroky, př kterých rušíme vrcholy, se provádí do té doby, dokud ve vrstvě jsou přítomny vrcholy, které splňují hledané podmínky. Pokud takové vrcholy jž nejsou, můžeme přkročt k tvorbě další vrstvy. 3.2.4 Krok 4: Vytvoření nové vrstvy Vrcholy procházíme postupně od prvního až k poslednímu a podle úhlů vytváříme body v další vrstvě V k. Mohou nastat tyto dvě možnost: 1. Úhel α u vrcholu ve vrstvě je pseudopřímý, 2. Úhel α u vrcholu ve vrstvě je pseudotupý. Pseudopřímý Nechť úhel α je pseudopřímý, pak rozlšíme tř případy: a) vrchol v j je první ve vrstvě V, b) vrchol v j není an první, an poslední ve vrstvě, c) vrchol je poslední ve vrstvě. v j Postup přdávání bodů do vrstvy je pro všechny případy totožný, lší se pouze elementy, které poté přdáme do naší dskretzační sítě. Buď vektor n normálovým vektorem k vektoru u=v j 1 v j. Postup, jak přesně vypočítat jeho souřadnce, je podrobně popsán v kaptole 2. Vektor n přenásobíme číslem k R tak, aby platlo: kde d je délka úsečky, na vznklý element určený tedy spočítáme: V k v j v j v j V V V V k n = 3 2 d, které chceme síť dskretzovat. Hodnotu k počítame tak, aby, v j 1, P vrcholy byl rovnostranný. Nový vrchol P ve vrstvě P =v j 1 2 u k n. 11
v j,v j 1 Jným slovy, ze středu úsečky určené body vedeme kolmc dovntř oblast a na ní ve vzdálenost k n pak nalezneme bod P. Postup je načrtnut na Obrázku 3.3: Obrázek 3.3: Přdání nového vrcholu u pseudopřímého úhlu Nyní rozebereme, které elementy přdat do naší sítě v závslost na pozc vrcholu vrstvě, vz Obrázky 3.4.a-d. Ad a) Přdáme pouze jeden element K daný vrcholy v j, v j 1, P. v j ve Obrázek 3.4.a: Přdání elementu na počátku vrstvy Ad b) Jelkož jsme uprostřed vrstvy, pak jž v některém z předchozích kroků musel být přdaný nějaký vrchol do nové vrstvy V k, označme jej Q. Pak přdáme dva elementy: K 1 určený vrcholy v j,v j 1, P a určený vrcholy, P,Q. K 2 v j Obrázek 3.4.b: Přdání elementů uprostřed vrstvy Ad c) Opět máme vrchol Q, pak v tomto případě je třeba rozlšt dva případy: 1. Úhel u prvního vrcholu ve vrstvě V je pseudopřímý, 2. Úhel u prvního vrcholu ve vrstvě je pseudotupý. V 12
V prvním případě označme R první vrchol přdaný do vrstvy, pak přdáme tyto 3 elementy, vz Obrázek 3.4.c: K určený vrcholy P,v j,q 1, K 2 určený vrcholy v j, P,v 1 a K 3 určený vrcholy P, v 1, R. V k Obrázek 3.4.c: Přdání elementů na konc vrstvy (následuje pseudopřímý) Ve druhém případě opět označíme R první vrchol přdaný co vrstvy, pak abychom zaručl požadovanou rovnostrannost elementů, přepočítáme souřadnce bodu R za pomocí bodu P takto: R nový = R původní P 2 Nový bod R bude tedy ležet ve středu úsečky dané body R a P. Bod P do nové vrstvy jž nepřdáme, vz Obrázek 3.5.. V k Do sítě přdáme potom tyto dva elementy (Q je opět poslední přdaný vrchol v nové vrstvě): K 1 určený vrcholy Q,v j, R, určený vrcholy, R,v 1. K 2 Celý postup opět znázorněn na Obrázku 3.4.d. Obrázek 3.5: Přepočítání souřadnc prvního bodu vrstvy v j 13
Obrázek 3.4.d: Přdání elementů na konc vrstvy (následuje pseudotupý) Pseudotupý Mějme úhel α pseudotupý, pak rozlšujeme tř případy: a) vrchol v je první ve vrstvě, j V b) vrchol v j je uvntř vrstvy V, c) vrchol je poslední ve vrstvě. v j V Ad a) Vypočteme první vrchol P a zařadíme jej do nové vrstvy (nepřdáme elementy!): Mějme vektor u=v j 1 v j 1, spočítáme k němu normálový n vektor, přenásobíme jeho souřadnce číslem k R, tak aby: k n =d. kde d, je zadaná délka dskretzované úsečky. Vektor přenásobíme, protože chceme, aby se elementy sítě co nejvíce blížly rovnostranným trojúhelníkům (lustrováno na Obrázku 3.6). Pro vrchol P pak platí: P =v j k n. Zároveň pak přblžně platí následující rovnost: P v j v j 1 v j v j v j 1 Obrázek 3.6: Výpočet souřadnc bodu P Ad b) Obdobným postupem jako v předchozím případě spočítáme vrchol P. Jelkož jsme uprostřed vrstvy, tak jsme někdy v mnulost musel do nové vrstvy přdat jž nějaký 14
vrchol. Opět označme tedy poslední vrchol v nové vrstvě Q, jeho souřadnce přepočítáme takto: Q nový = Q P původní. 2 Vrchol P nepřdáme do nové vrstvy. Do sítě pak přdáme element určený vrcholy v j,q,v j 1, vz Obrázek 3.7. Obrázek 3.7: Přdání elementu (pseudotupý úhel uprostřed vrstvy) Ad c) Pokud jsme na konc vrstvy, pokračujeme stejně jako v předchozím případě. Nechť R je první bod v nové vrstvě, pak přdáme následující elementy, vz Obrázek 2.8: K 1 určený vrcholy v j, Q, v 1, K 2 určený vrcholy Q,v 1, R. Obrázek 3.8: přdání elementů (pseudotupý úhel na konc vrstvy) Tento soubor pravdel aplkujeme na vrstvy, dokud počet bodů ve vrstvě neklesne pod 7. Pak už jednoduše vyplníme tuto malou vrstvu elementy a vrstvení ukončíme. 3.2.5 Krok 5: Dělení na podvrstvy Během algortmu může docházet k tomu, že se nám nově přdávaná vrstva rozdělí na dvě nebo více podvrstev. Zde tedy navrhneme, jak tento problém řešt. Algortmus popíšeme v pseudoprogramátorském jazyce. 15
Mějme zásobník Z, do kterého ukládáme vrstvy. Na počátku do zásobníku vložíme vrstvu V 0. Do zásobníku budeme postupně ukládat všechny nové vrstvy, které je ještě třeba dále zpracovávat (počet vrcholů ve vrstvě je menší než 7). Vstup: V 0 = v 0 1,, v n0 kde n 0 je počet vrcholů ve vrstvě V 0. Výstup: dskretzovaná síť. k = 0; whle (Z neprázdný) { nact_vrstvu_z_vrcholu_zasobnku ( V k ) vrstven ( V k ) k = k + 1; } V k vrstven ( ) f ( n k 7 ) return; else { whle (!rozdel ( V k )) ; vytvor_novou_vrstvu( W, ) //prdavan elementu do vloz_vrstvu_do_zasobnku( W ) } V k rozdel ( ) for =1,,n k 2 for j= 3,,n k //horní mez se může lšt f ( v k j v k 2d ) { vytvor_podvrstvu( X ) vloz_vrstvu_do_zasobnku( X ) vyskrtn_body( V k ) return true; } return false; } 16
vytvor_novou_vrstvu( W, ) Zde používáme veškeré kroky, které jsou popsány v kaptole 3. Hlavní procedura, ve které se vytváří elementy a přdávají se do sítě. V k rozdel( ) V této část kontrolujeme, jestl se body ve vrstvě k sobě nepřblížly natolk, že pokud bychom na ně aplkoval proceduru vytvor_novou_vrstvu(), tak by se nová vrstva protínala. Pokud toto nastane, pak vrstvu rozdělíme na dvě. Meze ve druhém for cyklu nastavíme vždy tak, aby se zkoumaný vrchol neporovnával s dvěma následujícím a dvěma předchozím vrcholy. vytvor_podvrstvu( X ) Podvrstvu vytvoříme takto: Nechť v k j v k 2d Pokud, pak do podvrstvy vložíme všechny body v k j v k d v k k,,v j : k k A z vrstvy V k vyškrtneme body v 1,,v j 1, vrstva pak bude vypadat následovně: V k = v k 1,,v k,v k k j,,v nk. Musíme pak sesypat ndexy, ať na sebe navazují. Pokud d v k j v k 2d, pak je postup obdobný, pouze budeme uvažovat navíc střed S k úsečky dané body v j a. Vrstvy X a pak vypadají takto: v k X = v k k, v 1,,v k j,. V k X = v k k,v 1,,v k j, S, V k = v k 1, v k 2,,v k,s,v k k j,,v nk. Oba dva případy jsou lustrovány na Obrázcích 3.9 a 3.10. Obrázek 3.9 Dělení vrstvy bez středu 17
Obrázek 3.10: Dělení vrstvy se středem 4 Implementace Samotný algortmus vrstvení není na pohled přílš složtý, ovšem př jeho mplementac může docházet k řadě komplkací a problémů, které je třeba mít na pamět. Některé z nch hlouběj probereme v této kaptole a zároveň navrhneme jejch možné řešení. Jedná se už o čstě techncké věc týkající se samotného naprogramování. 4.1 Datové struktury a třídy V této podkaptole uvedeme výčet nejdůležtějších datových struktur, které byly použty př mplementac algortmu. U většny struktur jsou uvedeme nejdůležtější proměnné a metody. struct Bod {double x,y;} Jednoduchá struktura, k uložení x-ových a y-ových souřadnc bodů. struct Body { nt pocet; Bod* data; double* uhly; bool* zrust; } Datová struktura, která má reprezentovat jednotlvé vrstvy. Je v ní třeba uchovávat pole souřadnc všech bodů (proměnná data). Dále jejch aktuální počet, jelkož v průběhu algortmu dochází stuacím, kdy mohou být jednotlvé body vypouštěny z vrstvy. K rušení bodů z vrstvy slouží proměnná zrust. Jedná se o pole příznaků, zda s body v dalším průběhu algortmu ještě počítat nebo ne. Body nelze prostě jen vymazat, jelkož mohou být součástí některého z trojúhelníků, který jž byl vytvořen jedné z mnulých terací vrstvení. Díky tomuto je nutné, 18
aby třída Body byla schopná řešt posun na sousední body ve vrstvě. Jným slovy pokud mám zadaný ndex některého z bodu ve vrstvě, tak vrstva musí rozpoznat předchozí a následující bod a to pouze z těch, které jsou ještě platné (příznak zrust je false). Je to potřeba hlavně kvůl počítání úhlů ve vrstvě a zároveň pro určení vzájemných vzdáleností mez jednotlvým body. Poslední je proměnná uhly, která uchovává nformace o úhlech v dané vrstvě. Hodnota uhly[] je úhel v -tém bodě ve vrstvě, který svírají spojnce -tého bodu s předchozím a s následujícím bodem ve vrstvě. struct Trojuhelnk {nt vrcholy[3][2]}; Struktura, ve které jsou uloženy nformace o trojúhelníku tak, že první ndex ve vrcholy [][j] určuje vrchol trojúhelníku. Druhý ndex určuje jednak číslo vrstvy, ve které se daný bod nachází (j = 0) a také ndex bodu ve vrstvě (j = 1). class Krvka { double krok; double delka; Body body; vrtual delka_krvky(); vrtual dskretzuj(); } Základní třída pro nám uvažované typy křvek, které mohou ohrančovat zadanou oblast. Proměnná krok je defnovaná pro všechny křvky stejně. Je načtena ze vstupního souboru a určuje délku úseček, na které se okrajové křvky mají dskretzovat; delka určuje celkovou délku křvky a pole body je pole dskretzovaných bodu křvky. Každá odvozená třída s musí sama defnovat, jakým způsobem spočítat její délku (procedura delka_krvky), a také proces, kterým se bude dskretzovat na jednotlvé úsečky (procedura dskretzuj). Přdat do programu další typ křvky znamená vytvoření nové odvozené třídy ke třídě Krvka. class Bezer : publc Krvka {} class Usecka : publc Krvka {} 4.2 Procedury nact_krvky() Tato procedura je zde uvedena jen kvůl formátu vstupních dat. Geometrcké tvary jsou 19
načítány ze souboru data.txt. Na prvním řádku bude uvedena délka úsečky, na kterou se zadané geometrcké tvary mají dskretzovat. Toto číslo zároveň udává přblžnou vzdálenost dvou vrstev. Na dalším řádku je uveden počet křvek, které požadovanou postupně popsují hranc oblast v pravotočvém směru. Na dalších řádcích jsou pak vypsány samotné křvky a to následujícím způsobem: Jako první je uvedený počet řídících bodů, které křvku určují. Pro úsečku je tato hodnota rovna dvěma a pro Bézerovu křvku je jakákolv větší a udává počet bodů řídícího polygonu. Dále na řádku následují x-ové a y-ové souřadnce těchto bodů (nejprve x-ová souřadnce prvního bodu, pak jeho y-ová souřadnce a pak souřadnce dalších bodů). Jsou odděleny mezeram. Na Obrázku 4.1 je uveden krátký příklad možného vstupního souboru, kde délka dskretzované úsečky je 10 a oblast je ohrančena dvěma Bézerovým křvkam a dvěma úsečkam. Oblast je svým tvarem podobná ležaté osmčce. Obrázek 4.1: Příklad vstupního souboru dskretzuj() Pro úsečku není třeba uvádět příklad její dskretzace, stačí s zvolt t, dosadt do rovnce úsečky a spočítat dskretzované body. Pokud máme Bézerovu křvku, tak je celá procedura komplkovanější. Algortmus je popsán na Obrázku 4.2. Budeme chtít Bézerovu křvku dskretzovat na co nejmenší úseky. Buď tedy D dskretzací defnčního oboru Bézerovy křvky P : I R 2. Pro jednotlvé body dskretzace bude platt následující: D = t 0, t 1,,t n : t = t, =0,1,,n Zvolíme s tedy hodně malé t. V našem případě, kdy délka křvky odpovídala řadově stovkám, jsme nastavl hodnotu t=0,0001. Po tomto rozdělení křvku spočítáme délky jednotlvých úseků, čímž dostáváme přblžný odhad celkové délky křvky. Nyní je tedy potřeba křvku dskretzovat na posloupnost úseček, kde délka každé z nch přblžně odpovídá délce d načtené ze vstupního souboru. Prvním bodem v naší dskretzační sít bude počátek křvky. Od něj pak dále postupně sčítáme délky malých úseků a pokud hodnota tohoto součtu překročí zadanou délku d, vložíme koncový bod úseku do naší sítě. A znova začneme sčítat délky křvek. To vše uděláme pro všechny úseky a na konc do sítě vložíme koncový bod křvky. 20
Obrázek 4.2: Algortmus dskretzace Bézerovy křvky Musíme ovšem dát pozor, aby poslední úsečka nebyla moc krátká (menší než polovna vstupní délky). Pokud toto nastane, nevkládáme předposlední bod, ale pouze koncový. Bude to lustrováno na Obrázku 4.3. Obrázek 4.3: Dskretzace Bézerovy křvky (vlevo bod přílš blízko konc, vpravo oprava) vrstven() Toto je hlavní procedura, která provádí algortmus vrstvení podrobně popsaný v 2. kaptole. zaps_do_souboru() Na výstup je prováděný do souboru troj.txt, a to v tomto formátu. Zapsujeme souřadnce všech trojúhelníků, které jsme během vrstvení vytvořl. Na jednom řádku bude vždy nejprve x-ová souřadnce prvního vrchol následovaná jeho y-ovou souřadnc. Dále pak budou souřadnce druhého a třetího vrcholu. Další trojúhelníky začneme zapsovat až na další řádek. 21
5 Příklady Zde uvedené příklady jsou pro oblast, kde nedochází k dělení na podvrstvy. Samotné dělení je ještě třeba v programu doladt. Obrázek 5.1: Dskretzace oblast zadané úsečkam Obrázek 5.2: Dskretzace oblast zadané Bézerovým křvkam 22
6 Závěr V této prác jsme se věnoval problematce trangulace 2-dmenzonální (2D) oblast, která byla zadaná svým okrajovým křvkam. Vysvětll jsme prncp jednoho ze základních algortmů, které se na trangulac používají, algortmu vrstvení. Popsal jsme jednu z možných mplementací daného algortmu a předestřel řešení některých problémů, které př ní mohou vyvstat. V prác můžeme dále pokračovat a to buď vrstvením ve 3-dmenzonálním prostoru nebo se zabývat přímo metodou level-setů. 23
7 Zdroje: [1] J. Bouchala - Matematcká analýza 1, VŠB-TU Ostrava, 1998. [2] J. Bouchala - Matematcká analýza 3 dferencální a ntegrální počet vektorových funkcí, VŠB-TU Ostrava, 2001. [3] Z. Dostál - Lneární algebra, VŠB-TU Ostrava, 2004. [4] F. Ježek - Geometrcké a počítačové modelování, Západočeská unverzta v Plzn, 2000. [5] J. Schoeberl - NETGEN: An advancng front 2D/3D-mesh generator based on abstract rules, Computng and Vsualzaton n Scence 1, str. 41-52, 1997. [6] J.A. Sethan Level Set Methods and Fast Marchng Methods, Cambrdge Unverzty Press, 1996. 24