mirror of https://github.com/CGAL/cgal
add an example showing a bug in the incremental builder.
This commit is contained in:
parent
6a06ae7182
commit
f959e22291
|
|
@ -0,0 +1,100 @@
|
||||||
|
#include <CGAL/Simple_cartesian.h>
|
||||||
|
#include <CGAL/Polyhedron_3.h>
|
||||||
|
#include <CGAL/Polyhedron_incremental_builder_3.h>
|
||||||
|
#include <CGAL/IO/Polyhedron_iostream.h>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
typedef CGAL::Simple_cartesian<double> K;
|
||||||
|
typedef CGAL::Polyhedron_3<K> Polyhedron;
|
||||||
|
typedef Polyhedron::HalfedgeDS HDS;
|
||||||
|
typedef CGAL::Polyhedron_incremental_builder_3<HDS> Builder;
|
||||||
|
typedef CGAL::HalfedgeDS_decorator<HDS> Decorator;
|
||||||
|
typedef HDS::Vertex::Base VBase;
|
||||||
|
struct Appender : public CGAL::Modifier_base<HDS>
|
||||||
|
{
|
||||||
|
void operator()(HDS& hds)
|
||||||
|
{
|
||||||
|
Builder B(hds);
|
||||||
|
B.begin_surface(1,1,4,Builder::ABSOLUTE_INDEXING);
|
||||||
|
B.add_vertex( K::Point_3(2,2,0) );
|
||||||
|
B.begin_facet();
|
||||||
|
B.add_vertex_to_facet(3);
|
||||||
|
B.add_vertex_to_facet(4);
|
||||||
|
B.add_vertex_to_facet(6);
|
||||||
|
B.end_facet();
|
||||||
|
B.end_surface();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
We start with this configuration:
|
||||||
|
0---3---4
|
||||||
|
|\ |\ |
|
||||||
|
| \ | \ |
|
||||||
|
| \| \|
|
||||||
|
1---2---5
|
||||||
|
|
||||||
|
Then we update a the halfedge pointer of vertices
|
||||||
|
3 and 4 so that the halfedges are on the boundary.
|
||||||
|
We append a new facet to get the following:
|
||||||
|
6
|
||||||
|
/|
|
||||||
|
/ |
|
||||||
|
/ |
|
||||||
|
0---3---4
|
||||||
|
|\ |\ |
|
||||||
|
| \ | \ |
|
||||||
|
| \| \|
|
||||||
|
1---2---5
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "\
|
||||||
|
OFF\n6 4 0\n\
|
||||||
|
0 1 0\n\
|
||||||
|
0 0 0\n\
|
||||||
|
1 0 0\n\
|
||||||
|
1 1 0\n\
|
||||||
|
2 1 0\n\
|
||||||
|
2 0 0\n\
|
||||||
|
3 0 1 2\n\
|
||||||
|
3 0 2 3\n\
|
||||||
|
3 2 5 3\n\
|
||||||
|
3 5 4 3\n";
|
||||||
|
|
||||||
|
Polyhedron P;
|
||||||
|
ss >> P;
|
||||||
|
|
||||||
|
assert( P.size_of_vertices() == 6);
|
||||||
|
assert( P.size_of_facets() == 4);
|
||||||
|
assert( P.is_valid() );
|
||||||
|
|
||||||
|
//consider vertex 3 and set its halfedge to be on the border
|
||||||
|
Polyhedron::Vertex_iterator vit=P.vertices_begin();
|
||||||
|
std::advance(vit, 3);
|
||||||
|
assert( vit->point() == K::Point_3(1, 1, 0) );
|
||||||
|
Polyhedron::Halfedge_handle h=vit->halfedge();
|
||||||
|
while ( !h->is_border() )
|
||||||
|
h=h->next()->opposite();
|
||||||
|
vit->VBase::set_halfedge(h);
|
||||||
|
assert( vit->halfedge()->vertex() == vit );
|
||||||
|
|
||||||
|
//consider vertex 4 and set its halfedge to be on the border
|
||||||
|
++vit;
|
||||||
|
assert( vit->point() == K::Point_3(2, 1, 0) );
|
||||||
|
h=vit->halfedge();
|
||||||
|
while ( !h->is_border() )
|
||||||
|
h=h->next()->opposite();
|
||||||
|
vit->VBase::set_halfedge(h);
|
||||||
|
assert( vit->halfedge()->vertex() == vit );
|
||||||
|
|
||||||
|
//try to append a facet
|
||||||
|
Appender modifier;
|
||||||
|
P.delegate(modifier);
|
||||||
|
|
||||||
|
assert( P.size_of_vertices() == 7);
|
||||||
|
assert( P.size_of_facets() == 5);
|
||||||
|
assert( P.is_valid() );
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue