Istnieje wiele sposobów ważenia odległości do konstruowania wielokątów Thiessena. Podstawowa idea ich budowy polega na porównaniu odległości między dowolnym punktem x a dwoma stałymi punktami p i q ; musisz zdecydować, czy x jest „bliżej” do p niż do q, czy nie. W tym celu - przynajmniej koncepcyjnie - rozważamy odległości dp = d ( x , p ) i dq = d ( x , q ). Ważenie odbywa się zwykle na dwa sposoby: punktom można nadać dodatnie wagi liczbowe wp i wq, a same odległości można przekształcić.
Aby mieć sens, transformacja (którą napiszę jako f ) powinna rosnąć wraz ze wzrostem odległości; to znaczy, f (d ')> f (d) ilekroć d'> d> = 0. Przykładami takich przekształceń są f (d) = d + 1, f (d) = d ^ 2 (prawo grawitacji detalicznej Reilly'ego ), f (d) = 1 - 1 / d (przy założeniu, że wszystkie odległości są mniejsze niż 1), f (d) = log (d), f (d) = exp (d) -1.
Powiedzielibyśmy wtedy, że x jest „bliżej” do p niż do q dokładnie kiedy
f (d ( x , p )) / wp <f (d ( x , q )) / wq.
Zwróć uwagę na podział według ciężarów zamiast pomnożenia: oznacza to, że duże ciężary będą miały tendencję do „przyciągania” punktów na większe odległości. Zobaczysz to w działającym przykładzie poniżej.
Oto piękna rzecz i sedno tej nieco abstrakcyjnej ekspozycji: chociaż powstałe regiony Thiessen mogą mieć złożone, niezwykle trudne do obliczenia granice, są one stosunkowo łatwe do obliczenia przy użyciu reprezentacji opartej na siatce. Oto przepis:
Dla każdego punktu wejściowego p oblicz jego siatkę odległości euklidesowej [d (p)].
Użyj Algebry Map, aby zastosować f i wagi, a tym samym ponownie wyrazić każdą siatkę odległości jako
[fp] = f ([d (p)]) / wp.
Oto przykład wykorzystujący f (d) = 100 + d ^ (3/2); skala wynosi 400 na 600.
W miarę wzrostu f (d) wartość staje się ciemniejsza. Najwyraźniej odległość w tym przykładzie dotyczy centralnego czerwonego punktu; pozostałe cztery punkty otrzymują osobne obliczenia odległości (nie pokazano). Obszary kropek są proporcjonalne do ich wag, które wynoszą 2, 10, 3, 4 i 5.
Oblicz lokalne minimum wszystkich tych siatek [fp]. Nazwij to [f]. Oto przykład.
Porównując [f] z każdym [fp], do każdej komórki siatki przypisz identyfikator pierwszego p, dla którego [f]> = [fp]. (Można to zrobić na przykład w jednym kroku z operacją najniższego położenia ).
(Wątpię, czy istnieje algorytm, który obliczy rozwiązanie w formacie wektorowym dla tej funkcji ważącej f.)
Oczywiście, jeśli masz więcej niż garść punktów p , skryptujesz to, a jeśli ich liczba osiągnie tysiące, prawdopodobnie porzucisz tę próbę jako niewykonalną obliczeniowo (chociaż istnieją sposoby na przyspieszenie obliczeń poprzez ich kafelkowanie).
Kolejny przykład pokazujący wielokąty Thiessena na elipsoidzie pojawia się na stronie /gis//a/17377/ .