Fortunov algoritam

Fortunov algoritam je algoritam pokretne linije ѕa generisanje Voronojevih dijagrama iz skupa tačaka u ravni čija je vremenska složenost O(n log n) i prostorna O(n).[1][2] Objavio ga je Stiven Fortun 1986. u svom radu "Algoritam pokretne linije za Voronojeve dijagrame."[3]

Fortune's algorithm animation

Opis algoritma

uredi

Algoritam održava pokretnu liniju i obalsku liniju, koje se obe kreću kroz ravan kako algoritam napreduje. Pokretna linija je prava linija, i možemo po dogovoru pretpostaviti da je vertikalna i da se kreće sleva nadesno. U bilo kom trenutku tokom trajanja algoritma tačke levo od pokretne linije će biti ugrađene u Voronojev dijagram, dok tačke desno od pokretne linije nisu još uvek razmatrane. Obalska linija nije linija, već kompleksna kriva sa leve strane pokretne koja se sastoji od delova parabola; ona razdvaja deo ravni u kojem Voronojev dijagram može biti poznat, bez obzira na tačke desno od pokretne linije, od ostatka ravni. Za svaku tačku levo od pokretne linije, može se definisati parabola tačaka koje su na podjednakom rastojanju od te tačke i od pokretne linije; obalska linija je granica unije ovih parabola. Dok pokretna linija napreduje, temena obalske linije, u kojoj se dve parabole seku, prati ivice Voronojevog dijagrama. Obalska linija napreduje čuvajući svaku parabolu tačno na pola puta između tačaka preko kojih se prethodno prešlo pokretnom linijom i novog položaja pokretne linije.

Algoritam održava kao strukturu podataka binarno stablo pretrage koje opisuje strukturu obalske linije i prioritetni red koji sadrži potencijalne buduće događaje koji mogu da promene strukturu obalske linije. Ovi događaji uključuju dodavanje nove parabole u obalsku liniju (kada pokretna linija naiđe na novu ulaznu tačku) i uklanjanje krive iz obalske linije (kada pokretna linija postane tangenta na krugu kroz neke tri ulazne tačke čije parabole formiraju uzastopne segmente obalske linije). Prioritet svakog takvog događaja se može odrediti na osnovu x-koordinate pokretne linije u tački u kojoj se događaj desio. Sam algoritam se onda sastoji od uklanjanja sledećeg događaja iz prioritetnog reda, pronalaženja promena koje događaj prouzrokuje u obalskoj liniji i ažuriranja struktura podataka.

Pošto ima O(n) događaja koje treba obraditi (svaki je povezan sa nekom karakteristikom Voronojevog dijagrama) i O(log n) vremena za obradu događaja (svaki se sastoji od konstantnog broja operacija na binarnom stablu pretrage i prioritetnom redu) ukupno vreme je O(n log n).

Pseudokod

uredi

Pseudokod opis algoritma.[4]

let   be the transformation  ,
  where   is the Euclidean distance between   and the nearest site
let   be the "beach line"
let   be the region covered by site  .
let   be the boundary ray between sites   and  .
let   be the sites with minimal  -coordinate, ordered by  -coordinate
 
create initial vertical boundary rays  
 
while not IsEmpty( ) do
      ← DeleteMin( )
    case   of
      is a site in  :
        find the occurrence of a region   in   containing  ,
          bracketed by   on the left and   on the right
        create new boundary rays   and   with bases  
        replace   with   in  
        delete from   any intersection between   and  
        insert into   any intersection between   and  
        insert into   any intersection between   and  
      is a Voronoi vertex in  :
        let   be the intersection of   on the left and   on the right
        let   be the left neighbor of   and
          let   be the right neighbor of   in  
        create a new boundary ray   if  ,
          or create   if   is right of the higher of   and  ,
          otherwise create  
        replace   with newly created   in  
        delete from   any intersection between   and  
        delete from   any intersection between   and  
        insert into   any intersection between   and  
        insert into   any intersection between   and  
        record   as the summit of   and   and the base of  
        output the boundary segments   and  
    endcase
endwhile
output the remaining boundary rays in  

Težinske lokacije i diskovi

uredi

Kao što Fortun opisuje u[1] modifikovana verzija algoritma pokretne linije može biti iskorišćena za konstrukciju aditivnog težinskog Voronojevog dijagrama, u kome udaljenost do svake lokacije (generatora) je pomerena za težinu lokacije; ovo može biti ekvivalentno posmatrano kao Voronojev dijagram skupa diskova čiji je centar u lokacijama sa radijusom jednakim težini lokacije.

Reference

uredi
  1. ^ a b Mark de Berg; Marc van Kreveld, Mark Overmars, and Otfried Schwarzkopf (2000), Computational Geometry (2nd revised izd.), Springer-Verlag, ISBN 978-3-540-65620-3  Section 7.2: Computing the Voronoi Diagram: pp. 151—160.
  2. ^ Austin, David, Voronoi Diagrams and a Day at the Beach, Feature Column, American Mathematical Society 
  3. ^ Steven Fortune. A sweepline algorithm for Voronoi diagrams. Proceedings of the second annual symposium on Computational geometry. Yorktown Heights, New York, United States. . 1986. str. 313—322. ISBN 978-0-89791-194-8.  Nedostaje ili je prazan parametar |title= (pomoć) ACM Digital LibrarySpringerLink[mrtva veza]
  4. ^ Wong, Kenny; Hausi A. Müller, An Efficient Implementation of Fortune's Plane-Sweep Algorithm for Voronoi Diagrams, CiteSeerX 10.1.1.83.5571  

Spoljašnje veze

uredi