У меня треугольная тесселяция, подобная той, что показана на рисунке. ![enter image description here](https://i.stack.imgur.com/TZtoem.jpg)
Учитывая N
количество треугольников в тесселяции, у меня есть массив N X 3 X 3
, которыйхранит (x, y, z)
координаты всех трех вершин каждого треугольника.Моя цель - найти для каждого треугольника соседний треугольник, имеющий одинаковое ребро.Это сложная часть всей установки, что я не повторяю количество соседей.То есть, если треугольник j
уже был посчитан как сосед треугольника i
, то треугольник i
не должен снова считаться соседом треугольника j
.Таким образом, я хотел бы иметь карту, хранящую список соседей для каждого индексного треугольника.Если я начну с треугольника в индексе i
, то у индекса i
будет три соседа, а у всех остальных будет два или меньше.В качестве иллюстрации предположим, что у меня есть массив, в котором хранятся вершины треугольника:
import numpy as np
vertices = np.array([[[2.0, 1.0, 3.0],[3.0, 1.0, 2.0],[1.2, 2.5, -2.0]],
[[3.0, 1.0, 2.0],[1.0, 2.0, 3.0],[1.2, -2.5, -2.0]],
[[1.0, 2.0, 3.0],[2.0, 1.0, 3.0],[3.0, 1.0, 2.0]],
[[1.0, 2.0, 3.0],[2.0, 1.0, 3.0],[2.2, 2.0, 1.0]],
[[1.0, 2.0, 3.0],[2.2, 2.0, 1.0],[4.0, 1.0, 0.0]],
[[2.0, 1.0, 3.0],[2.2, 2.0, 1.0],[-4.0, 1.0, 0.0]]])
Предположим, я начинаю свой отсчет с индекса вершины 2
, то есть с вершины [[1.0, 2.0, 3.0],[2.0, 1.0, 3.0],[3.0, 1.0, 2.0]]
, тогда я бынапример, мой вывод будет выглядеть примерно так:
neighbour = [[], [], [0, 1, 3], [4, 5], [], []].
Обновление: После ответа от @ Ajax1234, я думаю, что хороший способ хранения вывода такой же, как продемонстрировал @ Ajax1234.Однако в этом выводе есть двусмысленность, в том смысле, что невозможно узнать, чей сосед какой.Хотя пример массива не очень хорош, у меня есть фактические вершины из икосаэдра, но если я начну с заданного треугольника, у меня гарантированно будет 3 соседа для первого и два соседа для отдыха (пока все треугольники не истощатся),В связи с этим предположим, что у меня есть следующий массив:
vertices1 = [[[2, 1, 3], [3, 1, 2], [1, 2, -2]],
[[3, 1, 2], [1, 2, 3], [1, -2, 2]],
[[1, 2, 3], [2, 1, 3], [3, 1, 2]],
[[1, 2, 3], [2, 1, 3], [2, 2, 1]],
[[1, 2, 3], [2, 2, 1], [4, 1, 0]],
[[2, 1, 3], [2, 2, 1], [-4, 1, 0]],
[[3, 1, 3], [2, 2, 1], [-4, 1, 0]],
[[8, 1, 2], [1, 2, 3], [1, -2, 2]]]
Алгоритм BFS, показанный в ответе ниже @ Ajax1234, дает вывод
[0, 1, 3, 7, 4, 5, 6]
, а если я просто поменяю местамипозиция последнего элемента такая, что
vertices2 = [[[2, 1, 3], [3, 1, 2], [1, 2, -2]],
[[3, 1, 2], [1, 2, 3], [1, -2, 2]],
[[1, 2, 3], [2, 1, 3], [3, 1, 2]],
[[1, 2, 3], [2, 1, 3], [2, 2, 1]],
[[1, 2, 3], [2, 2, 1], [4, 1, 0]],
[[8, 1, 2], [1, 2, 3], [1, -2, 2]],
[[2, 1, 3], [2, 2, 1], [-4, 1, 0]],
[[3, 1, 3], [2, 2, 1], [-4, 1, 0]]]
, которая дает вывод
[0, 1, 3, 4, 5, 6, 7].
Это несколько неоднозначно, так как позиции в гирде не изменились вообще, онибыли просто поменяны местами.Поэтому я хотел бы иметь последовательный способ поиска.Например, первый раз поиск соседей по индексу 2 дает [0, 1, 3]
для vertices1
и vertices2
, теперь я хотел бы, чтобы поиск был по индексу 0, который ничего не находит, и, следовательно, переход к следующему элементу 1 должен найти индекс7
для vertices1
и индекс 5
для vertices2
.Таким образом, выходной ток должен быть [0, 1, 3, 7]
, [0, 1, 3, 5]
для vertices1
и vertices2
соответственно.Далее мы идем к индексу 3
и так далее.После того, как мы исчерпали весь поиск, окончательный результат для первого должен быть
[0, 1, 3, 7, 4, 5, 6]
, а для второго -
[0, 1, 3, 5, 4, 6, 7].
Каким был бы эффективный способ добиться этого?