Я пытаюсь определить точку внутри многогранника, импортированного из файла STereoLithography (.stl). Мне интересно, существует ли еще C++ решение/библиотека, которая решает эту проблему.
Я хочу избежать обхода решения Matlab
Теория проблемы несколько проста, когда вы идете от точки к внешней стороне, вам нужно будет пройти нечетное количество облицовок (треугольников).
Некоторые псевдокоды
Vector3d toOutside { point, pointOutside }; // !!! how do we know a point is outside ?!?
for_each(triangleList, [&count, =toOutside](Triangle& triangle) {
if (Intersect(triangle, toOutside) // some fussiness with edges and triangle points.
++count;
}
if (count %2 == 1)
isInside = true;
else
isOutside = false;
Найдя точку вне многогранника, найдите самые высокие x, y, z и добавьте 1.0 к ним.
Pseudo prof [ToDo: ссылка на статью с более жестким профи]
Простой случай ящик, если мы находимся внутри коробки, будет одно пересечение с стороной, если мы будем следовать за вектором toOutside. Если мы находимся внутри многогранника, то, если мы пройдем через треугольник, мы будем снаружи, если мы пройдем через 2 треугольника больше (в и из), мы все еще можем сказать, что мы были внутри. Если бы мы на самом деле находились вне многогранника, мы пройдем через и даже число треугольников (или ноль), следуя вектору toOutside.
Реализация C++ в geometrictools выглядит под mathematics-> сдерживанием-> point-in-polyhedron-> 3D для файлов.h и.inl.
Могут быть некоторые более оптимизированные тесты, которые используют обычный вектор для внешнего.
Кроме того, если у вас есть несколько объектов, с которыми вам нужно протестировать, подумайте о том, чтобы создать ограничительную рамку для каждого из них для отбраковки, поскольку векторные тесты могут быть дорогими.
std::vector
которое содержит точки, образующие многогранник, и вы хотите сказать, находится ли точка внутри или снаружи многогранника? В стандартном C ++ нет функции для этого, но я уверен, что доступны пакеты геометрии, которые делают такие вещи. Или можно написать небольшой кусочек кода, чтобы определить такую вещь ...