2015-10-18 6 views
0

Я использую cgal для оценки научно-технических данных (поверхность многогранника, массовая доля, доля пустот, ...).Создание параметризованных 3D-примитивов с помощью cgal

I preforme boolean операции, чтобы вырезать объемы измерений (subvolume, где я хочу усреднить данные). В этом специальном случае это цилиндр. К настоящему времени я прочитаю общий цилиндр из файла STL и преобразую его в необходимый размер и положение. Это не очень элегантно. Например, невозможно настроить разрешение триангуляции поверхности.

Гораздо лучше (более общий подход) заключается в том, чтобы генерировать объем зонда во время выполнения. У cgal есть модуль для создания 3D-примитивов? Я не мог найти что-то подобное в документации.

Я совершенно новичок в cgal и немного смущен этими документами. Поэтому вполне возможно, что я кое-что упустил.

Было бы очень приятно, если бы кто-нибудь мог дать мне подсказку о том, как начать решение этой проблемы!

Заранее благодарен!

ответ

0

Для всех WHOS пытается что-то подобное здесь мое решение: резюме

#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 представления (необходимое для логических операций)

Там может быть лучшим решением. Если кто-то знает, как выполнить эту задачу более элегантно, пожалуйста, дайте мне знать.

Смежные вопросы