6. Základy výpočetní geometrie BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Výpočetní geometrie Algoritmy pracující s objekty v prostoru Obvykle Eukleidovský prostor 2D 3D 4D a více??? Topologie 2
Využití výpočetní geometrie Počítačová grafika Modelování Vizualizace Robotika Geografické systémy (dnes ale ještě nic z toho) 3
Geometrie x Algoritmy Výpočetní geometrie samozřejmě staví na geometrii jako takové Pravidla a poučky platí a opravdu se používají Algoritmizace ale může být problém Proč? 4
Komplikace pro algoritmy Je vidět na první pohled tu nefunguje Reálná čísla (!) Speciální a degenerované případy Definiční obory operací dělení goniometrie Asymptotická složitost i kvadratické řešení může být pomalé (!!) 5
Základy výpočetní geometrie I jednoduché poučky nabízejí mnoho možností pro řešení problémů Pythagorova věta Goniometrické funkce Vektorový součin Dvojnásob zde platí: přemýšlet!!! Snaha najít nejjednodušší řešení 6
Pythagorova věta a 2 + b 2 = c 2 b c a 7
Vzdálenost bodů y [x 2, y 2 ] (y 2 -y 1 ) D (x 2 -x 1 ) [x 1, y 1 ] D 2 =(x 2 -x 1 ) 2 + (y 2 -y 1 ) 2 x D = sqrt((x 2 -x 1 ) 2 + (y 2 -y 1 ) 2 ) 8
Vzdálenost bodů 3D [x 2, y 2, z 2 ] y E [x 1, y 1, z 1 ] D (z 2 -z 1 ) E 2 = D 2 + (z 2 -z 1 ) 2 x E 2 = (x 2 -x 1 ) 2 + (y 2 -y 1 ) 2 + (z 2 -z 1 ) 2 E = sqrt((x 2 -x 1 ) 2 + (y 2 -y 1 ) 2 + (z 2 -z 1 ) 2 ) 9
Goniometrické funkce sin(α) = a/c cos(α) = b/c tan(α) = a/b α = Math.asin(a/c) α = Math.atan(a/b) radiány!! b α a c 10
Goniometrické funkce [x 1, y 1 ] y α x tan(α) = y 1 / x 1 α = Math.atan( y 1 / x 1 )? 11
Goniometrická funkce atan2 double alpha = Math.atan2(x, y) Ekvivalentní alpha = Math.atan( y/x ) Nevadí dělení nulou Umí rozlišit kvadranty Převod kartézských souřadnic na polární Jak převádět tam a zpět? 12
Polární souřadnice double x, y; x = r * cos(theta); y = r * sin(theta); double r, theta; r = Math.sqrt(x*x + y*y); theta = Math.atan2(x, y); 13
Úsečky a přímky Reprezentace dvěma body [x 1, y 1 ] [x 2, y 2 ] Reprezentace rovnicí y = d.x + e a.x + b.y + c = 0 14
Reprezentace přímky Dva body: [x 1, y 1 ] a [x 2, y 2 ] [x 2, y 2 ] y [x 1, y 1 ] x 15
Reprezentace přímky Rovnice: y = d.x + e Směrnice + počátek Nelze svislé přímky! y d e x 16
Reprezentace přímky Rovnice: a.x + b.y + c = 0 Normála přímky Potřeba 3 parametrů y x 17
Průsečík dvou přímek [x 3, y 3 ] y [x 2, y 2 ] [x 1, y 1 ] [x 4, y 4 ] x 18
Průsečík přímek rovnice První přímka x = x 1 + t. (x 2 - x 1 ) y = y 1 + t. (y 2 - y 1 ) Druhá přímka x = x 3 + t. (x 4 - x 3 ) y = y 3 + t. (y 4 - y 3 ) Průsečík x 1 + t 1. (x 2 - x 1 ) = x 3 + t 2. (x 4 - x 3 ) y 1 + t 1. (y 2 - y 1 ) = y 3 + t 2. (y 4 - y 3 ) 19
Průsečík přímek rovnice Průsečík x 1 + t 1. (x 2 - x 1 ) = x 3 + t 2. (x 4 - x 3 ) y 1 + t 1. (y 2 - y 1 ) = y 3 + t 2. (y 4 - y 3 ) => Soustava dvou rovnic Lze řešit pomocí determinantů 20
Průsečík přímek řešení x 1 + t 1. (x 2 - x 1 ) = x 3 + t 2. (x 4 - x 3 ) y 1 + t 1. (y 2 - y 1 ) = y 3 + t 2. (y 4 - y 3 ) Determinanty rovnic: D 0 = (y 4 - y 3 ).(x 2 - x 1 ) (x 4 - x 3 ).(y 2 - y 1 ) D 1 = (x 4 - x 3 ).(y 1 - y 3 ) (y 4 - y 3 ).(x 1 - x 3 ) D 2 = (x 2 - x 1 ).(y 1 - y 3 ) (y 2 - y 1 ).(x 1 - x 3 ) t 1 = D 1 / D 0 t 2 = D 2 / D 0 21
Průsečík nulový jmenovatel Determinant D 0 = 0 Přímky mají stejnou směrnici (rovnoběžné) D 1 0 D 2 Rovnoběžky D 1 = D 2 = 0 Stejná přímka 22
Vektorový součin 23
Vektorový součin Pouze ve 3D Velikost Plocha rovnoběžníka Směr Kolmý na oba původní Znaménko dle pořadí 24
Vektorový součin [x 1, y 1, z 1 ] [x 2, y 2, z 2 ] = [x S, y S, z S ] x S = y 1.z 2 y 2.z 1 y S = x 1.z 2 x 2.z 1 z S = x 1.y 2 x 2.y 1 25
Vektorový součin ve 2D z 1 = z 2 = 0 x S = y 1.z 2 y 2.z 1 = 0 y S = x 1.z 2 x 2.z 1 = 0 z S = x 1.y 2 x 2.y 1 = z => ve 2D vyjde jen jedna souřadnice! A občas vůbec nepotřebujeme reálná čísla! 26
Zjištění poloroviny Na které straně je bod od přímky? y [x 2, y 2 ] [x 3, y 3 ] [x 1, y 1 ] x 27
Zjištění poloroviny Součin [x 3 -x 1, y 3 -y 1 ] [x 2 -x 1, y 2 -y 1 ] =0 na přímce >0 vpravo <0 vlevo y [x 2, y 2 ] [x 3, y 3 ] [x 1, y 1 ] x 28
Obecné techniky V.G. Pro složitější příklady (nebude potřeba u dnešních úloh) Rozděl a panuj Zametací přímka 29
Úloha: Superman Superman se vyhýbá planetám Jak dlouho letí? [x 2, y 2 ] y [x 1, y 1 ] 30 x