ГоловнаСтаттіГеометрія

Діаграми Вороного: Простір Найближчих Соседів, Зроблений Навіть Краще

Як розкид точок розділяє площину на області, і як алгоритм Ллойда розслабляє ці області в рівномірну, майже шестигранну сітку.

mysimulator teamОновлено — червень 2026≈ 8 хв читання▶ Відкрити симуляцію

Every point in the plane, claimed by its nearest site

Scatter a handful of points, called sites, across a plane. For every other point in that plane, ask which site is nearest. The set of points closest to a given site — its Voronoi cell — is a convex polygon, and the collection of all such cells for all sites is the Voronoi diagram. The boundary between two neighbouring cells is always a straight segment of the perpendicular bisector between their two sites, because that bisector is exactly the set of points equidistant from both.

Named after Georgy Voronoi, who formalised it in 1908, the construction had already appeared in Descartes's sketches of how space partitions around neighbouring stars, and it shows up constantly in nature: the polygonal cracks of dried mud, the domains of competing bacterial colonies on a petri dish, and the territorial ranges of animals that space themselves out from their nearest rivals are all approximately Voronoi diagrams, because "closest to me, farthest from my neighbour" is exactly the rule the mathematics encodes.

жива демонстрація · пов'язана симуляція● LIVE

Растеризованный расчет: хитрость, которая работает

Традиционный способ построить точный диаграмма Вороного — алгоритм Fortune's sweepline, который выполняется за O(n log n) времени и напрямую выдает полигоны. Для интерактивной области просмотра более простой метод грубой силы обычно достаточен: для каждого пикселя вычисляется расстояние до всех n объектов и он окрашивается в цвет ближайшего.

Для каждого пикселя (x, y): лучший = бесконечность; владелец = -1 для i от 0 до n-1: d = (x - объекты[i].x)^2 + (y - объекты[i].y)^2 // возведенная в квадрат дистанция, не нужно извлекать корень если d < лучший: лучший = d; владелец = i пиксель(x, y) = цвет[владелец] Это O(ширина · высота · n) на кадр, что звучит расточительно, но легко достаточно при умеренном разрешении и количестве объектов на современном оборудовании, и оно обходит все краевые случаи точного полигонального вычисления — дегенерированные коллинеарные объекты, числовая точность у границ ячейки — бесплатно. Это также тривиально параллельно по пикселям, что объясняет, почему тот же подход является естественным решением для фрагментного шейдера GPU («прыжок заливки» вычисляет приблизительную диаграмму Вороного на GPU в логарифмических проходах вместо одного прохода за объект).

This approach is efficient because it avoids the complexities of exact Voronoi diagram computation, which can be computationally expensive and prone to numerical errors.

for each pixel (x, y):
  best = infinity; owner = -1
  for i in 0..n-1:
    d = (x - sites[i].x)^2 + (y - sites[i].y)^2   // squared distance, no sqrt needed
    if d < best: best = d; owner = i
  pixel(x, y) = colour[owner]

Алгоритм Ллойда: переміщення до центрумаси

Voronoi діаграма, побудована з випадкових точок, зазвичай виглядає нерівномірно — деякі комірки тісно розташовані, інші розтягнуті. Алгоритм Стюарта Ллойда 1957 року (спочатку розроблений для квантизації аналогових сигналів, пізніше відновлений для генерації сіток і комп'ютної графіки) вирішує це з використанням простого ітеративного рішення: обчислюється Voronoi діаграма, а потім кожна точка переміщується до центрумаси — центру ваги своєї комірки, і повторюється.

повторити k разів: комірки = voronoi(точки) для i від 0 до n-1 включно: точки[i] = centroid(комірки[i]) // центр ваги з урахуванням площі Кожна ітерація трохи наближає діаграму до центрильної Voronoi сітки, фіксованої точки, де кожна точка розташована точно в центрі своєї комірки. Візуально комірки стають більш рівномірними за розміром, більш компактними та лінії вирівнюються до шестигранної упаковки з мінімальною середньою квадратною відстанню від будь-якої точки в комірці до її центру — така сама оптимізація проблеми, яка також зустрічається в квантизації сигналів, де алгоритм Ллойда також відомий як Lloyd-Max квантування, і в кластеризації k-середніх, яка є застосуванням алгоритму Ллойда до багатовимірних даних замість площини 2D.

repeat k times:
  cells = voronoi(sites)
  for i in 0..n-1:
    sites[i] = centroid(cells[i])   // area-weighted center of mass

Delaunay Triangulation

Draw an edge between every pair of sites whose Voronoi cells share a boundary, and the result is the Delaunay triangulation — the geometric dual of the Voronoi diagram. It has the defining property that no site lies inside the circumcircle of any triangle formed by three others, which makes it the triangulation that avoids thin, needle-like triangles as much as possible for a given point set.

Because the two structures are dual, most computational-geometry libraries compute them together in a single pass; if you need one, you effectively get the other for the cost of reading off the connectivity differently.

Розподіл ресурсів на основі діаграм Вороної

Центроїдальні сітки Вороної є стандартною відправною точкою для генерації сіток кінцевих елементів, оскільки добре сформовані, рівномірно розміщені комірки забезпечують чисельно стабільні симуляції. Алгоритми стіплінгу використовують зважене розслаблення Ллойда-Джонсона для розміщення крапок, які відтворюють тон зображення за допомогою щільності точок замість тіні. Проблеми планування шляхів і розміщення датчиків на карті часто зменшуються до зваженого розподілу Вороної, оскільки це безпосередньо відповідає «який ресурс найближчий до кожного місця». І процедурна генерація в іграх постійно покладається на діаграми Вороної, для картонних мап, текстур з тріщинами та затінених поверхонь, що саме завдяки кільком проходів розслаблення чисто випадкове розсіювання перетворюється на щось, що читається як навмисно організовано спроєктоване.

Frequently asked questions

Яка різниця між діаграмою Вороної та її Делаунеївською подвійністю?

Діаграма Вороної розділяє площину на області, найближчі до кожного об’єкта; Делаунеєва триангуляція з’єднує об'єкти, чиї комірки Вороної мають спільний край. Це геометричні дуальні об'єкти один одного і можуть бути обчислені разом у тому ж процесі промахування, тому більшість бібліотек діаграми Вороної також надають можливість безкоштовно використовувати триангуляцію.

Чому розслаблені комірки Вороної схильні до формування шестигранної структури?

Регулярне шестигранне укладання є єдиним розташуванням, яке мінімізує середню квадратичну відстань від точок в області до центру маси цієї області для заданої площі комірки та фіксованої кількості сусідів на комірку (шість). Метод Ллойда змушує кожну комірку бути своїм власним центром, тому на великій, безмежній території рівновага природно сходиться до цього шестигранкового пакування, так само як і у візерунків бджолиних сот та висихаючої глини.

Чи завжди збігається Метод Ллойда?

Він збігається до центроїдної діаграми Вороної в тому сенсі, що загальна дисперсія кожної комірки суворо зменшується на кожному кроці ітерації, але це градієнтний метод, а не точний розв'язок: він може сповільнитися поблизу фіксованої точки та може застигнути в локально оптимальній, але глобально недосконалій конфігурації, особливо поблизу меж області. Зазвичай достатньо кількох ітерацій, щоб помітно вирівняти випадкову множину точок.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Voronoi Diagrams and Lloyd's Relaxation і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Voronoi Diagrams and Lloyd's Relaxation

Що ви знайшли?

Додати кроки відтворення (опційно)