پویانمایی الگوریتم فورچون
**الگوریتم فورچون** یک الگوریتم خط جارویی برای ساختن نمودار ورونی از یک دسته نقطه در صفحه با استفاده از زمان {\displaystyle O(nlogn)} و حافظۀ O(n) است.
این الگوریتم اولین بار توسط استیون فورچون در سال ۱۹۸۶ در مقالۀ "یک الگوریتم خط جارویی برای نمودارهای ورونی" چاپ شد.

توضیح الگوریتم
--------------

این الگوریتم هم از خط جارویی و هم از *خط ساحلی* استفاده می‌کند که هردوی این خطوط در حین پیشرفت الگوریتم روی صفحه حرکت می‌کنند. خط جارویی خط مستقیمی است که ما به صورت توافقی می‌توانیم فرض کنیم که یک خط عمودی است و از چپ به راست صفحه حرکت می‌کند. در هر لحظه در طی الگوریتم نقاط ورودی سمت چپ خط جارویی با نمودار ورونی یکپارچه خواهند شد درحالی که نقاط سمت راست خط هنوز در نظر گرفته نشده‌اند. خط ساحلی یک خط نیست، بلکه یک منحنی مرکب در سمت چپ خط جارویی است که از تکه‌های سهمیها تشکیل شده است؛ این خط صفحه را به گونه‌ای تقسیم می‌کند که در آن نمودار ورونی، بدون توجه به وجود نقاط ممکن در سمت راست خط جارویی، از بقیۀ صفحه قابل تشخیص است. برای هر نقطه در سمت چپ خط جارویی، میتوان یک سهمی از نقاط هم‌فاصله از آن نقطه و خط جارویی تعریف کرد. خط ساحلی مرز مجموعۀ این سهمی‌ها است. هر چه خط جارویی پیشروی می‌کند رئوس خط ساحلی، که محل تلاقی دو سهمی است، یال‌های نمودار ورونی را رسم می‌کنند. خط ساحلی طوری پیشرفت می‌کند که رأس هر سهمی دقیقأ در وسط نقاط اولیۀ خط جارویی و جایگاه جدید خط جارویی قرار بگیرد.

این الگوریتم از داده ساختارها استفاده می‌کند: یک درخت جستجوی دودویی که ساختار ترکیبی خط ساحلی را توصیف می‌کند و یک صف اولویت‌دار که رخدادهای بالقوۀ بعدی را که می‌توانند ساختار خط ساحلی را تغییر دهند لیست می‌کند. این رخدادها شامل اضافه کردن یک سهمی دیگر به خط ساحلی هستند (وقتی که خط جارویی از نقطۀ ورودی دیگری عبور می‌کند) و برداشتن منحنی از خط ساحلی (وقتی که خط جارویی با یک دایرۀ عبورکننده از سه نقطه، که سهمی‌هایشان بخش‌های متوالی خط ساحلی را تشکیل می‌دهند، مماس می‌شود). هر رخداد می‌تواند توسط محور xهای خط جارویی در محل وقوع رخداد، اولویت‌بندی شود. الگوریتم از برداشتن مکرر رخداد بعدی از صف اولویت‌دار، یافتن تغییراتی که آن رخداد در خط ساحلی ایجاد می‌کند و بهنگام‌سازی داده ساختارها، تشکیل می‌شود. از آنجا که O(n) رخداد وجود دارند تا پردازش شوند (که هرکدام با برخی ویژگی‌های دیاگرام ورونی مرتبط هستند) و زمان {\displaystyle O(logn)} برای پردازش یک رخداد (که هرکدام شامل تعداد ثابتی از اعمال درخت جستجوی دودویی و صف اولویت‌دار هستند) زمان کلی الگوریتم {\displaystyle O(nlogn)} است.

### شبه‌کد

شبه‌کد توضیحات الگوریتم.

