mirror of https://github.com/CGAL/cgal
Merge pull request #2688 from lrineau/Convex_hull_3-fix_quickhull_in_coplanar_case-GF
Fix Convex_hull_3 quickhull, with coplanar point
This commit is contained in:
commit
c4a7adcd5b
|
|
@ -315,13 +315,26 @@ void coplanar_3_hull(InputIterator first, InputIterator beyond,
|
||||||
|
|
||||||
typename boost::property_map<Polyhedron_3, CGAL::vertex_point_t>::type vpm
|
typename boost::property_map<Polyhedron_3, CGAL::vertex_point_t>::type vpm
|
||||||
= get(CGAL::vertex_point, P);
|
= get(CGAL::vertex_point, P);
|
||||||
std::vector<typename boost::graph_traits<Polyhedron_3>::vertex_descriptor> vertices;
|
typedef boost::graph_traits<Polyhedron_3> Graph_traits;
|
||||||
|
typedef typename Graph_traits::vertex_descriptor vertex_descriptor;
|
||||||
|
typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor;
|
||||||
|
typedef typename Graph_traits::face_descriptor face_descriptor;
|
||||||
|
std::vector<vertex_descriptor> vertices;
|
||||||
vertices.reserve(CH_2.size());
|
vertices.reserve(CH_2.size());
|
||||||
BOOST_FOREACH(const Point_3& p, CH_2){
|
BOOST_FOREACH(const Point_3& p, CH_2){
|
||||||
vertices.push_back(add_vertex(P));
|
vertices.push_back(add_vertex(P));
|
||||||
put(vpm, vertices.back(),p);
|
put(vpm, vertices.back(),p);
|
||||||
}
|
}
|
||||||
Euler::add_face(vertices, P);
|
face_descriptor f = Euler::add_face(vertices, P);
|
||||||
|
|
||||||
|
// Then triangulate that face
|
||||||
|
const halfedge_descriptor he = halfedge(f, P);
|
||||||
|
halfedge_descriptor other_he = next(next(he, P), P);
|
||||||
|
for(std::size_t i = 3, end = vertices.size(); i < end; ++i) {
|
||||||
|
const halfedge_descriptor next_he = next(other_he, P);
|
||||||
|
Euler::split_face(other_he, he, P);
|
||||||
|
other_he = next_he;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,22 @@ void test_small_hull()
|
||||||
polyhedron2.size_of_facets() == 6 );
|
polyhedron2.size_of_facets() == 6 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_coplanar_hull()
|
||||||
|
{
|
||||||
|
std::vector<Point_3> points;
|
||||||
|
points.push_back(Point_3(0,0,0));
|
||||||
|
points.push_back(Point_3(1,0,0));
|
||||||
|
points.push_back(Point_3(0,1,0));
|
||||||
|
points.push_back(Point_3(1,1,0));
|
||||||
|
points.push_back(Point_3(1.5,0.5,0));
|
||||||
|
points.push_back(Point_3(0.5,1.1,0));
|
||||||
|
Polyhedron_3 polyhedron;
|
||||||
|
CGAL::convex_hull_3(points.begin(), points.end(), polyhedron, Traits());
|
||||||
|
assert( polyhedron.is_valid() );
|
||||||
|
assert( polyhedron.size_of_facets() == 4 );
|
||||||
|
assert( polyhedron.is_pure_triangle() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
|
@ -115,6 +131,8 @@ int main()
|
||||||
test_tetrahedron_convexity();
|
test_tetrahedron_convexity();
|
||||||
std::cerr << "Testing small hull" << std::endl;
|
std::cerr << "Testing small hull" << std::endl;
|
||||||
test_small_hull();
|
test_small_hull();
|
||||||
|
std::cerr << "Testing coplanar hull" << std::endl;
|
||||||
|
test_coplanar_hull();
|
||||||
|
|
||||||
std::cerr << "Testing 500 random points" << std::endl;
|
std::cerr << "Testing 500 random points" << std::endl;
|
||||||
std::vector<Point_3> points;
|
std::vector<Point_3> points;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue