A számítási geometriában ismert az a probléma, hogy egy pont egy sokszöghez tartozik-e . Egy sokszög és egy pont adott egy síkban . Meg kell oldani azt a kérdést, hogy egy pont egy sokszöghez tartozik-e.
A sokszög lehet konvex vagy nem konvex. Általában azt feltételezik, hogy a sokszög egyszerű, azaz nincs önmetszéspontja; de a problémát nem egyszerű sokszögeknél is figyelembe veszik. Az utóbbi esetben a sokszöghez tartozó pont meghatározásának különböző módjai eltérő eredményekhez vezethetnek. Vannak előfeldolgozás nélküli algoritmusok; valamint az előfeldolgozással rendelkező algoritmusok, amelyek során létrejönnek bizonyos adatstruktúrák, amelyek lehetővé teszik, hogy gyorsabban tudjanak válaszolni számos olyan lekérdezésre, hogy különböző pontok ugyanahhoz a sokszöghez tartoznak-e.
Az egyik szabványos módszer annak meghatározására, hogy egy pont tetszőleges egyszerű sokszöghez tartozik-e, a következő. Lőjünk ki egy sugarat egy adott pontból tetszőleges irányban (például a vízszintes tengely pozitív irányába), és számoljuk meg, hogy a sugár hányszor keresztezi a sokszög éleit. Ehhez elegendő áthurkolni a sokszög éleit, és meghatározni, hogy a sugár metszi-e az egyes éleket. Ha a metszéspontok száma páratlan, akkor azt deklaráljuk, hogy a pont a sokszögön belül, ha páros, akkor kívül van. Ez azon az egyszerű megfigyelésen alapul, hogy a sugár mentén haladva minden határátlépéskor a pont felváltva a sokszögön belül és kívül találja magát. Az algoritmus olyan neveken ismert, mint például keresztezési szám (számlálás) algoritmus vagy páros-páratlan szabály .
Az algoritmusnak nehézségei vannak abban a degenerált esetben, amikor a sugár metszi a sokszög csúcsát. Ennek egyik módja az, hogy feltételezzük, hogy az ilyen sokszög csúcsok végtelenül kicsivel a sugár egyenese felett (vagy alatta) helyezkednek el, és ezért valójában nincs metszéspont. [1] Így a sugárnak egy éllel való metszéspontját akkor számoljuk, ha az él egyik vége szigorúan a sugár alatt van, a másik vége pedig a sugár felett, vagy azon fekszik.
Az algoritmus O( N ) idő alatt fut N - gon esetén.
Tekintsük, hogy a sokszög orientált határa hány fordulatot tesz meg egy adott P pont körül . Az algebrai topológiában ezt a számot a pont görbéhez viszonyított indexének nevezik . [2] A következőképpen számítható ki. Mint korábban, lőjünk ki egy sugarat P -ből tetszőleges irányba, és vegyük figyelembe az általa metszett éleket. Minden metszésponthoz +1 vagy -1 számot rendelünk, attól függően, hogy az él hogyan metszi a sugarat - az óramutató járásával megegyezően (balról jobbra) vagy azzal ellentétes irányba (jobbról balra). Ezt a két esetet az élirányvektor és a sugárirányvektor normálja közötti pontszorzat előjelével lehet megkülönböztetni. [3] A kapott értékek összege a pont görbéhez viszonyított indexe . Az összeg pozitív vagy negatív lehet, a határ irányától függően. Ha nem egyenlő nullával, akkor feltételezzük, hogy a pont a sokszög belsejében, különben kívül van.
Egy ilyen algoritmus a nullától eltérő tekercselési szabály néven ismert . [3]
Egyszerű sokszögeknél ez a módszer ugyanúgy működik, mint a metszéspontok számának számlálásán alapuló módszer. A köztük lévő különbség akkor válik nyilvánvalóvá, ha önmetsző határvonalú sokszögeket veszünk figyelembe.
Az összeg kiszámításával megállapítható, hogy a P pont egy V 0 , V 1 , ..., V n = V 0 csúcsú sokszögön belül van :
ahol a PV i − 1 és PV i sugarak közötti szög (radiánban és előjelben) , azaz:
Bebizonyítható, hogy ez az összeg nem más, mint a P pont tekercsszáma a sokszög határához képest, egy állandó tényezőig . Feltételezhetjük tehát, hogy a pont a sokszögön kívül van, ha az összeg egyenlő nullával (vagy elég közel ahhoz, ha közelítő aritmetikát használunk). Ez a módszer azonban nagyon nem praktikus, mivel minden élre költséges műveletek (inverz trigonometrikus függvények, négyzetgyökök) kiszámítása szükséges, sőt a „világ legrosszabb algoritmusának” is nevezték erre a problémára [1] .
K. Weiler ennek a módszernek egy gyakorlati változatát javasolta, elkerülve a költséges műveleteket és a közelítő számításokat. [4] Megmutatták, hogy a szögek összege csak a sokszögpont negyedekbe sorolásával számítható ki a P ponthoz képest . A Weiler-algoritmus és néhány fejlesztése az [5]-ben található .
Az, hogy egy pont konvex vagy csillag N - gonhoz tartozik-e, bináris kereséssel O(log N ) időben, O( N ) memóriában és O( N ) előfeldolgozási időben határozható meg. [6]
Azt a problémát, hogy egy pont tetszőleges egyszerű sokszöghez tartozik-e , egy síkbeli felosztásban pont lokalizálási probléma speciális esetének tekinthető. Egy N -gon esetén ez a probléma O(log 2 N ) időben O( N ) memória és O( N log N ) előfeldolgozási idő használatával megoldható. [7]
Sokszögek | |||||
---|---|---|---|---|---|
Az oldalak száma szerint |
| ||||
Helyes |
| ||||
háromszögek | |||||
Négyszögek | |||||
Lásd még |