Ошибка сегментации альфа-итератора CGAL (на примере 3D-формы альфа-формы) - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий код (находится внизу), и я пытаюсь скопировать пример Alpha Shape 3D, найденный на веб-сайте CGAL (https://doc.cgal.org/latest/Alpha_shapes_3/index.html)

Однако я получаю ошибку сегментации, которая исходит отэта строка (найдена с использованием gdb):

std::cout << "Optimal alpha value to get one connected component is " << *opt << std::endl;

Используемый набор данных был создан CGAL в формате OFF из данных XYZ. Его заголовок выглядит так:

./test.off

OFF
500 0 0
0.902989 -0.82769 -0.677893
0.822755 -0.402642 1.05875
1.33886 0.0517507 -0.405935
0.338283 0.0348648 -1.35807
0.0591201 -0.265762 -1.37327
0.188173 0.490894 1.29754
0.104928 0.512889 1.29844
0.639491 1.17839 -0.403047
-0.176474 0.134151 -1.38234
0.80777 0.0410059 -1.14273
-0.762083 0.370688 1.11437
0.903425 -1.06553 -0.0920476
-0.508653 -1.28935 0.197129

Я считаю, что должна быть проблема с экземпляром Alpha_iterator с именем opt, так как это единственная переменная, на которую указывают в этой строке.

Мой вопрос заключается в том, что вызывает ошибку сегментации иКак я должен изменить свой код, чтобы это больше не происходило?

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

#include <CGAL/Alpha_shape_3.h>
#include <CGAL/Alpha_shape_cell_base_3.h>
#include <CGAL/Alpha_shape_vertex_base_3.h>
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/Triangulation_data_structure_3.h>
#include <CGAL/Triangulation_utils_3.h>

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

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;

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

    // read input
    std::ifstream is("./test.off");
    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());
    std::cout << "Alpha shape computed in REGULARIZED mode by default" 
<< std::endl;

    // 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);

    return 0;
}
...