изменить представление сетки на таблица точек и стол треугольника. STL требует, чтобы все треугольники были соединены в своих вершинах, поэтому резка ребер, которая означает соседний треугольник, всегда имеет один полный край.
double pnt[points][3];
int tri[triangles][3];
pnt
должен быть список всех различных точек (индекс разбирайтесь, чтобы улучшить скорость для подсчета высокой точки). tri
должен содержать 3 указателя точек, используемых в треугольнике. Сортируйте их (по возрастанию или по убыванию), чтобы улучшить скорость совпадения.
Теперь, если любой треугольник tri[i]
разделяет тот же край, что и tri[j]
, тогда эти два являются соседними треугольниками.
if ((tri[i][0]==tri[j][0])&&(tri[i][1]==tri[j][1])
||(tri[i][0]==tri[j][1])&&(tri[i][1]==tri[j][2])) triangles i,j are neighbors
Добавить все комбинации ...
Если вам нужно только соседние точки, то найти все треугольники, содержащие, что точки и все остальные точки, используемые в этих треугольниках являются соседями
Чтобы загрузить STL в такой структуре сделать это:
- ясно
pnt[],tri[]
списки/таблицы
- процесс каждый треугольник СТЛ
для каждой точки треугольника
посмотреть, если он находится в pnt[]
если да использовать свой индекс для нового triangle
. если не добавить новый point
в pnt
и использовать его индекс для новых triangle
. Когда все 3 очка сделают, добавьте новый triangle
в tri
.
Повышение производительности pnt[]
Добавить индекс сортировки для pnt[]
отсортированные по любой координате, например x
и улучшить производительность проверки, если point
уже присутствует в pnt
.
Так при добавлении (xi,yi,zi)
в pnt[]
индекс Находят точки, которые имеют самый большой x
, который xi>=pnt[i0][0]
через бинарный поиск, а затем сканировать все точки в pnt
, пока x
крестов xi
так xi<pnt[i1][0]
таким образом, что вам не нужно, чтобы проверить все точки ,
Если это слишком медленно (как правило, если количество точек больше, то 40000) вы можете повысить производительность более по индексу сегмента сортировки (разделив индекс сортировки в сегменте страниц конечного размера, как 8192 точек)
Улучшение tri[]
производительность
вы также можете отсортировать tri[]
по tri[i][0]
, так что вы можете использовать бинарный поиск аналогично pnt[]
.
Что вы думаете о моем решении? 1- создать структуру Треугольника, которая содержит три точки с координатами x, y, z. 2- сделайте массив треугольников и обновите их, читая записи из файла stl. 3- используйте unordered_multimap и хеш-функцию для хэширования всех точек таблицы. 4- для каждого треугольника, хеш его точки P0, P1 и P2 и найти id других треугольников, которые хэшируются в одном месте в таблицах. 5- соседние треугольники - это те, которые имеют две общие точки в таблице. – Arash
@Arash, почти такой же, как мой подход, поэтому он должен работать. – Spektre