```
let {\displaystyle \*(z)} be the transformation {\displaystyle \*(z)=(z\_{x},z\_{y}+d(z))},
  where {\displaystyle d(z)} is the Euclidean distance between z and the nearest site
let T be the "beach line"
let {\displaystyle R\_{p}} be the region covered by site p.
let {\displaystyle C\_{pq}} be the boundary ray between sites p and q.
let {\displaystyle p\_{1},p\_{2},...p\_{m}} be the sites with minimal y-coordinate, ordered by x-coordinate
{\displaystyle Q\gets S-{p\_{1},p\_{2},...p\_{m}}}
create initial vertical boundary rays {\displaystyle C\_{p\_{1},p\_{2}}^{0},C\_{p\_{2},p\_{3}}^{0},...C\_{p\_{m-1},p\_{m}}^{0}}
{\displaystyle T\gets \*(R\_{p\_{1}}),C\_{p\_{1},p\_{2}}^{0},\*(R\_{p\_{2}}),C\_{p\_{2},p\_{3}}^{0},...\*(R\_{p\_{m-1}}),C\_{p\_{m-1},p\_{m}}^{0},\*(R\_{p\_{m}})}
**while not** IsEmpty(Q) **do**
    p ← DeleteMin(Q)
    **case** p of
    p is a site in {\displaystyle \*(V)}:
        find the occurrence of a region {\displaystyle \*(R\_{q})} in T containing p,
          bracketed by {\displaystyle C\_{rq}} on the left and {\displaystyle C\_{qs}} on the right
        create new boundary rays {\displaystyle C\_{pq}^{-}} and {\displaystyle C\_{pq}^{+}} with bases p
        replace {\displaystyle \*(R\_{q})} with {\displaystyle \*(R\_{q}),C\_{pq}^{-},\*(R\_{p}),C\_{pq}^{+},\*(R\_{q})} in T
        delete from Q any intersection between {\displaystyle C\_{rq}} and {\displaystyle C\_{qs}}
        insert into Q any intersection between {\displaystyle C\_{rq}} and {\displaystyle C\_{pq}^{-}}
        insert into Q any intersection between {\displaystyle C\_{pq}^{+}} and {\displaystyle C\_{qs}}
    p is a Voronoi vertex in {\displaystyle \*(V)}:
        let p be the intersection of {\displaystyle C\_{qr}} on the left and {\displaystyle C\_{rs}} on the right
        let {\displaystyle C\_{uq}} be the left neighbor of {\displaystyle C\_{qr}} and
          let {\displaystyle C\_{sv}} be the right neighbor of {\displaystyle C\_{rs}} in T
        create a new boundary ray {\displaystyle C\_{qs}^{0}} if {\displaystyle q\_{y}=s\_{y}},
          or create {\displaystyle C\_{qs}^{+}} if p is right of the higher of q and s,
          otherwise create {\displaystyle C\_{qs}^{-}}
        replace {\displaystyle C\_{qr},\*(R\_{r}),C\_{rs}} with newly created {\displaystyle C\_{qs}} in T
        delete from Q any intersection between {\displaystyle C\_{uq}} and {\displaystyle C\_{qr}}
        delete from Q any intersection between {\displaystyle C\_{rs}} and {\displaystyle C\_{sv}}
        insert into Q any intersection between {\displaystyle C\_{uq}} and {\displaystyle C\_{qs}}
        insert into Q any intersection between {\displaystyle C\_{qs}} and {\displaystyle C\_{sv}}
        record p as the summit of {\displaystyle C\_{qr}} and {\displaystyle C\_{rs}} and the base of {\displaystyle C\_{qs}}
        output the boundary segments {\displaystyle C\_{qr}} and {\displaystyle C\_{rs}}
    **endcase**
**endwhile**
output the remaining boundary rays in T
```

بخش‌ها و دیسک‌های وزن‌دار
-------------------------

همان‌طور که فورچون در  توضیح داده است، یک نوع الگوریتم توسعه‌یافتۀ خط جارویی می‌تواند برای ساخت نمودار ورونی وزن‌دارافزایشی استفاده شود، که در آن فاصلۀ هر بخش با وزن آن تعیین می‌شود؛ که این می‌تواند برابر با نمودار ورونی مجموعه‌ای از دیسک‌های هم‌مرکز بخش‌ها و به شعاع وزن آن‌ها باشد.

زمانی که از نمودار ورونی برای ساخت treemapها استفاده می‌شود، می‌توان از بخش‌های وزن‌دار برای کنترل مکان‌های سلولی ورونی استفاده کرد. در یک دیاگرام ورونی وزن‌دار افزایشی، نیم‌ساز بین بخش‌ها به‌طور عمومی یک هذلولی است در حالی که در نمودارهای ورونی غیروزن‌دار و نمودار پاور دیسک‌ها نیم‌ساز یک خط مستقیم است.

منابع
-----

1. 1 2  Mark de Berg, Marc van Kreveld, Mark Overmars, and Otfried Schwarzkopf (2000), *Computational Geometry* (2nd revised ed.), Springer-Verlag, ISBN 3-540-65620-0`{{citation}}`: نگهداری یادکرد:نام‌های متعدد:فهرست نویسندگان (link) 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, pp.313–322. 1986. ISBN 0-89791-194-6. ACM Digital LibrarySpringerLink[*پیوند مرده*]
4. ↑  Kenny Wong, Hausi A. Müller, *An Efficient Implementation of Fortune's Plane-Sweep Algorithm for Voronoi Diagrams*.

پیوند به بیرون
--------------

* Steven Fortune's C implementation
* Fortune's Voronoi algorithm implemented in C++
* Fortune's Voronoi algorithm implemented in C# بایگانی‌شده در ۱۰ ژانویه ۲۰۱۲ توسط Wayback Machine
* Fortune's algorithm implemented in JavaScript