Sokszög forgatása és tükrözése vizuálisan grafikus alkalmazással – 1. rész

Az előző két bejegyzésben (itt és itt) egy pont adott forgáspont körül, megadott szöggel való forgatását és tengelyes tükrözését megvalósító függvények előállításával foglalkoztunk.

Ha tudunk egy pontot forgatni vagy tükrözni, akkor lehetőség nyílik egy sokszöget is forgatni, vagy tengelyesen, illetve középpontosan tükrözni, hiszen ilyenkor nem kell mást tenni, mint a sokszög csúcspontjaira elvégezni az említett geometriai transzformációkat, mert a forgatott vagy tükrözött csúcspontok meghatározzák a transzformált sokszöget.

Ennek szemléltetésére készítünk most egy egyszerű GUI alkalmazást a szabványos könyvtár tkinter moduljának használatával. A grafikus felület induló képernyőképét mutatja ez a kép:

Itt a főablak két részre tagolódik. Felül helyezkednek el a forgatást és tükrözést indító nyomógombok, valamint egy beviteli mező, amelyben meg lehet adni a forgatási szöget fokban. Ezek alatt látható az a felület, amelyen a sokszög, a forgáspont és tükrözési tengelyvonal rajzolását végezhetjük. Ezt a vászon grafikus elemmel (canvas widget) valósítjuk meg.

Az alkalmazást egy App nevű osztály képviseli, amely maga a főablak is, ezért a tkinter Tk osztály utódja lesz. Az alábbi kód mutatja az App __init__ metódusát.

Az __init__ elején az előbb említett grafikus elemeket hozzuk létre. Ezt követően az egyes geometriai elemeket, azaz a sokszöget, a forgáspontot és a tükrözési tengelyt meghatározó pontok számára inicializálunk attribútumokat. Ezután a grafikus elemeket lehelyezzük az erre szolgáló placing_widget() metódus hívással. A geometriai elemek meghatározásához és megjelenítéséhez eseményeket definiálunk és eseménykezelőket rendelünk az event_bindings() metódusban, amit az __init__ utolsó sorában meghívunk.

A placing_widget() és az event_bindings() metódusok definíciója látható alább. Ezek elég egyszerű felépítésűek és a kommentek is segítik a megértésüket.

A használathoz összefoglaljuk az eseményeket:

  • a Ctrl+bal egérgomb lenyomásával lehet a sokszög pontjait kijelölni a felületen.
  • a bal egérgomb dupla kattintásával lehet jelezni, hogy több pontot már nem akarunk felvenni, és jelenítse meg a sokszöget.
  • A forgáspontot az Alt+bal egérgombbal határozhatjuk meg.
  • A tükrözési tengelyszakasz kezdőpontját a Shift+bal egér kattintással adhatjuk meg. Egy ezt követő szintén Shift+bal egér kattintással adjuk meg a szakasz végpontját, és ekkor a vonal meg is jelenik.

A fenti kódban szereplő további metódusok végzik a matematikai számításokat a forgatott, illetve a tükrözött pontok meghatározásához. Az adott pontot forgató és tengelyesen tükröző metódusok az előző két bejegyzésben tárgyalt bármelyik algoritmusát használhatják. Ezért nem adtuk itt meg a metódustörzseket, mert mindenki a számára valamilyen szempontból preferáltat adhatja meg.

Bővítsük az App osztályt egy pontot kirajzoló, valamint a csúcspontok ismeretében egy új sokszöget kirajzoló két metódussal, amelyek neve draw_point() és draw_new_polygon(). Ezek megértése a tkinter Canvas metódusainak ismeretében nem okozhat gondot.

Ez a sokszögrajzó nem csak a kezdeti sokszög, hanem a transzformálás utáni új sokszög kirajzolására is használatos lesz, ezért látható a draw_new_polygon() metódus elején, hogy töröljük a meglévő sokszöget, valamint a végén, hogy az új sokszög csúcspontjai lesznek az aktuális sokszög csúcspontok.

A fenti osztálydefiníció további metódusai egyrészt eseménykezelők az egyes geometriai elemek (pontok, sokszög, tengelyvonal) megjelenítésére, másrészt a forgatott, tengelyesen vagy középpontosan tükrözött sokszög megjelenítésére szolgálnak. Ezeknek egyelőre csak a fejléce van feltüntetve, mert ezekkel fogjuk folytatni a következő bejegyzésben. De az eddig közölt kódok is már lefutnak és fent bemutatott kiinduló ablak megjelenését eredményezik.

A GUI alkalmazásokkal a Python tudásépítés lépésről lépésre című e-könyv „Grafikus felhasználói felület készítése” fejezete foglalkozik meglehetősen részletesen, számos példával segítve az ismeretek elsajátítását.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.