Не удалось создать правильную треугольную сетку внутри вогнутого многоугольника с помощью scipy в Python

В своей работе я столкнулся с задачей, в которой мне нужно создать треугольную сетку внутри нескольких разных полигонов с помощью Python. Хотя многоугольники представляют собой сегменты выпуклой оболочки, каждый сегмент сам по себе имеет вогнутую форму. Когда я попытался использовать scipy.spatial.Delaunay(), оказалось, что алгоритм предполагает, что многоугольник выпуклый, и в конечном итоге генерирует треугольники за пределами вогнутой области корпуса. Ниже приведены коды и результирующий график.

for i in range(len(mp)):
    dtri = np.array(mp[i])
    plt.scatter(dtri[:,0],dtri[:,1])
    plt.plot(np.array(fdc_seg[i])[:,0],np.array(fdc_seg[i])[:,1])
    tri = Delaunay(dtri,qhull_options="QJ")
    triang = mtri.Triangulation(dtri[:, 0],dtri[:, 1],triangles=tri.simplices)
    plt.triplot(dtri[:, 0], dtri[:, 1], tri.simplices,lw=0.5, color='red')
plt.show()

многоугольники полученная треугольная сетка


person Zhichen    schedule 14.05.2020    source источник


Ответы (1)


Подпрограмма scipy.spatial.Delaunay() создает триангуляцию выпуклой оболочки точек, переданных алгоритму, поэтому эти дополнительные треугольники ожидаются. Чтобы получить результат, который вы ищете, (1) вам нужно надеяться удалить треугольники за пределами вашего многоугольника и (2) вам нужно надеяться, что все ребра вашего многоугольника действительно существуют в триангуляции Делоне.

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

person Alex    schedule 18.05.2020
comment
Спасибо, Алексей, очень познавательно. Я решил проблему, используя библиотеку Shapely, чтобы удалить треугольники за пределами многоугольника, сформировав каждый треугольник как отдельный многоугольник и посмотрев, находится ли он в исходном многоугольнике. И спасибо, что поделились Triangle и Meshpy, хотя причина, по которой я столкнулся с вышеуказанной проблемой, заключалась в попытке заменить Meshpy в качестве генератора трех сеток, поскольку он неоднократно дает сбой (по некоторым причинам он лучше работает в системе Linux). Если вы знаете причину, из-за которой Meshpy так часто вылетает, пожалуйста, дайте мне знать. Еще раз спасибо за помощь. - person Zhichen; 20.05.2020