измените представление сетки на таблицу точек и таблицу граней треугольника. 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[]
списков/таблиц
обработать каждый треугольник STL
для каждой точки треугольника
посмотрите, находится ли он в 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[]
.
person
Spektre
schedule
10.02.2017