Y-monoton sokszög háromszögesítése

 

A program egér segítségével megadott y monoton sökszög háromszögesítését végzi el grafikus üzemmódban. A program futásához szükséges az egavga.bgi állomány, melyben a Borland Pascal VGA grafikus üzemmódjának futtatásához szükséges driverek vannak.

A program fordításához szükséges az egavga.bgi, graph.tpu és eger.tpu. A graph.tpu unitban találhatók a Borland Pascal grafikus eljárásai és függvényei, az eger.tpu unitban pedig az egér használatához szükséges eljárások és függvények.

 

A háromszögesítéshez alkalmazott algoritmus röviden:

 

1.     Meghatározzuk a sokszög jobb illetve bal oldali láncának pontjait, majd rendezzük növekvő sorrendbe az z koordináta szerint

2.     Betesszük egy S verembe az első két csúcsot

3.     Minden csúcspontra a harmadiktól az utolsó elöttiig ellenőrizzük, hogy azonos lancon van-e a verem tetején levő elemmel

4.     Ha különböző láncon vannak, akkor rendre kiveszünk minden csúcsot a veremből, összekötjük az aktuálisan vizsgált ponttal, kivéve a verem legalsó csúcsát (ez már össze van kötve az aktuálisan vizsgált csúccsal) és visszatesszük a verembe az aktuálisan vizsgált csúcsot és az elötte levőt.

5.     Ha azonos láncon van a két csúcs, akkor kivesszük az S-ből a legfelső elemet, majd annyi csúcsot veszünk ki rendre az S veremből, ahányat össze lehet kötni az aktuálisan vizsgált csúccsal és összekötjük. Ay utoljára kivett csúcsot visszatesszük averembe és rátesszük az aktuálisan vizsgált elemet.

6.     Miután az utolsó elötti csúcsot is megvizsgáltuk, minden verembeli csúcsot kivéve a legalsót és a legfelsőt összekötünk az utolsó csúccsal.

 

A program bővebb leírása:

 

Globális változók: gd,gm:integer – a grafikus üzemmód bekapcsolásához, x,z:integer – az egérmutató poziciójának (koordináták) lekérdezésére, n,m:integer – a csúcspontok száma illetve a verem elemeinek száma (a verem magassága), i,lanc:byte – segédváltozók a ciklusokoz, illetve a láncok meghatározására,  pont,stack: array[1..100,1..3]of integer – a csúcspontok koordinátáinak illetve láncszámának tárolására (x,y,lánc), stack a verem.

Főprogram: A főprogram a grafikus üzemmód elindításával kezdődik, megjelenítjük az egér mutatót, kezdetben a csúcsok száma 0 és a láncok száma 1. A csúcsok beolvasását egy repeat-until ciklus végzi, melynek akkor lesz vége, ha kattintunk egyet az egér jobb gombjával. Az egér bal gombjának lenyomásakor az egérmutató aktuális pozicióján első kattintáskor egy pont jelenik meg, majd a továbbiakban mindig az utolsó csúcspont kötődik össze az aktuális egérpozición levő ponttal. Az aktuális egérpozició bekerül a pont tőmbbe, minden kattintásra egyel nő a csúcspontok száma (n). Mivel y-monoton sokszőg csúcsait olvassuk be, csak egyszer történhet visszafordulás (lefele haladunk, majd felfele a pontok megadásával, illetve fordítva), ezért a láncok száma minden visszafordulásnál egyel nő, ha kettőnél több lánc van, akkor a sokszög nem y-monoton. Ebben az esetben hibaüzenet jelenik meg a képernyőn és a program bezárúl. A száz ezredmasodpercnyi időzítésre azért van szükség, hogy ne kerüljön be a tömbbe két azonos koordinátájú csúcs. A beolvasás végén összekötjük az utolsó csúcspontot az elsővel. Majd meghívjuk a haromszögesít eljárást, mely a fennti algoritmus alapján van megírva. A haromszögesítés után addig vár a program, amíg az egér jobb gombját le nem nyomják. Ezután lezárjuk a grafikus üzemmódot. A főprogram a Borland Pascal két előre megírt eljárását használja, melyek a Graph.tpu-ban találhatók: putpixel – pont rajzolására és line – vonal rajzolására.

Haromszogesit: az eljárás a fennti algoritmus szerint van megírva. Először rendezzük a pontokat tartalmazó tömböt (rendez eljárás) buborékos rendezéssel, novekvő sorrendben, mert a grafikus üzemmódban az y koordináták fenntről lefele nőnek. Betesszük a verembe a két első pontot (push eljárás). While ciklussal bisztosítjuk minden csúcspont ellenőrzését a harmadiktól az utolsó elöttiig. A pont tömb minden osylopában három elem van: x,y,lanc, igy könnyebben lehet dolgozni az értékekkel. A top eljárás visszatéríti a verem tetején levő csúcspont adatait, a pop eljárással pedig ki veszünk egy elemet a veremből. A rajzolásban két előre megírt Borland Pascal eljárást használunk: line – vonalak rajzolására és setcolor a színek változtatására.