Sokszögek csúcspontjainak sorbarendezése a helyes megjelenítéshez

Ha a tkinter modult használva a grafikus felhasználói felületen sokszögeket akarunk kirajzoltatni a vászon (Canvas) create_polygon() metódusával, akkor nem mindegy, hogy a sokszög csúcspontjait, azok koordinátáit milyen sorrendben adjuk át annak. Ugyanis a csúcspontok összekötése a pontok felsorolási sorrendjében történik. Ha nem a megfelelő sorrendben adjuk meg a csúcspontokat, akkor a kirajzoláskor a sokszögben keresztező vonalak is keletkeznek, ami nem a kívánt alakzatot eredményezi. Az alábbi ábra a) és b) képe a nem megfelelő, a c)  a helyes csúcspont sorrendekre és az eredményül kapott alakzatokra mutat példát.

Mivel a csúcspontok mint adatok számos forrásból szárazhatnak (felhasználótól bekérés, fájl, hálózat), ezért a megfelelő sorrendjük nem garantált. Ezért érdemes egy olyan függvényt készíteni, amely a csúcspontokat olyan sorrendbe rakja, hogy a sokszög create_polygon() metódussal történő megjelenítése az elvárt legyen.

E függvény elve, hogy a csúcspontok rendezését azok középponthoz viszonyított szöge szerint tesszük meg. Ehhez először meghatározzuk a csúcspontok középpontját (súlypontját), ami, ahogy a geometriából ismert, a csúcspontok mint helyvektorok számtani közepe. Majd pedig kiszámítjuk az egyes csúcspontok középponttól vett szögét. Végül elvégezzük a szögek szerinti rendezést. E sort_vertices_for_proper_plotting nevű függvény definícióját mutatjuk alább. A kommentek segítik a megértést.

E függvényben használtunk egy – szintén a fenti programkódban látható – _flatten_xycoords nevű segédfüggvényt, aminek szerepe, hogy a csúcspontok x és y koordinátáit egymás után szolgáltassa függetlenül attól, hogy azok így lettek megadva, vagy iterálható objektumból származnak. E segédfüggvény egyébként egy korábbi, „Hogyan nyerjük ki az elemeket egy konténerbe többszörösen beágyazott iterálható objektumokból?” című bejegyzésben szereplő függvénynek e feladatra történt adaptációja.

A rendező függvényünk megfelelő működéséről a következő tesztfüggvénnyel meggyőződhetünk:

E bejegyzés témájához a Python tudásépítés lépésről lépésre című e-könyvben elsősorban a  „Grafikus felhasználói felület készítése” fejezet kapcsolódik. E mellett érdemes még a „Különleges függvénydefiníciók” fejezetben az „Amikor a kígyó a farkába harap – függvényrekurzió” alfejezetet is átfutni.

É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.