řednáška 6 lgoitmy ořezávání Ořezávací oblast Učení viditelné oblasti uživatelského souřadnicového systému USS Vykeslení pouze té části obazu, kteá leží ve viditelné oblasti Obvykle je viditelnou (ořezávací) oblastí osově oientovaný pavoúhelník (většinou okno souřadnicového systému zařízení SSZ). Cílem může být: zychlení gafického výstupu (v případě, že velké množství objektů leží mimo viditelnou oblast a zjištění této skutečnosti je ychlejší než samotné keslení) vykeslení obazu pouze do učité části gafického výstupního zařízení náhada ořezávání na úovni gafického výstupního zařízení 1 řednáška 6 2 Test polohy bodu vzhledem k pavoúhelníku Vpřípadě ořezávání osově oientovaným pavoúhelníkem stačí vyhodnotit souřadnice vykeslovaného bodu [x,y] vzhledem k hanicím pavoúhelníku. (x>xmin) (x<xmax) (y>ymin) (y<ymax) Y MX Y MIN y X MIN x X MX Test polohy bodu vzhledem ke konvexnímu mnohoúhelníku Nutno učit polohu bodu vůči všem haničním úsečkám olohu bodu a úsečky B lze učit pomocí velikosti vektoového součinu u (B) a v ( ) S=(b x -a x )(p y -a y )-(b y -a y )(p x -a x ) i j k i j S<0 bod leží napavo od úsečky B S=0 bod leží na úsečce B S>0 bod leží nalevo od úsečky B u v = u okud je mnohoúhelník definován posloupností vcholových uzlů poti směu hodinových učiček, potom vyšetřovaný bod leží uvnitř, pokud leží vlevo od všech úseček. po směu hodinových učiček, potom vyšetřovaný bod leží uvnitř, pokud leží vpavo od všech úseček. v X X uy vy uz = bx ax vz px ax by ay py ay k 0 0 řednáška 6 3 řednáška 6 4
Test polohy bodu vzhledem k nekonvexnímu mnohoúhelníku o nekonvexní mnohoúhelník je třeba vyhodnotit počet půsečíků polopřímky vedené z vyšetřovaného bodu libovolným směem s hanami mnohoúhelníku. Sudý počet půsečíků bod leží vně Lichý počet půsečíků bod leží uvnitř oblémy nastanou: okud papsek pochází vcholem U úseků ovnoběžných s papskem Řešení: oužití vodoovného papsku + vynechání vodoovných han + ozpojení han Ořezání úsečky (Cohen-Sutheland) Založeno na ozdělení celé plochy USS na jednotlivé oblasti Oblastem je přiřazen 4-bitový kód podle polohy vzhledem k poloze ořezávací oblasti (vlevo, vpavo, dole, nahoře) 1001 0001 0101 1000 0000 0100 1010 0010 0110 řednáška 6 5 řednáška 6 6 o každý počáteční (Z) a koncový (K) bod úsečky se učí kód. okud kód(z) kód(k) = 0.. úsečka je celá uvnitř okud kód(z) kód(k) 0.. úsečka je celá mimo okud kód(z) kód(k) = 0.. úsečka pochází více oblastmi, je třeba ji oříznout (ořezávání se povádí dle libovolné jedničky v kódech po Z a K a testy s novými kódy se zopakují). oznámka: 1001 0001 0101 Ořezání úsečky (Liang-Basky) Založeno na paametickém vyjádření úsečky Minimalizuje počet zbytečně učených nových haničních bodů Ořezávání pavoúhelníkem, jehož hany jsou ovnoběžné sosami SS ůnik,, ND, & 1000 0000 0100 Zobecnění po obecný konvexní mnohoúhelník metoda Cyus-Beck, viz st. 14 Sjednocení,,OR, 1010 0010 0110 řednáška 6 7 řednáška 6 8
incip Liang-Basky metody (1) Úsečka je definována body se souřadnicemi (x 1, y 1 ) a (x 2, y 2 ). aametické vyjádření úsečky: x =x 1 + u x y =y 1 + u y, kde: paamet u nabývá hodnot 0, 1 x = (x 2 -x 1 ) y = (y 2 -y 1 ) o každý bod úsečky, ležící uvnitř ořezávané oblasti platí: x MIN x 1 + u x x 1 + u x x MX y MIN y 1 + u y y 1 + u y y MX incip Liang-Basky metody (2) řepis uvedených neovností do tvau: up k q k, po k = 1,2,3,4 Definice hodnot p k a q k : k = 1: p 1 = - x q 1 =x 1 -x MIN k = 2: p 2 = x q 2 =x MX -x 1 k = 3: p 3 = - y q 3 =y 1 -y MIN k = 4: p 4 = y q 4 =y MX -y 1 okud někteé p k =0, potom úsečka je ovnoběžná s příslušnou hanou ořezávací oblasti. okud někteé p k <0, potom úsečka (přímka) směřuje dovnitř oblasti (vzhledem na příslušnou hanici ořezávací oblasti). okud někteé p k >0, potom úsečka (přímka) směřuje ven z oblasti (vzhledem na příslušnou hanici ořezávací oblasti). řednáška 6 9 řednáška 6 10 incip Liang-Basky metody (3) incip Liang-Basky metody (4) Význam paametů p k a q k po jednu hanu ořezávací oblasti p 4 =0; q 4 <0 p 4 <0 p 4 >0 u 1 u 2 V případě p k =0 q k <0 leží ovnoběžná úsečka "před" hanicí a je možno ji vynechat. o každou podmínku, kde p k 0, ke možno spočítat paamet k = q k / p k, kteý učuje bod půsečíku úsečky (přímky) s danou hanicí ořezávací oblasti. o všechny podmínky, kde p k <0 (úsečka směřuje dovnitř) učíme paamet k = q k / p k a výsledný paamet u 1 (počátečního bodu ořezané úsečky) vybeeme maximum z vypočítaných hodnot k a hodnoty 0 (nula). o všechny podmínky, kde p k >0 (úsečka směřuje ven) učíme paamet k = q k / p k a výsledný paamet u 2 (koncového bodu ořezané úsečky) vybeeme minimum z vypočítaných hodnot k a hodnoty 1 (jedna). Ořezaná ús. je dána pa. u 1 a u 2, kde u 1 < u 2, u 1 a u 2 0,1. řednáška 6 11 řednáška 6 12
říklad Liang-Basky metody Ořezání úsečky (Cyus-Beck) [y] Založeno na paametickém vyjádření úsečky Ořezání obecným konvexním n-úhelníkem 400 [500, 350] očet ořezů závisí na pořadí han n 4 300 200 (1) (4) (3) (2) p1 = -350, q1 = -50; = 0.143 p2 = 350, q2 = 250; = 0.714 p3 = -300, q3 = -100; = 0.333 p4 = 300, q4 = 250; = 0.833 u 2 =min (1; 0,714; 8.333) n 5 V 1 1 V 5 V 4 B 3 V 3 n 3 B 100 [150, 50] 0 100 200 300 400 500 600 [x] u 1 =max (0; 0.143; 0.333) ůvodní úsečka B Ořezaná úsečka 1 B 3 Ořezávací oblast V 1 V 2 V 3 V 4 V 5 5 n 1 V 2 n 2 řednáška 6 13 řednáška 6 14 Cyus-Beck předpoklady Cyus-Beck postup V 1 n 1.V 1 (t C )<0 ředpoklady a základní pavidla: Ořezávací oblast je zadána pomocí oientovaných han, oientace je poti směu hod. uč. Ořezávaná úsečka je oientována B aametické vyjádření (t)= + t (B-) x (t) = x + t(b x - x ) y (t) = y + t(b y - y ) Kolmé vektoy: u. v = 0 Nomálový vekto (otočení v o 90 vpavo): n v, n = ( vy, vx) Tupý úhel: u. v < 0 Ostý úhel: u. v > 0 n v C půsečík hany V 1 V 2 a B t c paamet půsečíku C = ( tc) = + tc( B ) vekto V 1 C musí být kolmý na nom. vekt. n 1 V 1C) = 0 ( tc) V 1) = 0 + tc( B ) V 1) = 0 V 1) n1x( x V 1x) + n1 y( y V 1y) tc = = B ) n1x( Bx x) + n1y( By y) Rozlišujeme případy, kdy B - směřuje dovnitř: -směřuje ven: n 1.V 1 (t C )>0 1 - je ovnoběžná s hanou: B ) = řednáška 6 15 řednáška 6 16 n 1 C V 2 B ) < 0 n.( B ) > 0 0
Cyus-Beck stučný algoitmus inicializace paametů začátku a konce úsečky: t Z =0, t K =1 po každou hanu n-úhelníku: učení nomálového vektou n pokud skalání součin n.(b - )<>0 výpočet t C dle směu dovnitř/ven případná změna t Z = max(t Z, t C ) nebo t K = min(t K, t C ) jinak úsečka je ovnoběžná s touto hanou pokud leží v poloovině mimo n-úhelník: lze ořezávanou úsečku zcela vypustit KONEC jinak nemá tato hana na ořezání vliv OKRČ. DLŠÍ HRNOU pokud t Z < t K, potom se keslí ořezaná úsečka (t Z ) (t K ), jinak po ořezu z úsečky nic nezbylo Ořezávání n-úhelníku Ořezávání jednotlivých úseček (tvořících hanici polygonu) pomocí předcházejících algoitmů lze použít pouze po vykeslení obysu ořezaného polygonu. ři požadavku na zachování n-úhelníku (např. z důvodu vyplňování) je nutno použít po ořezávání jiný algoitmus, například poudové ořezávání metodou Sutheland-Hodgman. Ořezání pavoúhlou oblastí algoitmus Sutheland-Hodgman Ořezání libovolným (i nekonvexním n-úhelníkem, včetně dě ) algoitmus Weile-theton řednáška 6 17 řednáška 6 18 Různé vaianty, vznikající při ořezávání n-úhelníhů. Sutheland-Hodgman oudové ořezávání Ořez se povádí 4x, vždy po jednu hanici okna. Je nutno v případě potřeby vytvářet nové haniční úsečky tak, aby oblast zůstala spojitá a uzavřená. ři implementaci lze používat 4x stejný kód (modul) a ořezávání jednotlivými hanami okna ealizovat pomocí otáčení o 90. Modul pobíá postupně všechny aktuální vcholy polygonu. řednáška 6 19 řednáška 6 20
Schéma poudového ořezávání pomocí jednotného modulu Modul povede ořezání podle jedné hanice okna. ktualizuje seznam vcholů polygonu. Otáčení se povádí záměnou x-ových a y-ových souřadnic současně se změnou znaménka. x Ořez - Ořez - Ořez - Ořez - x y y X max Y max -X min -Y min řednáška 6 21 řednáška 6 22 ktualizace vcholů Stučný algoitmus modulu Modul povádí vkládání nových vcholů, popřípadě ušení vcholů na základě polohy pávě vyšetřovaného a předcházejícího vcholu vůči hanici. 4 případy polohy, (aktuální) a (předcházející) a/ Vchol se uší a nepostupuje do dalšího zpacování N b/ Vkládá se nový vchol N, vchol postupuje nezměněn c/ Vchol postupuje nezměněn N d/ Vchol je nahazen novým vcholem N vstup: souřadnice vcholů polygonu (pole, seznam), hanice inicializace: Vynulovat pole aktualizovanevcholy, pocetktvcholu = 0 = vcholy[pocet-1] //poslední vchol polygonu postupně po všechny vcholy V i = 1..pocetVcholu poveď pokud hana V i je celá vně, potom nic (pokačuj dalším vcholem) pokud hana V i směřuje z venku dovnitř, potom vypočítej půsečík N s hanicí, do pole přidej N a V i ; pocetktvcholu += 2; pokud hana V i je celá uvnitř, potom přidej do pole V i ; pocetktvcholu++; pokud hana V i směřuje zevnitř ven, potom vypočítej půsečík N s hanicí; do pole přidej N; pocetktvcholu++; = V i řednáška 6 23 řednáška 6 24
odpoa v Javě bstaktní třída oint2d Třída oint: souřadnice x, y (int) Třída oint2d.double: souřadnice x, y (double) Třída oint2d.float: souřadnice x, y (float) double distance (oint2d pt) double distance (double px, double py) static double distance(double x1, double y1, double x2, double y2) oint2d p2 = new oint2d.double(20.0, 40.0); double vzdal = p2.distance(10.0, 10.0); odpoa v Javě bstaktní třída Rectangle2D Třída Rectangle: x, y, w, h (int) Třída Rectangle2D.Double: x, y, w, h(double) Třída Rectangle2D.Float: x, y, w, h (float) boolean contains (oint2d p) boolean contains (Rectangle 2D ) Rectangle2D ceateintesection (Rectangle2D ) Rectangle2D ceateunion(rectangle2d ) static void intesect (Rectangle2D sc1, Rectangle2D sc2, Rectangle2D dest) boolean intesects (Rectangle ) boolean intesectsline (Line2D l) boolean isempty () řednáška 6 25 řednáška 6 26 odpoa v Javě Třída olygon (int[] xpoints, int[] ypoints, int npoints) boolean contains (oint p) boolean contains (oint2d p) boolean contains (Rectangle 2D ) boolean intesects (Rectangle ) Složitější úlohy se řeší pomocí ozhaní Shape ozhaní athiteato třídy ea třídy Genealath třídy ath2d řednáška 6 27