Fortunes algoritme er en sweeping-linjealgoritme til at generere et Voronoi-diagram fra et sæt punkter i et plan i O- tid ved hjælp af O( n ) -hukommelse [1] [2] . Algoritmen blev oprindeligt udgivet af Stephen Fortune i 1986 i hans papir "The Sweeping Line Algorithm for Voronoi Diagrams" [3] .
Algoritmen opretholder en fejende lige linje og kystlinje , der bevæger sig langs flyet, mens algoritmen kører. En fejende linje er en linje, som vi traditionelt kan tænke på som lodret og bevæger sig fra venstre mod højre. På et hvilket som helst tidspunkt af algoritmens drift vil punkterne fra sættet til venstre for sweepinglinjen blive inkluderet i Voronoi-diagrammet, mens punkterne til højre for sweepinglinjen endnu ikke er udarbejdet. Kystlinjen er ikke en lige linje, men er en kompleks, bestående af stykker af parabler , en stykkevis kurve til venstre for den fejende linje. Den adskiller en del af planet, inden for hvilken Voronoi-diagrammet kan kendes, uafhængigt af andre punkter til højre for den fejende linje. For hvert punkt til venstre for den fejende linje kan du definere en parabel for et punkt, der er lige langt fra både dette punkt og den fejende linje. Kystlinjen er grænsen for foreningerne af disse parabler. Når den lige top af kystlinjen bevæger sig, hvor to parabler krydser hinanden, tegnes kanterne af Voronoi-diagrammet. Kystlinjen rykker frem og holder bunden af hver parabel nøjagtigt halvvejs mellem sweep-linjens startposition og sweep-linjens nye position. Matematisk betyder det, at hver parabel er dannet ved hjælp af en fejende linje som et retningslinje , og et givet punkt fra sættet fungerer som fokus.
Algoritmen opretholder en binær trædatastruktur , der beskriver den kombinatoriske struktur af kystlinjen, og en prioritetskø , der viser potentielle fremtidige begivenheder, der kan ændre kystlinjens struktur. Disse hændelser omfatter tilføjelse af endnu en parabel til kystlinjen (når sweep-linjen passerer gennem et andet inputpunkt) og sletning af en kurve fra kystlinjen (når sweep-linjen bliver tangent til cirklen gennem nogle tre inputpunkter, hvis parabler danner successive kystlinjesegmenter). Hver sådan hændelse kan prioriteres efter x - koordinaten for fejelinjen på det punkt, hvor hændelsen fandt sted. Algoritmen består af sekventielt at slette en hændelse fra prioritetskøen, finde ændringer til hændelser i kystlinjen og opdatere datastrukturen.
Da der er O( n ) hændelser at behandle (hver tilknyttet en eller anden egenskab i Voronoi-diagrammet) og O(log n ) tid til at behandle en hændelse (som består af et konstant antal binære træsøgninger og prioriterede køoperationer), den samlede tid er .
Pseudokode for algoritmen [4] .
Lad det være en forvandling , hvor er den euklidiske afstand mellem z og det nærmeste punkt Lad T være "kystlinjen" Lad være området, der dækker punktet p . Lade være grænsestrålen mellem punkterne p og q . Lad være punkter med minimum y -koordinat, ordnet efter x - koordinat skaber indledende lodrette grænsestråler, indtil IsEmpty( Q ) udføres, hvis p er et punkt i : Find et område i T , der indeholder p , afgrænset af en kurve til venstre og en kurve til højre skabe nye grænsestråler og med base p erstat med i T fjern fra Q ethvert skæringspunkt mellem og indsæt ethvert skæringspunkt i Q og indsæt ethvert skæringspunkt i Q og p er et Voronoi-toppunkt i : lad p være skæringspunktet mellem venstre og højre lad være venstre nabo og lad være den rigtige nabo i T opret en ny grænsestråle , hvis , eller opret hvis p er højre side af den højeste af q og s , ellers skal du oprette udskiftning med den nyoprettede i T fjern ethvert skæringspunkt fra Q og fjern ethvert skæringspunkt fra Q og indsæt ethvert skæringspunkt i Q og indsæt ethvert skæringspunkt i Q og skriv p som toppen og bunden og udskriv grænsesegmenterne og slut i tilfælde end bye udled de resterende grænsestråler fra TSom Fortune [5] påpeger, kan en modificeret version af sweeping line-algoritmen bruges til at konstruere et additivt vægtet Voronoi-diagram, hvor afstanden til hvert punkt neutraliseres af punktets vægt. Dette kan ses tilsvarende som et Voronoi-diagram af et sæt skiver centreret i punkterne og med en radius svarende til punktets vægt.
Vægtede punkter kan bruges til at kontrollere områderne af Voronoi-celler, når Voronoi-plot bruges til at bygge trækort . I et additivt vægtet Voronoi-diagram er halveringslinjen mellem punkter generelt en hyperbel, i modsætning til uvægtede Voronoi-diagrammer og diskenergidiagrammer ,