Public feed
#891193
Storer
Yleistä
Storer on apuluokka, jonka tehtävänä on tallettaa Positioned-rajapinnan täyttäviä olioita, eli olioita, joilla on 2-ulotteinen keskipiste, ja osata kertoa tehokkaasti, mikä piste on lähimpänä annettua pistettä kutsuttaessa metodia closestTo(Positioned). Esimerkiksi jos meillä on pisteet (1, 3), (6, 6) ja (2, 9) talletettuna Storeriin, voimme tehdä kutsun myStorer.closestTo( 2.0, 2.0 ). Tällöin Storer palauttaa objektin, joka sijaitsi kohdassa (1, 3).
Käyttötarkoitus
Algoritmit, joita ohjelmassa käytetään, pystytään toteuttamaan helposti tällaista rajapintaa käyttäen, ja samalla ohjelmasta tulee nopeampi, sillä Storerin hakuaika on logaritminen.
Käytetty tietorakenne
Storer perustuu binääripuurakenteeseen, jossa tietty solmu kuvaa tiettyä graafista aluetta. Jokainen askel alaspäin puussa jakaa alueen kahtia vuorotellen pysty- ja vaakasuorassa.
Algoritmit
Pisteen lisääminen
Etsitään se solmu, jonka alueen sisällä lisättävä piste on. Jos tämä solmu on tyhjä, lisätään piste siihen. Muussa tapauksessa tarkistetaan onko solmun sisältämän pisteen etäisyys lisättävästä pisteestä tietyn epsilonin sisällä, ja jos on, tallennetaan se samaan solmuun sen tiedon kanssa, että solmussa on useampia pisteitä. Jos pisteet ovat eri paikoissa, jatketaan seuraavasti: Jos hakuaskelten määrä oli parillinen, jaetaan solmun alue kahtia pystysuorassa, muuten vaakasuorassa. Jos solmun aiemmin sisältämä piste tämän jälkeen on samassa puoliskossa kuin lisättävä piste, jaetaan solmu uudestaan tällä kertaa eri suunnassa, ja näin edespäin rekursiivisesti, kunnes pisteet ovat eri solmuissa.
Hakualgoritmi
Lähimmän pisteen haku tapahtuu seuraavasti: Etsitään se solmu, jonka alueelle lisättävä piste kuuluu. Tämä jälkeen otetaan solmun viereiset solmut (viereiset solmut tallennetaan adjacents-listaan kullekin solmulle, ja niitä voi olla mielivaltainen määrä), ja tutkitaan yksi kerrallaan mikä näiden kaikkien solmujen pisteistä on lähinnä etsittävää pistettä.
Halkaisualgoritmi
Solmun halkaiseminen ei ole triviaalia, koska pisteen on tallennettava kaikki pisteet, jotka ovat sen ympäristössä. Näin ollen solmua halkaistaessa on ensin tutkittava mitkä aiemmista viereisistä solmuista ovat yhä sen vieressä, ja tallennettava nämä solmut adjacents-listaan. Tämän jälkeen on viereisille solmuille kerrottava, että niiden viereinen solmu on muuttunut, tai lisättävä molemmat halkaistun solmun puoliskot niiden adjacent-listoihin riippuen niiden tarkasta sijainnista. On triviaalia selvittää mitkä solmujen alueet ovat vierekkäin, joskin suhteellisen työlästä, joten sitä ei liene tarpeen selittää.