Создание обычной сетки Делоне с помощью scipy

Есть ли какой-нибудь способ получить триангуляцию в 2D, которая более упорядочена, как это делает Matlab Delaunay? Вот пример двумерной триангуляции Делоне в Matlab.

matlab Делоне

Используя этот код:

xPoints = np.arange(0,11,1)
yPoints = np.arange(0,11,1)
gridPoints = np.array([[x,y] for y in yPoints for x in xPoints])
tri = Delaunay(gridPoints)
plt.triplot(gridPoints[:,0],gridPoints[:,1],tri.simplices.copy())
plt.plot(gridPoints[:,0],gridPoints[:,1],'bo')
plt.title("Triangulation Visualization")

Я получаю триангуляцию ниже:

scipy delaunay

Обратите внимание, что все диагональные дуги в Matlab имеют одинаковый наклон; но те, что в результате scipy, различаются. Поскольку Matlab и Scipy используют QHull внутри, я предполагаю, что есть какой-то способ имитировать результат Matlab.


person Vance T    schedule 27.04.2015    source источник
comment
Очевидно, что обе триангуляции верны, поскольку оба вида диагоналей имеют одинаковую длину. Возможно, вы захотите взглянуть на параметр qhull_options= для Delaunay, который принимает строку параметров, которые передаются в qdelaunay. Различные возможные варианты суммированы здесь, хотя ничего очевидного не выделяется. К сожалению, невозможно увидеть, как работает функция MATLAB delaunay, поскольку она имеет закрытый исходный код.   -  person ali_m    schedule 27.04.2015
comment
Да, оба верны, но, поскольку это единая область, триангуляция Matlab допускает некоторые упрощения в математике. Спасибо за ссылку, я не нашел ее при поиске раньше.   -  person Vance T    schedule 27.04.2015
comment
Будет ли работать для вашей проблемы явное создание триангуляции самостоятельно? Это должно быть разумно для однородной прямоугольной области.   -  person Alex Szatmary    schedule 04.05.2015
comment
На самом деле я сам сгенерировал триангуляцию и скоро опубликую здесь свой код. К сожалению, полезность встроенных функций scipy теряется.   -  person Vance T    schedule 05.05.2015
comment
В этом старом документе говорится, что параметры Qhull, используемые MATLAB, следующие: 'Qt','Qbb','Qc', однако, когда я использую их с scipy, я не получаю желаемого результата. Пробовал разные комбинации - безрезультатно. Интересно, что на этой связанной странице триангуляция однородной сетки с использованием Matlab Delaunay (пример 2) не показывает искомую регулярность. Интересно, ваш конкретный пример Matlab (т.е. единичный квадрат с интервалом 0,25) произвел это по счастливой случайности? К сожалению, у меня больше нет Matlab с лицензией для тестирования.   -  person J Richard Snape    schedule 21.05.2015
comment
В вашем примере вы можете создать хорошую триангуляцию, запустив qdelaunay на линейно преобразованном наборе входных точек. Добавление небольшого количества перекоса, например. x = x + eps * y должно быть достаточно.   -  person bfroehle    schedule 31.05.2015
comment
Вы просто хотите сетку, как на первом изображении? Если да, вы должны просто построить его вместо использования триангуляции. Я не понимаю, зачем вам использовать библиотечные функции, если у вас/уже есть/рабочий код. Это слишком медленно, потому что это Python или что? Если это так, используйте scipy.weave вместо того, чтобы тратить время на медленный алгоритм триангуляции.   -  person Joonazan    schedule 05.06.2015


Ответы (1)


Вы можете попробовать Триангуляцию вместо Делоне:

import matplotlib.tri as tri

xlen = 10
ylen = 16
xPoints = np.arange(0,xlen+1,1)
yPoints = np.arange(0,ylen+1,1)

gridPoints = np.array([[[x,y] for y in yPoints] for x in xPoints])
a = [[i+j*(ylen+1),(i+1)+j*(ylen+1),i+(j+1)*(ylen+1)] for i in range(ylen) for j in range(xlen)]
triang = tri.Triangulation(gridPoints[:,:,0].flatten(), gridPoints[:,:,1].flatten(),a)

plt.triplot(triang)
plt.plot(gridPoints[:,:,0],gridPoints[:,:,1],'bo')
plt.title("Triangulation Visualization")

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

person Vlad Mironov    schedule 18.06.2015