
У меня есть группа треугольников, которые будут закрывать область плиткой, одна из возможных конфигураций показана на прилагаемом изображении. Я хочу узнать, сколько ребер каждый треугольник разделяет с соседними треугольниками. Таким образом, треугольник сам по себе не будет иметь общих ребер, в то время как полностью окруженный треугольник будет иметь общие все три ребра. На изображении центральный треугольник имеет общий верхний край с треугольником выше, но не имеет соседей с двух других сторон. Поэтому мне нужен способ определить, что он имеет только одно общее ребро с соседом.
Я определил каждый треугольник как многоугольник в shapely, а затем ввел список многоугольников треугольника в SRTtree. Затем попробовал предикаты «касается» и «пересекается».
Оба выводят каждый соседний треугольник, который касается любой из вершин. Предпочтительный результат — выводить только треугольники с общими ребрами.
Я также пытался использовать операции покрытия для идентификации ребер, не имеющих соседей. К сожалению, обнаружение недопустимого края возвращает пустой набор для каждого треугольника. Несмотря на то, что рядом с двумя краями центрального треугольника нет ничего, он, похоже, удовлетворяет требованиям покрытия и не содержит недопустимых краев.
Приведенный ниже минимальный воспроизводимый пример (MRE) содержит только четыре треугольника из диаграммы: центральный треугольник, треугольник над ним, имеющий общее ребро, треугольник, имеющий общую вершину, и треугольник, который не касается исходного треугольника.
Код: Выделить всё
import shapely
triangles.append=shapely.Polygon(shell=((-0.5,0.866),(0.5,0.866),(0,0)),holes=None))
triangles.append=shapely.Polygon(shell=((-0.5,0.866),(0.5,0.866),(0,1.732)),holes=None))
triangles.append=shapely.Polygon(shell=((0.5,0.866),(1.5,0.866),(1,0)),holes=None))
triangles.append=shapely.Polygon(shell=((1,0),(2,0),(1.5,0.866)),holes=None))
tree=shapely.STRtree(triangles)
touching_triangles=tree.query(triangles[0], predicate="touches")
intersecting_triangles=tree.query(triangles[0], predicate="intersects")
identified_edges=shapely.coverage_invalid_edges(triangles)
Подробнее здесь: https://stackoverflow.com/questions/798 ... th-shapely
Мобильная версия