Фортунов алгоритам

Извор: testwiki
Пређи на навигацију Пређи на претрагу

Шаблон:Neprovereni seminarski

Fortune's algorithm animation

Фортунов алгоритам је алгоритам покретне линије ѕа генерисање Воронојевих дијаграма из скупа тачака у равни чија је временска сложеност O(n log n) и просторна O(n).[1][2] Објавио га је Стивен Фортун 1986. у свом раду "Алгоритам покретне линије за Воронојеве дијаграме."[3]

Опис алгоритма

Алгоритам одржава покретну линију и обалску линију, које се обе крећу кроз раван како алгоритам напредује. Покретна линија је права линија, и можемо по договору претпоставити да је вертикална и да се креће слева надесно. У било ком тренутку током трајања алгоритма тачке лево од покретне линије ће бити уграђене у Воронојев дијаграм, док тачке десно од покретне линије нису још увек разматране. Обалска линија није линија, већ комплексна крива са леве стране покретне која се састоји од делова парабола; она раздваја део равни у којем Воронојев дијаграм може бити познат, без обзира на тачке десно од покретне линије, од остатка равни. За сваку тачку лево од покретне линије, може се дефинисати парабола тачака које су на подједнаком растојању од те тачке и од покретне линије; обалска линија је граница уније ових парабола. Док покретна линија напредује, темена обалске линије, у којој се две параболе секу, прати ивице Воронојевог дијаграма. Обалска линија напредује чувајући сваку параболу тачно на пола пута између тачака преко којих се претходно прешло покретном линијом и новог положаја покретне линије.

Алгоритам одржава као структуру података бинарно стабло претраге које описује структуру обалске линије и приоритетни ред који садржи потенцијалне будуће догађаје који могу да промене структуру обалске линије. Ови догађаји укључују додавање нове параболе у обалску линију (када покретна линија наиђе на нову улазну тачку) и уклањање криве из обалске линије (када покретна линија постане тангента на кругу кроз неке три улазне тачке чије параболе формирају узастопне сегменте обалске линије). Приоритет сваког таквог догађаја се може одредити на основу x-координате покретне линије у тачки у којој се догађај десио. Сам алгоритам се онда састоји од уклањања следећег догађаја из приоритетног реда, проналажења промена које догађај проузрокује у обалској линији и ажурирања структура података.

Пошто има O(n) догађаја које треба обрадити (сваки је повезан са неком карактеристиком Воронојевог дијаграма) и O(log n) времена за обраду догађаја (сваки се састоји од константног броја операција на бинарном стаблу претраге и приоритетном реду) укупно време је O(n log n).

Псеудокод

Псеудокод опис алгоритма.[4]

let *(z) be the transformation *(z)=(zx,zy+d(z)),
  where d(z) is the Euclidean distance between z and the nearest site
let T be the "beach line"
let Rp be the region covered by site p.
let Cpq be the boundary ray between sites p and q.
let p1,p2,...,pm be the sites with minimal y-coordinate, ordered by x-coordinate
QSp1,p2,...,pm
create initial vertical boundary rays Cp1,p20,Cp2,p30,...Cpm1,pm0
T*(Rp1),Cp1,p20,*(Rp2),Cp2,p30,...,*(Rpm1),Cpm1,pm0,*(Rpm)
while not IsEmpty(Q) do
    p ← DeleteMin(Q)
    case p of
    p is a site in *(V):
        find the occurrence of a region *(Rq) in T containing p,
          bracketed by Crq on the left and Cqs on the right
        create new boundary rays Cpq and Cpq+ with bases p
        replace *(Rq) with *(Rq),Cpq,*(Rp),Cpq+,*(Rq) in T
        delete from Q any intersection between Crq and Cqs
        insert into Q any intersection between Crq and Cpq
        insert into Q any intersection between Cpq+ and Cqs
    p is a Voronoi vertex in *(V):
        let p be the intersection of Cqr on the left and Crs on the right
        let Cuq be the left neighbor of Cqr and
          let Csv be the right neighbor of Crs in T
        create a new boundary ray Cqs0 if qy=sy,
          or create Cqs+ if p is right of the higher of q and s,
          otherwise create Cqs
        replace Cqr,*(Rr),Crs with newly created Cqs in T
        delete from Q any intersection between Cuq and Cqr
        delete from Q any intersection between Crs and Csv
        insert into Q any intersection between Cuq and Cqs
        insert into Q any intersection between Cqs and Csv
        record p as the summit of Cqr and Crs and the base of Cqs
        output the boundary segments Cqr and Crs
    endcase
endwhile
output the remaining boundary rays in T

Тежинске локације и дискови

Као што Фортун описује у[1] модификована верзија алгоритма покретне линије може бити искоришћена за конструкцију адитивног тежинског Воронојевог дијаграма, у коме удаљеност до сваке локације (генератора) је померена за тежину локације; ово може бити еквивалентно посматрано као Воронојев дијаграм скупа дискова чији је центар у локацијама са радијусом једнаким тежини локације.

Референце

Шаблон:Reflist

Спољашње везе

Шаблон:Нормативна контрола

  1. 1,0 1,1 Шаблон:Citation Section 7.2: Computing the Voronoi Diagram: pp. 151—160.
  2. Шаблон:Citation
  3. Steven Fortune. A sweepline algorithm for Voronoi diagrams. Proceedings of the second annual symposium on Computational geometry. Yorktown Heights, New York, United States. Шаблон:Cite book ACM Digital LibraryШаблон:Cite journal
  4. Шаблон:Citation