Algorytm fortuny

Fortune's Algorithm Animation
Animacja algorytmu Fortune

Algorytm Fortune to algorytm linii przemiatania służący do generowania diagramu Woronoja ze zbioru punktów na płaszczyźnie przy użyciu czasu O ( n log n ) i przestrzeni O ( n ). Został pierwotnie opublikowany przez Stevena Fortune'a w 1986 roku w jego artykule „Algorytm linii zamiatanej dla diagramów Woronoja”.

Opis algorytmu

Algorytm utrzymuje zarówno linię przeciągnięcia , jak i linię plaży , które poruszają się po płaszczyźnie w miarę postępu algorytmu. Linia przeciągnięcia jest linią prostą, którą możemy umownie przyjąć jako pionową i poruszającą się od lewej do prawej w poprzek płaszczyzny. W dowolnym momencie algorytmu punkty wejściowe na lewo od linii przemiatania zostaną włączone do diagramu Woronoja, podczas gdy punkty na prawo od linii przemiatania nie będą jeszcze brane pod uwagę. Linia plaży nie jest linią prostą, ale skomplikowaną, fragmentaryczną krzywą na lewo od linii przeciągnięcia, złożoną z kawałków paraboli ; dzieli część płaszczyzny, w której można poznać diagram Woronoja, niezależnie od tego, jakie inne punkty mogą znajdować się na prawo od linii przeciągnięcia, od reszty płaszczyzny. Dla każdego punktu na lewo od linii przeciągnięcia można zdefiniować parabolę punktów równoodległych od tego punktu i od linii przeciągnięcia; linia plaży jest granicą połączenia tych paraboli. W miarę postępu linii przemiatania wierzchołki linii plaży, w których przecinają się dwie parabole, wyznaczają krawędzie diagramu Woronoja. Linia plaży rozwija się, utrzymując każdą podstawę paraboli dokładnie w połowie drogi między punktami początkowo przemiatanymi linią wobulacji a nową pozycją linii wobulacji. Matematycznie oznacza to, że każda parabola jest tworzona przy użyciu linii przemiatania jako kierownicy i punktu wejściowego jako ogniska.

Algorytm utrzymuje jako struktury danych binarne drzewo wyszukiwania opisujące kombinatoryczną strukturę linii plaży oraz kolejkę priorytetową zawierającą potencjalne przyszłe zdarzenia, które mogą zmienić strukturę linii plaży. Zdarzenia te obejmują dodanie kolejnej paraboli do linii plaży (kiedy linia przeciągnięcia przecina inny punkt wejściowy) i usunięcie krzywej z linii plaży (kiedy linia przeciągnięcia staje się styczna do okręgu przechodzącego przez jakieś trzy punkty wejściowe, których parabole tworzą kolejne odcinki linii brzegowej). Każdemu takiemu zdarzeniu można nadać priorytet na podstawie x linii przemiatania w punkcie wystąpienia zdarzenia. Sam algorytm polega następnie na wielokrotnym usuwaniu następnego zdarzenia z kolejki priorytetów, wyszukiwaniu zmian, które zdarzenie powoduje w linii brzegowej i aktualizowaniu struktur danych.

Ponieważ istnieje O( n ) zdarzeń do przetworzenia (każde jest powiązane z jakąś cechą diagramu Woronoja) i O(log n ) czasu na przetworzenie zdarzenia (każde składa się ze stałej liczby binarnych drzew wyszukiwania i operacji kolejki priorytetowej), całkowity czas to O( n log n ).

Pseudo kod

Pseudokodowy opis algorytmu.




     
    
    
 niech  będzie transformacją  , gdzie  jest odległością euklidesową między  a  najbliższym miejscem, niech  będzie  „linią plaży” niech  będzie regionem objętym przez witrynę  p  . niech do   będzie promieniem granicznym między  p  i  q  . niech   na których ma być zastosowany ten algorytm. niech   {1}, p_ {2}, ..., p_ {m}} być witrynami wyodrębnionymi z minimalnej współrzędnej y  według  współrzędnej  niech  DeleteMin  (  X  ) być aktem usunięcia najniższego i najbardziej wysuniętego na lewo miejsca  według y, chyba że są identyczne, w takim przypadku posortuj według x) niech  mapą Woronoja  , które ma być skonstruowane przez ten algorytm  początkowe pionowe promienie graniczne  Q  )  do  p  DeleteMin  (  Q  )  przypadek  p  z  p  miejscem w  : znajdź występowanie regionu  T  zawierającego  p  ,  przez  po lewej i do  po prawej tworzą nowe promienie graniczne  i  z podstawami  p  zastąpić  z  w  T  usuń z  Q  dowolne przecięcie między  i  wstaw do  Q  dowolne przecięcie między do  i do  wstaw do  Q  dowolne przecięcie między  do  p  jest wierzchołkiem Woronoja w  : niech  p  będzie przecięciem do  po lewej stronie i  po prawej niech  lewym sąsiadem do  i niech do  prawym sąsiadem  T  utworzyć nowy promień graniczny  y  \  lub stwórz do  jeśli  p jest na prawo   wyższej z  q  i  s  , w przeciwnym razie utwórz  zastąpić  utworzonym do  w  T  usuń z  Q  dowolne przecięcie między  do  z  Q  dowolne przecięcie między  i do  wstaw do  s  {  qs  do  Q  dowolne przecięcie między  i  zapisz  p  jako szczyt do  i do  do  segmenty graniczne  do  endcase  endwhile  wyprowadź pozostałą granicę promienie w  t 

Ważone witryny i dyski

Jak opisuje Fortune w odnośniku, zmodyfikowaną wersję algorytmu linii przemiatania można wykorzystać do skonstruowania addytywnie ważonego diagramu Woronoja, w którym odległość do każdego miejsca jest kompensowana przez wagę miejsca; można to równoważnie postrzegać jako diagram Woronoja zestawu dysków, wyśrodkowanych w miejscach o promieniu równym wadze miejsca.

Miejsca ważone mogą być używane do kontrolowania obszarów komórek Woronoja podczas używania diagramów Woronoja do konstruowania map drzew . Na diagramie Woronoja ważonym addytywnie dwusieczna między miejscami jest na ogół hiperbolą, w przeciwieństwie do nieważonych diagramów Woronoja i diagramów mocy dysków, dla których jest to linia prosta.

Linki zewnętrzne