Fortunen algoritmi on pyyhkäisyviivaalgoritmi Voronoi - kaavion muodostamiseksi pistejoukosta tasossa O- ajassa käyttämällä O( n ) -muistia [1] [2] . Stephen Fortune julkaisi algoritmin alun perin vuonna 1986 artikkelissaan "The Sweeping Line Algorithm for Voronoi Diagrams" [3] .
Algoritmi ylläpitää pyyhkäisevää suoraa ja rantaviivaa , jotka liikkuvat tasoa pitkin algoritmin suoritettaessa. Pyyhkäisevä viiva on viiva, jota voimme perinteisesti pitää pystysuorana ja liikkuvana vasemmalta oikealle. Milloin tahansa algoritmin toimintahetkellä joukosta pyyhkäisyviivan vasemmalla puolella olevat pisteet sisällytetään Voronoi-kaavioon, kun taas pyyhkäisyviivan oikealla puolella olevia pisteitä ei ole vielä työstetty. Rantaviiva ei ole suora, vaan monimutkainen viiva, joka koostuu paraabelipaloista , paloittain kaarevasta viivasta vasemmalla. Se erottaa osan tasosta, jonka sisällä Voronoi-kaavio voidaan tuntea, riippumatta muista pisteistä, jotka ovat pyyhkäisyviivan oikealla puolella. Jokaiselle pyyhkäisyviivan vasemmalla puolella olevalle pisteelle voit määrittää paraabelin pisteelle, joka on yhtä kaukana sekä tästä pisteestä että pyyhkäisyviivasta. Rantaviiva on näiden paraabelien yhdistysten raja. Kun rantaviivan suora yläosa liikkuu, jossa kaksi paraabelia leikkaavat, piirretään Voronoi-kaavion reunat. Rantaviiva etenee pitäen jokaisen paraabelin kannan tarkalleen pyyhkäisyviivan aloituskohdan ja pyyhkäisyviivan uuden sijainnin puolivälissä. Matemaattisesti tämä tarkoittaa, että jokainen paraabeli muodostetaan käyttämällä pyyhkäisyviivaa suuntaviivana ja tietty piste joukosta toimii fokuksena.
Algoritmi ylläpitää binaaripuutietorakennetta , joka kuvaa rantaviivan kombinatorista rakennetta, ja prioriteettijonoa , jossa luetellaan mahdolliset tulevaisuuden tapahtumat, jotka voivat muuttaa rantaviivan rakennetta. Näihin tapahtumiin kuuluu toisen paraabelin lisääminen rantaviivaan (kun pyyhkäisyviiva kulkee toisen syöttöpisteen kautta) ja käyrän poistaminen rannikolta (kun pyyhkäisyviiva tulee tangentiksi ympyrään noin kolmen syöttöpisteen kautta, joiden paraabelit muodostavat peräkkäisiä rantaviivaosia). Jokainen tällainen tapahtuma voidaan priorisoida pyyhkäisyviivan x - koordinaatilla pisteessä, jossa tapahtuma tapahtui. Algoritmi koostuu tapahtuman peräkkäisestä poistamisesta prioriteettijonosta, rannikon tapahtumien muutosten etsimisestä ja tietorakenteen päivityksestä.
Koska käsiteltävänä on O( n ) tapahtumaa (jokainen liittyy johonkin Voronoi-kaavion ominaisuuteen) ja O(log n ) aikaa tapahtuman käsittelyyn (joka koostuu vakiomäärästä binääripuuhakuja ja prioriteettijonotoimintoja), kokonaisaika on .
Kuten Fortune [5] huomauttaa , pyyhkäisyviivaalgoritmin muunneltua versiota voidaan käyttää muodostamaan additiivisesti painotettu Voronoi-kaavio, jossa etäisyys kuhunkin pisteeseen neutraloidaan pisteen painolla. Tätä voidaan katsoa vastaavasti Voronoi-kaaviona joukosta kiekkoja, jotka on keskitetty pisteisiin ja joiden säde on yhtä suuri kuin pisteen paino.
Painotettujen pisteiden avulla voidaan ohjata Voronoi-solujen alueita, kun Voronoin tontteja käytetään puukarttojen rakentamiseen [ . Additiivisesti painotetussa Voronoi-kaaviossa pisteiden välinen puolittaja on yleensä hyperbola, toisin kuin painottamattomissa Voronoi-kaavioissa ja levyenergiakaavioissa , joille