Diskuze: Body v SVG polygonu
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, pokud to chceš udělat v PHP, tak jsem našel stránku, kde se tento problém řeší. http://assemblysys.com/…n-algorithm/
V PHP nejspíš žádná standardní funkce není. Platí ale, že bod P je v polygonu jedině když polopřímka vycházející z P protne polygon v lichém počtu bodů (až na tečné body).
Pokud by tě to zajímalo, tak to plyne z Jordanovy věty o kružnici: "Každá topologická kružnice dělí rovinu na 2 obloukově souvislé množiny, jednu omezenou a jednu neomezenou." Každý bod může být jen v jedné obloukově souvislé množině (nebo na samotné kružnici). Při každém protnutí hrany polygonu se tak polopřímka dostane z vnější (neomezené) množiny do vnitřní (omezené) nebo naopak. Pokud je P v omezené množině, polopřímka musí protnout hrany polygonu v lichém počtu bodů (polopřímka se z omezené množiny musí vždy dostat do neomezené, protože není v jednom směru omezena, ale průnik omezené množiny s polopřímkou už omezený je). Tohle samozřejmě není důkaz, spíš jen takové vysvětlení, proč by to mohla být pravda.
Podobné řešení mě taky napadlo, ale nevěděl jsem jestli platí všude a jak přesně to v php definovat. Takže díky za vysvětlení, teď to už snad nějak dohromady dám.
Jenže polygon není topologická kružnice, a platí, že:
Měl jsem tam ještě dodat, že se jeho hrany nesmí protínat. Věděl by si, jak by se tedy dalo ukázat, že dané tvrzení platí, když teda přidáme ještě tenhle předpoklad (třeba jen zhruba)? Docela by mě to zajímalo (výpočetní geometrii apod. předměty, kde se tohle nejspíš probírá, jsem zatím viděl jen z dálky ve skriptech nebo jen úvod v diskrétní matematice). Příp. jak by se dal použít jiný test, pokud existuje nějaký vhodnější.
Jinak, pokud dobře chápu definici topologické kružnice (obraz prosté uzavřené křivky - tedy spojité funkce F z [0, 1] do roviny t.ž.F(0) = F(1) a F je prostá na intervalu [0, 1)), pak by ji měl jednoduchý polygon (polygon, který se neprotíná ani ve vrcholech) splňovat, ne?
Topologie je o třídu složitější než diskrétka, kde se berou jen takové jemné základy. Pamatuju si, že jsem na zápočet dokazoval neexistenci planárního grafu na válci a můj "neprůstřelný" důkaz měl problém s něčím, co jsem ani nepochopil, ani se to nevysvětluje. Prostě pokud to nebude tvoje specializace, tak se k tomu nedostaneš.
V praxi je obvyklé, že polygony degenerují už jen kvůli nepřesnostem v plovoucí čárce, takže tyhle školní algoritmy skoro nikdy nefungují a musí se upravovat pro krajní případy.
Ray-casting (rovnoběžný s osou) je v pohodě, jen se musí kontrolovat rovnoběžnost s hranami. Pokud je polygon konvexní, dá se kontrolovat výskyt bodu na stejné polorovině, to je buď trocha lineární algebry nebo komplexní čísla. Jsou ještě další způsoby, ale pro pidi-polygony je lepší něco jednoduchého.
Zobrazeno 8 zpráv z 8.