Я создаю конвертер CAD-файлов поверх двух библиотек (Opencascade и DWF Toolkit).
Однако, мой вопрос не зависит от платформы:
Дано:
Я сгенерировал сетку, поскольку список треугольных граней образует модель, построенную через мое приложение. Каждый треугольник определяется тремя вершинами, которые состоят из трех чисел с плавающей точкой (координаты x, y и z). Поскольку треугольники образуют сетку, большинство вершин разделены более чем одним треугольником.
Цель:
Мне нужно найти список уникальных вершин и сгенерировать массив граней, состоящий из кортежей из трех индексов в этом списке.
Что я хочу сделать, это:
//step 1: build a list of unique vertices
for each triangle
for each vertex in triangle
if not vertex in listOfVertices
Add vertex to listOfVertices
//step 2: build a list of faces
for each triangle
for each vertex in triangle
Get Vertex Index From listOfvertices
AddToMap(vertex Index, triangle)
Хотя у меня есть реализация, которая делает это, шаг 1 (генерация списка уникальных вершин) действительно медленный в порядке O (n!), Поскольку каждая вершина сравнивается со всеми вершинами, уже имеющимися в списке. Я подумал: «Эй, давайте создадим хэш-карту компонентов моих вершин, используя std :: map, что должно ускорить процесс!», Только чтобы обнаружить, что генерирование уникального ключа из трех значений с плавающей запятой не является тривиальной задачей.
Здесь в игру вступают эксперты stackoverflow: мне нужна какая-то хеш-функция, которая работает с 3 числами с плавающей запятой, или любая другая функция, генерирующая уникальное значение из позиции 3d-вершины.