Вороной Тесселяция в Python

Проблема с назначением узла

введите описание изображения здесь

Проблема, которую я хочу решить, состоит в том, чтобы создать тесселяцию карты, заданной синими узлами (исходными узлами) в качестве заданных входных точек. После того, как я смогу это сделать, я хотел бы увидеть, сколько черных узлов (узлов спроса) попадает в каждую ячейку, и назначьте его Синему Узлу, связанному с этой ячейкой.

Я хотел бы знать, есть ли более простой способ сделать это без использования алгоритма Fortune. Я столкнулся с этой функцией в Mahotas, которая называется Mahotas.segmentation.gvoronoi (image) source. Но я не уверен, что это решит мою проблему.

Также, пожалуйста, предложите мне, если есть лучший способ сделать эту сегментацию (кроме тесселяции Вороного). Я не уверен, что алгоритмы кластеризации будут хорошим выбором. Я новичок в программировании.

6 ответов

Вот альтернативный подход к использованию тесселяции Вороного:

Постройте дерево kd поверх исходных узлов. Затем для каждого узла спроса используйте дерево kd, чтобы найти ближайший узел источника и увеличить счетчик, связанный с этим соседним узлом источника.

Реализация дерева kd, найденного по адресу http://code.google.com/p/python-kdtree/ должна быть полезной.

Я просто искал то же самое и нашел это:

https://github.com/Softbass/py_geo_voronoi

На вашей диаграмме не так много точек. Это говорит о том, что для каждого узла спроса можно просто выполнить итерацию по всем исходным узлам и найти ближайший.

Возможно это:

def distance(a, b):
    return sum((xa - xb) ** 2 for (xa, xb) in zip(a, b))

def clusters(sources, demands):
    result = dict((source, []) for source in sources)
    for demand in demands:
        nearest = min(sources, key=lambda s: distance(s, demand))
        result[nearest].append(demand)
    return result

Этот код даст вам словарь, отображающий исходные узлы в список всех узлов спроса, которые находятся ближе к этому исходному узлу, чем любой другой.

Это не особенно эффективно, но очень просто!

Я думаю, что ответ по пространственному индексу по wye.bee (например, kd-дерево) является самым простым решением вашей проблемы.

Кроме того, вы также спросили, есть ли более простая альтернатива алгоритму Фортуны, и на этот конкретный вопрос я вам отвечаю: самый простой алгоритм реализации диаграммы Вороного?

Запустите этот код в Mathematica. Это впечатляюще! (Да, я знаю, что это не Python, но...)

pts3 = RandomReal[1, {50, 3}];
ListDensityPlot[pts3, 
    InterpolationOrder -> 0, ColorFunction -> "SouthwestColors", Mesh -> All]

Диаграмма Вороного

Вы не сказали, почему хотели избежать алгоритма Фортуны. Я предполагаю, что вы имели в виду, что вы просто не хотели реализовывать это самостоятельно, но это уже было реализовано в сценарии Биллом Саймонсом и Карстоном Фармером, поэтому вычисление диаграммы вороного не должно быть сложным.

Основываясь на их сценарии, я сделал его еще проще в использовании и загрузил его в PyPi под именем Pytess. Таким образом, вы можете использовать функцию pytess.voronoi(), основанную на синих точках, в качестве входных данных, возвращая исходные точки с их вычисленными полигонами вороной. Затем вам нужно будет назначить каждую черную точку с помощью тестирования точки в полигоне, которое вы можете использовать на http://geospatialpython.com/2011/08/point-in-polygon-2-on-line.html.

введите описание изображения здесь

Другие вопросы по тегам