CGAL Visibility 计算错误的可见性多边形(简单多边形可见性算法)
CGAL Visibility computes wrong visibility polygon (Simple Polygon Visibility algorithm)
我必须计算给定多边形的某些顶点的可见性多边形。我正在使用 CGALs 可见性计算库,但是对于 this example polygon and its 35th vertex (and a few more points), the following (obviously wrong) result 是计算的,其中可见性多边形的一条边与原始多边形的一条边相交。
我使用了以下代码进行构建:
typedef CGAL::Arrangement_2<CGAL::Arr_segment_traits_2<Epeck>> Arrangement_2;
Arrangement_2 polygon_arr;
CGAL::insert(polygon_arr, polygon.edges_begin(), polygon.edges_end());
Arrangement_2 vp_output;
CGAL::Simple_polygon_visibility_2<Arrangement_2, CGAL::Tag_false> non_regular_visibility(polygon_arr);
// ci is vertex circulator
Arrangement_2::Halfedge_const_handle preceding_he =
std::find_if(polygon_arr.halfedges_begin(),polygon_arr.halfedges_end(),
[&ci](const typename Arrangement_2::Halfedge &e) {
return !e.face()->is_unbounded() && e.target()->point() == *ci;
}
);
non_regular_visibility.compute_visibility(*ci, preceding_he, vp_output);
for (auto eit = vp_output.edges_begin(); eit != vp_output.edges_end(); ++eit)
{
segments.push_back(eit->curve());
}
这是 CGAL 实现中的错误还是我的代码中的错误?
编辑:
将算法更改为
CGAL::Triangular_expansion_visibility_2<Arrangement_2> tev(polygon_arr);
(l. 7) 解决了这个问题,所以它可能是 CGAL 中的一个错误。
你是对的,这是CGAL中的一个错误。我为此创建了一个问题:https://github.com/CGAL/cgal/issues/4289
我必须计算给定多边形的某些顶点的可见性多边形。我正在使用 CGALs 可见性计算库,但是对于 this example polygon and its 35th vertex (and a few more points), the following (obviously wrong) result 是计算的,其中可见性多边形的一条边与原始多边形的一条边相交。
我使用了以下代码进行构建:
typedef CGAL::Arrangement_2<CGAL::Arr_segment_traits_2<Epeck>> Arrangement_2;
Arrangement_2 polygon_arr;
CGAL::insert(polygon_arr, polygon.edges_begin(), polygon.edges_end());
Arrangement_2 vp_output;
CGAL::Simple_polygon_visibility_2<Arrangement_2, CGAL::Tag_false> non_regular_visibility(polygon_arr);
// ci is vertex circulator
Arrangement_2::Halfedge_const_handle preceding_he =
std::find_if(polygon_arr.halfedges_begin(),polygon_arr.halfedges_end(),
[&ci](const typename Arrangement_2::Halfedge &e) {
return !e.face()->is_unbounded() && e.target()->point() == *ci;
}
);
non_regular_visibility.compute_visibility(*ci, preceding_he, vp_output);
for (auto eit = vp_output.edges_begin(); eit != vp_output.edges_end(); ++eit)
{
segments.push_back(eit->curve());
}
这是 CGAL 实现中的错误还是我的代码中的错误?
编辑:
将算法更改为
CGAL::Triangular_expansion_visibility_2<Arrangement_2> tev(polygon_arr);
(l. 7) 解决了这个问题,所以它可能是 CGAL 中的一个错误。
你是对的,这是CGAL中的一个错误。我为此创建了一个问题:https://github.com/CGAL/cgal/issues/4289