Algoritmy pro ořezávání 2D polygonů
Využití ořezávání v praxi odstranění částí obrazu nacházejících se mimo zobrazitelnou oblast výstupního zařízení
Využití ořezávání v praxi Vyplňování 3D objektů Vytvoření vysoce kvalitního povrchu zobrazovaných objektů pomocí zkoumání odrazů, odlesků a lomů paprsků světla Přidělování objektů scény multiprocesorovým systémům
Polygon Uspořádaný seznam bodů /vrcholů/, kde první a poslední bod je identický
Algoritmus Cohen-Sutherland Algoritmus slouží k ořezávání čar vůči obdélníku. Hlavní výhodou algoritmu je jednoduché a rychlé zakódování jednotlivých případů pozice úsečky vůči obdélníku. Po zakódování pozic můžeme snadno vynechat úsečky, které leží zcela mimo nebo uvnitř obdélníku.
Algoritmus Cohen-Sutherland Hodnota 1 v kódu znamená hodnotu true a kód je tvořen podle následujících pravidel (bity počítáme zprava): bit 0 - bod je vlevo od obdélníka bit 1 - bod je vpravo od obdélníka bit 2 - bod je pod obdélníkem bit 3 - bod je nad obdélníkem Po zakódování mohou nastat následující případy: kód oblasti je roven nule pro oba koncové body úsečky - přímka leží uvnitř oblasti, kódy obou koncových bodů mají stejný bit nenulový - přímka leží mimo obdélník, u ostatních možností přímka prochází hranou obdélníka.
Průsečíky s ořezávacím oknem Výpočet průsečíku s příslušnou hranou obdélníka se spočítá následovně: je-li bod vlevo: (xmin, k*(xmin-x1)+y1) je-li bod vpravo: (xmax,k*(x1-xmax)+y1) je-li bod nad: (q*(y1-ymax)+x1,ymax) je-li bod pod: (q*(ymin-y1)+x1,ymin) kde k = (y2-y1)/(x2-x1) pro x1!= X2, q = (x2-x1)/(y2-y1) pro y1!= y2
Algoritmus Cohen-Sutherland
Algoritmus Cyrus-Beck Tento algoritmus slouží k ořezávání úseček vůči konvexnímu n-úhelníku. Algoritmus je založen na znalosti normál hran konvexního n-úhelníka, podle kterého úsečky ořezáváme. Přímka může protínat tento n-úhelník nejvýše ve dvou bodech, pokud pomineme speciální případ, kdy úsečka leží na některé hraně.
Cyrus-Beck algoritmus
Algoritmus Weiler-Atherton Algoritmus slouží k ořezávání obecného nekonvexních n- úhelníku jiným obecným nekonvexním n-úhelníkem Oba n-úhelníky mohou obsahovat i díry. Po oříznutí nám může vzniknout i několik samostatných n-úhelníků.
Weiler-Atherton
Algoritmus Greiner - Hormannův Günther Greiner Kai Hormann Friedrich Alexander University Erlangen, Německo
Vstup Uspořádané posloupnosti vrcholů ořezávaného a ořezávacího polygonu
Výstup Množina všech bodů ležících v S && C Polygon Seznam vzniklých polygonů
Sebeprotínající polygon Oblasti, patřící do výsledku určíme pomocí tzv. WINDING NUMBER Je li WN liché,, pak náleží výsledku
Winding Number double isleft(point P0, Point P1, Point P2) { return((p1.x - P0.x) * (P2.y - P0.y) - (P2.x - P0.x) * (P1.y - P0.y)); } int WindingNumber(Point P, Point * V, int n) { int WN = 0; // počítadlo otáček //smyčka přes všechny hrany polygonu } for (int i=0; i<n; i++){ // hrana z V[i] do V[i+1] if (V[i].y <= P.y){ if(v[i+1].y>p.y) if(isleft(v[i],v[i+1],p)>0 ++wn; // máme otáčku proti směru } else{ // V[i].y> P.y if(v[i+1].y <= P.y) if(isleft(v[i],v[i+1],p)<0) --wn; // máme otáčku po směru } } return wn;
Vlastnosti Winding Number Při pohybu bodu P nebo hrany E, zůstává z WN konstantní,, dokud P zůstane v kladné vzdálenosti od hrany E. Pro křivku ω je WN konstantní v podprostoru R x R ω.. Leží-li bod P v neohraničené komponentě, pak má WN = 0 Při překřížení paprsku a hrany se WN změní o +/-1.
První fáze algoritmu Určení všech průsečíků hran C a S polygonu Složitost minimálně m*n /m = # vrcholů ů S, n = # vrcholů ů C/ C Všechny tyto průsečíky budou vrcholy ve výsledku Ukládáme si ukazatele na stejný průsečík v seznamu druhého polygonu Jejich následné zařazení do seznamu vrcholů obou polygonů K tomu je zapotřebí spočítat tzv. α parametr,, z kterého lze určit vzdálenost průsečíku od počátečního vrcholu hrany a zařadit tak správně všechny průsečíky na jedné hraně Platí 0 < α < 1 P.x = V[i].x + α * V[i+1].x P.y = V[i].y + α * V[i+1].y
Zvláštní případy Leží-li nám bod, či hrana na hraně druhého polygonu, je nutné jej posunout o nejmenší možný úsek, výsledek zůstane stejný
Druhá fáze algoritmu V fázi dvě procházíme všechny průsečíky a přiřazujeme jim I/O atribut Ten určuje, zda v daném průsečíku vstupujeme dovnitř polygonu nebo jej opouštíme. Stejný průsečík může mít rozdílné atributy v rámci polygonů Vezmeme libovolný vrchol polygonu, zjistíme pomocí WN, zda je uvnitř či vně a jdeme po seznamu vrcholů, vždy, když narazíme na průsečík, změníme atribut a uložíme jej k danému průsečíku Toto provedeme pro oba polygony
Třetí fáze algoritmu
Zdroje Greiner, G. and Hormann, K. 1998. Efficient clipping of arbitrary polygons. ACM Trans. Graph. 17, 2 (Apr. 1998), 71-83. DOI= http://doi.acm.org/10.1145/274363.274364 Vatti, B. R. 1992. A generic solution to polygon clipping. Commun. ACM 35, 7 (Jul. 1992), 56-63. DOI= http://doi.acm.org/10.1145/129902.129906 http://notorola.sh.cvut.cz/~bruxy/algoritmy_pocitacove_grafiky.doc http://herakles.zcu.cz/education/zpg/cviceni.php?no=9