Hogyan számítsuk ki egy nem szabályos sokszög területét?

Sokszögek területszámítása témában legtöbbször szabályos sokszögek területének meghatározásával találkozhatunk. A nem szabályos sokszögek területének kiszámítására pedig többnyire annyi az utalás, hogy háromszögekre kell bontani, majd az egyes háromszögek területét kiszámolni például a Heron képlettel és ezeket összeadni. (A Heron képlet számítási pontosságkorlátairól lásd a „Tűszerű háromszögek területének számítása” című bejegyzést)

E módszer lerajzolt sokszögeknél jól használható, mert vizuálisan átlátjuk a rajzot és így azt könnyen fel tudjuk a megfelelő háromszögekre bontani akár konvex, akár konkáv sokszögről van szó. De mi van akkor, ha nem áll rendelkezésre rajz, és a sokszög csúcspontjainak koordinátáival van meghatározva?

Ekkor a háromszögek meghatározása nem egy magától értetődő könnyű feladat, különösen konkáv sokszög esetében. Ezért e helyett inkább egy speciális módon történő trapézokra bontás, és azok előjeles területének meghatározása majd összegzése az alkalmazott módszer.

Ennek lényege, hogy a csúcspontokat az oldalak mentén sorban egymás után bejárjuk, és ennek során mindig vesszük az aktuális pontot és a rákövetkező pontot. Ezeket felhasználva képezünk egy olyan trapézt, amelynek alapjai a pontok y koordinátái, magassága az x koordináták különbsége. Ezek ismeretében kiszámítjuk a trapéz területét, ami, mint azt az elemi geometriából tudjuk, az alapok számtani közepe szorozva a magassággal. Fontos, hogy a magasságot mindig úgy határozzuk meg, hogy a rákövetkező pont x koordinátájából vonjuk ki az aktuális pont x koordinátáját. Ez azért lényeges, mert a pontok bejárása során lesznek olyan esetek, amikor a rákövetkező pont x koordinátája kisebb az aktuális pont x koordinátájánál, vagyis a kialakuló trapéz területe negatív lesz. A sokszög területét a pozitív és negatív területek összege adja. A módszert a következő ábra szemlélteti.

A képsorozaton egy konkáv hétszög területének fokozatos „lefedését” látjuk ahogy a csúcspontokon végighaladunk az oldalak mentén. A kék és fehér színű trapézok területének összege adja ki a hétszög területét minthogy a csúcspontok óramutató járásával egyező bejárási sorrendjét betartva a kék színű trapézok növelik a lefedett területet, a fehérek csökkentik. Fordított bejárási sorrend esetén a negatív értékű trapézok területe lenne több, és az összegzés végeredménye negatív érték lenne. Ezért az összegzés után az eredmény abszolút értékét kell venni.

A számítási elv ismeretében a sokszögterületet számoló függvény elég egyszerű lesz. Sorban egymás után kell venni a szomszédos csúcspárokat és azok koordinátáiból képezni az egyes trapézok területét, amelyeket egy listaépítő kifejezéssel gyűjtünk. Ha a lista előállt, akkor az elemeket a sum() függvénnyel összegezzük, és az eredmény abszolút értékével térünk vissza. A csúcspontok sorozatából a szomszédos párokat az itertools modul pairwise() iterátorával nyerjük ki. Mivel az utolsó csúcspont és az első csúcspont által meghatározott trapézt, illetve annak területét is elő kell állítani, ezért a pairwise() argumentumaként nem elegendő csak a csúcspontsorozatot megadni, hanem a sorozat utolsó elemeként az első csúcspontot is fel kell venni. Ezt az összefűzést az itertools modul chain() iterátorával tesszük meg. Az ennek megfelelő függvény definíciója az alábbi:

Teszteljük le a függvényt! Ehhez különböző sokszögeket határozunk meg csúcspontjaikkal. Utána ezeket ki is rajzoljuk, és mindegyik alatt feltüntetjük a területszámoló függvénnyel meghatározott területet. A tesztkód az alábbi:

Az eredményként látható képernyőkép a következő:

E bejegyzésben az itertools modul eszköztárát tudtuk hatékonyan alkalmazni. Az e modulban található egyéb iterátorokról alkalmazási példákkal együtt a Python tudásépítés lépésről lépésre című e-könyv „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezetén belül a „Speciális iterátorok” alfejezetben lehet olvasni.

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