Vágási algoritmusok
Alapprobléma Van egy alakzatunk (szakaszokból felépítve) és van egy "ablakunk" (lehet a monitor, vagy egy téglalap alakú tartomány, vagy ennél szabálytalanabb poligon által határolt terület). Alapprobléma: A feladatunk az, hogy az alakzatnak csak azt a részét rajzoljuk meg, amely az "ablakban van", azaz látszik. A legegyszerűbb alakzat egy szakaszból áll, melyről a következő döntések valamelyikét meg kell hoznunk: A szakasz teljes egészében az ablakon belül van meg kell rajzolni. A szakasz teljes egészében az ablakon kívül van semmilyen részét sem kell megrajzolni. A szakasz részben az ablakon belül van meg kell határoznunk az ablakba eső részt, és azt kell megrajzolni.
Néhány algoritmus Cohen-Sutherland vágóalgoritmus (szakasz vágása téglalap tartományra) szakasz vágása konvex poligonra szakasz vágása konkáv poligonra
Cohen-Sutherland vágóalgoritmus A síkot két vízszintes (alsó, felső) és két függőleges (jobb, bal) egyenessel 9 részre osztjuk, a középső terület maga az ablak (képernyő). Minden síkrész (pontosabban a pontjaik) jól leírható az egyenesekhez viszonyított helyzettel. A viszonyítási szempontok: A felső egyenes felett van-e Az alsó egyenes alatt van-e A jobb oldali egyenestől jobbra van-e A bal oldali egyenestől balra van-e A válaszok igen, vagy nem lehetnek, az válasz igen már akkor is, ha éppen az egyeneseken vagyunk. Az ablakba eső pontok kódja a 0000, azaz a felső egyenestől nem feljebb, az alsótól nem lejjebb, jobb oldali egyenestől nem jobbra, a baloldalitól nem balra találhatók.
Cohen-Sutherland vágóalgoritmus Az algoritmus: A szakasz végpontjaihoz az előbbi szempontok szerint egy-egy négyjegyű bináris kód rendelünk hozzá. 2. Ha mindkét végpont kódja 0000, akkor a szakasz a képernyőn belül van. rajzolható és megrajzoljuk. 3. Ha a két kódnak van olyan bitje, hogy azonos helyi értéken 1 van, akkor az a szakasz eldobható, mert a képen kívülre esik. nem kell rajzolni 4. Ha a szakasz két végpontja közül valamelyik kódjában van egyes, akkor az egyes helyi értékének megfelelő egyenessel el kell metszeni a szakaszt, és a metszéspontra módosítani a szakasz végpontját, és ugrás az pontra.
Cohen-Sutherland vágóalgoritmus C F A D C 1 F 1 K B F 2 E 1 V E
Cohen-Sutherland vágóalgoritmus Előnyei: Hatékony, ha nagy valószínűséggel kívül esnek a szakaszok a képernyőn. Jól általánosítható 3D-ben. Ebben az esetben 6 határsík van, melyek a teret 27 részre bontják. Azt vizsgáljuk, hogy a síkok jó oldalán vannak-e a szakasz végpontjai, ezért 6 bites kódokat használunk. Hátránya Poligon ablakra nem általánosítható.
Szakasz vágása konvex poligonra Maga az ablak egy konvex poligon által határolt terület. Ötlet Megadunk egy B belső pontot (pl. súlypontot), amely a viszonyítási pont lesz. Minden szakaszvégpont esetén azt vizsgáljuk, hogy a határegyeneseknek ugyanazon oldalán van-e, mint a B pont. 6. 5. Ez a vizsgálat úgy történik, hogy a B pont koordinátáit behelyettesítjük a határegyenesek egyenletébe, és a kapott értékek előjelét sorban megjegyezzük. K K 1 2. V B 3. 4. Ugyanezt tesszük a szakasz kezdő (vég)pontja esetén is, majd összehasonlítjuk a B pontra kapott előjelsorral. A legelső eltérésnél az annak megfelelő egyenessel a szakasz elmetsszük, és ez lesz az új kezdő (vég)pont, melyet újra meg kell vizsgálni. Mindezt addig folytatjuk, amíg a kezdő (vég)pont előjelsora a B-vel megegyezik. A legutolsó kezdő és végpontot összekötjük.
Szakasz vágása konvex poligonra Hátránya Nem vizsgáltuk, hogy a szakasznak van-e az ablakba eső része. Lehet, hogy feleslegesen vizsgáljuk a végpontok B- hez viszonyított helyzetét. Ha a poligon nagyon sok oldalú, és a szakasz olyan helyzetű, hogy az utolsó oldalakat metszi, akkor nagyon sokáig nem történik semmi, csak a vizsgálatok zajlanak. 6. 5. Kérdés: Nem lehetne ezt gyorsítani? K 1 B V 4. 2. 3.
Szakasz vágása konvex poligonra 2. A szakaszt tartalmazó egyeneshez viszonyítjuk a poligon éleit. A vizsgált egyenes egyenletébe behelyettesítjük a poligon csúcsainak koordinátáit, és tároljuk az eredmény előjelét. K K 1 2. 6. V 5. 3. 4. Ha mindenhol azonos az előjel, akkor az egyenes a poligonon kívül esik. nem kell rajzolni 2. Ha a kapott előjelsorozatban váltás van, akkor a két csúcs által meghatározott szakaszt metszi a vágandó szakasz egyenese. Csak két helyen lehet előjelváltás, mivel konvex a poligon. Kiszámoljuk a szakasz egyenesének és a poligonnak a metszéspontjait, majd valamely (nem nulla) koordináta szerint rendezzük a négy pontot. Mindig a középső két pont által adott szakaszt kell rajzolnunk.
Vágás konkáv poligonra Az ablak egy konkáv poligon által határolt terület. A szakaszt tartalmazó egyeneshez viszonyítjuk a poligon éleit. A vizsgált egyenes egyenletébe behelyettesítjük a poligon csúcsainak koordinátáit, és tároljuk az eredmény előjelét. Ha mindenhol azonos az előjel, akkor az egyenes a poligonon kívül esik. nem kell rajzolni 2. Ha a kapott előjelsorozatban váltás van, akkor a két csúcs által meghatározott szakaszt metszi a vágandó szakasz egyenese. Kiszámoljuk ezeket a metszéspontokat (már 2-nél több metszéspont is lehet!!), és valamelyik koordináta szerint rendezzük. Majd beszúrjuk a szakasz két végpontját a rendezett sorba, és megnézzük, hogy hol van a két végpont a metszéspontokhoz képest. A szakasz egyik végpontjától számítva a páratlan és páros metszéspontok közötti szakaszokat kell rajzolni, a két végpont között.
Vágás konkáv poligonra 2. 6. 3. 4. 5. 3. 4. 5. 6. 7. 8. 9. 7. 8. 9. 10. 10. 2.
Vágás konkáv poligonra 2. 3. 4. 5. 6. 6. 7. 3. 8. 4. 9. 5. 7. 8. 9. 10. Beszúrjuk a szakasz két végpontját a rendezett Adott sorba, Veszünk egy és egy konkáv megnézzük, egyenest, poligon, hogy amelyet hol van vágni a két akarunk az amely A végpont adott pontokat poligonra. két a részből metszéspontokhoz a poligon áll. bejárásának Először a képest. megfelelően (Most külső kaptuk, előttük Az egyeneshez részt ezért utánuk.) járjuk valamelyik viszonyítjuk be, majd koordináta a a poligon szerint éleit. A belsőt, célszerű vizsgált A szakasz a rendeznünk egyenes megjelölt egyik végpontjától egyenletébe pontokból azokat. behelyettesítjük indulva a páratlan a indulva és poligon páros a csúcsainak sorszámú nyilak irányába. metszéspontok koordinátáit, és közötti tároljuk az Az szakaszokat eredmény ablak az előjelét. kell együttes rajzolni, konkáv amíg el nem érjük a poligonnal másik Ha a kapott végpontot. van előjelsorozatban definiálva, az váltás van, akkor a látszik két csúcs majd, által ami meghatározott a szakaszt metszi a halványsárga vágandó szakasz területbe egyenese. esik. Kiszámoljuk ezeket a metszéspontokat. 10. 2.