Я использую cgal для оценки научных данных (поверхность многогранника, массовая доля, доля пустот, …).
Я выполняю логические операции, чтобы вырезать объемы измерений (подобъем, где я хочу усреднить данные). В этом особом случае это цилиндр. Теперь я прочитаю общий цилиндр из файла STL и преобразую его в нужный размер и положение. Это не очень элегантно. Например, невозможно настроить разрешение триангуляции поверхности.
Гораздо лучше (более общий подход) было бы генерировать объем моего зонда во время выполнения. Есть ли у cgal модуль для создания 3D примитивов? Я не мог найти что-то подобное в документации.
Я совершенно новичок в cgal и немного смущен этими документами. Так что вполне возможно, что я что-то упустил.
Было бы очень хорошо, если бы кто-нибудь дал мне подсказку о том, как начать решать эту проблему!
Заранее спасибо!
Для всех, кто пробует что-то подобное, вот мое решение:
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Nef_polyhedron_3.h>
#include <CGAL/convex_hull_3.h>
Nef_polyhedron_3 create_probe_cylinder(unsigned int argNum_segments, double argRadius, double argZmin, double argZmax)
{
std::vector<Point_3> probecylinder_points;
double x, y;
for (unsigned int point_index = 0; point_index < argNum_segments; point_index++)
{
x = argRadius*cos(2*M_PI*point_index/argNum_segments);
y = argRadius*sin(2*M_PI*point_index/argNum_segments);;
Point_3 point_bot(x,y, argZmin);
Point_3 point_top(x,y, argZmax);
probecylinder_points.push_back(point_bot);
probecylinder_points.push_back(point_top);
}
std::cout << "creating convex hull.." << std::endl;
Polyhedron_3 poly_cylinder;
CGAL::convex_hull_3(probecylinder_points.begin(), probecylinder_points.end(), poly_cylinder);
std::cout << "converting to nef poly.." << std::endl;
Nef_polyhedron_3 nef_cylinder(poly_cylinder);
return nef_cylinder;
}
Краткое содержание кода:
1) создать список точек (обод снизу / сверху). argNum_segments устанавливает разрешение цилиндра (количество сегментов)
2) создать выпуклую оболочку из списка точек
3) преобразовать многогранник в представление nef (необходимо для логических операций)
Там может быть лучшее решение. Если кто-то знает, как выполнить эту задачу более элегантно, пожалуйста, дайте мне знать.
Других решений пока нет …