Я ищу, чтобы найти все вершины, которые можно увидеть из заданной точки на многоугольнике.
Например, у меня есть следующий многоугольник:
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;
Что означает, что лицо не ограничено? Любая помощь, исправляющая это было бы замечательно.