Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] Joining faces in polyhedron

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] Joining faces in polyhedron


Chronological Thread 
  • From: Andreas Fabri <>
  • To:
  • Subject: Re: [cgal-discuss] Joining faces in polyhedron
  • Date: Wed, 06 May 2009 17:52:44 +0200

Hi Joel,

You must make a copy of the iterator, increment it and then work on the copy
in the body of the loop.
This is because the halfedges are in an in-place list, your join operation
removes them and the iterator
no longer points on something reasonable

for ( Halfedge_iterator j = polyhedron.halfedges_begin(); j !=
polyhedron.halfedges_end(); ){
Halfedge_iterator i = j;
++j;
// and now your code again
.
.
}


I think you have even to increment j twice, as the twin halfedges are stored
consecutively.
Alternatively you should use an Edge_iterator.


andreas



wrote:
Hi!

I am trying to convert a triangle mesh to a polyhedron, i.e. I want to join
all faces which are adjacent and have the same normal

As an easy example I chose a flat patch consisting of triangles in .off
format. As a result I want to have a polyhedron consisting of a single
polygon.

I was able to load the file, but the follwoing did not work:

for ( Halfedge_iterator i = polyhedron.halfedges_begin(); i != polyhedron.halfedges_end(); ++i) {
if( i->is_border_edge() )
continue;

Polyhedron::Facet_handle f1 = i->facet();
Polyhedron::Facet_handle f2 = i->opposite()->facet();
Halfedge_handle he1 = f1->halfedge();
Point_3 p0 = he1->vertex()->point();
Point_3 p1 = he1->next()->vertex()->point();
Point_3 p2 = he1->next()->next()->vertex()->point();
Kernel::Vector_3 n_i = CGAL::cross_product(p0-p2, p1-p2);
n_i = n_i / sqrt(n_i.squared_length());

Halfedge_handle he2 = f2->halfedge();
p0 = he2->vertex()->point();
p1 = he2->next()->vertex()->point();
p2 = he2->next()->next()->vertex()->point();

Kernel::Vector_3 n_j = CGAL::cross_product(p0-p2, p1-p2);
n_j = n_j / sqrt(n_j.squared_length());

if(n_i == n_j)
{
if( circulator_size(i->opposite()->vertex_begin()) >= 3 &&
circulator_size(i->vertex_begin()) >= 3 )
polyhedron.join_facet(i);
}
}

There seem to be 2 problems: - after joining to faces the iterator becomes invalid
- some faces cannot be joined, but why and how can I change that?

Can anyone help me please?

Have a nice day,
Joel




Archive powered by MHonArc 2.6.16.

Top of Page