CGAL вершина видимости - PullRequest
0 голосов
/ 24 мая 2019

Я ищу, чтобы найти все вершины, которые можно увидеть из заданной точки на многоугольнике.

Например, у меня есть следующий многоугольник:

Polygon_2(
  PointC2(2396, 5284)
  PointC2(2656, 2938)
  PointC2(4342, 102)
  PointC2(4120, 2278)
  PointC2(4384, 2988)
  PointC2(5136, 2280)
  PointC2(8598, 2632)
  PointC2(11738, 1550)
  PointC2(8898, 4170)
  PointC2(6634, 5416)
)

и я хочу знать, какие вершины может видеть точка PointC2(4342, 102).

Глядя на CGAL, я увидел Visability_2 , которую я пытался реализовать, но у меня есть две основные проблемы.

1) Когда я запускаю свою программу, я получаю следующую ошибку

Ошибка CGAL: нарушение утверждения!

Выражение:! Face-> is_unbounded ()

2) Если я выберу точку в моем многоугольнике в качестве точки для проверки видимости, я получу segmentation fault.

Вот код, который я пробовал (взято в основном из примера по ссылке, указанной выше):

    auto poly_it = polygon.vertices_begin();

    std::vector<Segment_2> segments;
    while(poly_it != polygon.vertices_end()) {
        if (poly_it+1 ==  polygon.vertices_end()) {
            segments.push_back(
                Segment_2(
                    *poly_it, 
                    *polygon.vertices_begin()
            ));
            break;
        }
        else
        {
            segments.push_back(
                Segment_2(
                    *poly_it, 
                    *(++poly_it)
            ));
        }
    }

    for(auto v : segments) std::cout << v << "\n";

    Point_2 start, pocket_begin, pocket_end;

    // Find beginning point

    poly_it = polygon.vertices_begin();
    for(; unordered_hull.find(start) != unordered_hull.end(); poly_it++) {}
    start = *poly_it;
    pocket_begin = start;

    Arrangement_2 env;

    CGAL::insert_non_intersecting_curves(env, segments.begin(), segments.end());

    Point_2 q(8898, 4170);   

    Arrangement_2::Face_const_handle * face;
    CGAL::Arr_naive_point_location<Arrangement_2> pl(env);
    CGAL::Arr_point_location_result<Arrangement_2>::Type obj = pl.locate(q);
    // The query point locates in the interior of a face
    face = boost::get<Arrangement_2::Face_const_handle> (&obj);

    // compute non regularized visibility area 
    // Define visibiliy object type that computes regularized visibility area
    Arrangement_2 regular_output;
    RSPV regular_visibility(env);
    regular_visibility.compute_visibility(q, *face, regular_output);
    std::cout << "Regularized visibility region of q has "
                << regular_output.number_of_edges()
                << " edges:" << std::endl;
    for (Edge_const_iterator eit = regular_output.edges_begin(); eit != regular_output.edges_end(); ++eit)
        std::cout << "[" << eit->source()->point() << " -> " << eit->target()->point() << "]" << std::endl;

Что означает, что лицо не ограничено? Любая помощь, исправляющая это было бы замечательно.

...