Создание 3D Альфа-форм в CGAL и визуализация

Я новый пользователь CGAL с базовым опытом работы с C ++, пытаюсь найти формы 3D Alpha набора точек. Я использую ex_alpha_shapes_3 пример кода, а затем с помощью инструкций в сохранение CGAL альфа-формы поверхности сетки для визуализации результатов. Кажется, все работает правильно, но когда я пытаюсь изменить значение альфа, заменив

    Alpha_shape_3 as(lp.begin(),lp.end());

с

    Alpha_shape_3 as(lp.begin(),lp.end(),1, Alpha_shape_3::GENERAL);

Предполагая, что третья переменная является значением альфа (= 1), и изменяйте это значение каждый раз, никаких изменений в результатах не получается.

Более конкретно, в моем наборе частиц некоторые отделены от большинства, и я хотел бы представить их в отдельных томах (аналогично Рисунок 41.1) используя вогнутый корпус или альфа-формы. В настоящее время я получаю (используя Tecplot для визуализации):
введите описание изображения здесь
и, как вы можете видеть, отделенные частицы связаны с другими частицами. Я также прилагаю свой код, в конце. Буду признателен за любую помощь по этому вопросу.

    #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/Alpha_shape_3.h>

#include <iostream>
#include <fstream>
#include <list>
#include <cassert>

typedef CGAL::Exact_predicates_inexact_constructions_kernel Gt;

typedef CGAL::Alpha_shape_vertex_base_3<Gt>          Vb;
typedef CGAL::Alpha_shape_cell_base_3<Gt>            Fb;
typedef CGAL::Triangulation_data_structure_3<Vb,Fb>  Tds;
typedef CGAL::Delaunay_triangulation_3<Gt,Tds>       Triangulation_3;
typedef CGAL::Alpha_shape_3<Triangulation_3>         Alpha_shape_3;

typedef Gt::Point_3                                  Point;
typedef Alpha_shape_3::Alpha_iterator               Alpha_iterator;

using namespace std;

int main()
{
std::list<Point> lp;

//read input
std::ifstream is("./data/finalwater4.dat");
int n;
is >> n;
std::cout << "Reading " << n << " points " << std::endl;
Point p;
for( ; n>0 ; n--)    {
is >> p;
lp.push_back(p);
}

// compute alpha shape
//  Alpha_shape_3 as(lp.begin(),lp.end());
Alpha_shape_3 as(lp.begin(),lp.end(),0.001, Alpha_shape_3::GENERAL);

// find optimal alpha value
Alpha_iterator opt = as.find_optimal_alpha(1);
std::cout << "Optimal alpha value to get one connected component is "<<  *opt    << std::endl;
as.set_alpha(*opt);
assert(as.number_of_solid_components() == 1);

/// the rest of the code, prepares the output to be written into a file

/// collect all regular facets (fetch regular facets from as and inserts in facets)
std::vector<Alpha_shape_3::Facet> facets;
as.get_alpha_shape_facets(std::back_inserter(facets), Alpha_shape_3::REGULAR);

std::stringstream pts;
std::stringstream ind;

std::size_t nbf=facets.size();
for (std::size_t i=0;i<nbf;++i)
{
//To have a consistent orientation of the facet, always consider an exterior cell
if ( as.classify( facets[i].first )!=Alpha_shape_3::EXTERIOR )
facets[i]=as.mirror_facet( facets[i] );
CGAL_assertion(  as.classify( facets[i].first )==Alpha_shape_3::EXTERIOR  );

int indices[3]={
(facets[i].second+1)%4,
(facets[i].second+2)%4,
(facets[i].second+3)%4,
};

/// according to the encoding of vertex indices, this is needed to get
/// a consistent orienation
if ( facets[i].second%2==0 ) std::swap(indices[0], indices[1]);pts <<
facets[i].first->vertex(indices[0])->point() << "\n" <<
facets[i].first->vertex(indices[1])->point() << "\n" <<
facets[i].first->vertex(indices[2])->point() << "\n";
ind << 3*i+1 << " " << 3*i+2 << " " << 3*i+3 << "\n";
}

ofstream myfile;
myfile.open ("output.dat");
myfile << "variables = x, y, z\n";
myfile << "zone n="<< 3*nbf << " , e=" << nbf << " , f=fepoint, et=triangle\n";
myfile << pts.str();
myfile << ind.str();
myfile.close();

return 0;
}

1

Решение

Если вы хотите отфильтровать вещи, вам нужно принять альфа-форму со значением, меньшим, чем значение, возвращаемое as.find_optimal_alpha (1). Я предлагаю запустить демонстрацию альфа-формы, в которой есть слайдер, который будет отображать, как выглядит альфа-форма, в зависимости от значения альфа. Входной файл должен иметь расширение .pts и должен содержать количество точек, за которыми следуют координаты точек.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector