Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] bug in boolean operations

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] bug in boolean operations


Chronological Thread 
  • From: Peter Hachenberger <>
  • To:
  • Subject: Re: [cgal-discuss] bug in boolean operations
  • Date: Fri, 20 Jul 2007 14:25:41 +0200

Hi Isabel,

the operation takes a lot of time since you use the OFF_to_nef_3
function, which tries to convert every OFF file no matter how
problematic it is. This function is not designed for efficiency but for
robustness (I improved the efficiency of the function recently and will
put it in CGAL-3.3.1). Try to use

Polyhedron_3 P;
std::cin >> P;
Nef_polyhedron N(P);

This function is much faster, but has some restrictions on the input. If
you have problems with these restrictions, I might can help you get
around these problems.

I looked at cubeminclyinder.off in my viewer. It looks fine to me. Can
you be more specific about what you think is wrong with it?

Peter

On Fri, 2007-07-20 at 11:20 +0200, Isabel wrote:
> Hi all.
> I think that I find a bug in boolean operation,
> the difference of a cube and a cylinder is not correct. There are
> facets in holes. See 'cubemincylinder.off'
> I convert to Nef_Polyhedron_3 my two polyhedrons, a cube and a
> cylinder. This operation spend a lot of time.
>
> this is the code:
> typedef CGAL::Homogeneous<CGAL::Gmpz> Kernel;
>
> typedef CGAL::Nef_polyhedron_3<Kernel> Nef_3;
>
> typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
>
> typedef Kernel::Point_3 Point;
>
> typedef Kernel::Vector_3 Vector;
>
> typedef Polyhedron::Vertex_iterator Vertex_iterator;
>
> typedef Polyhedron::Facet_iterator Facet_iterator;
>
> typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron;
>
>
>
> int main( int argc, char **argv) {
>
> Polyhedron P1, P2, P;
>
> const char* name = "cin";
>
> istream* p_in1 = &cin;
>
> istream* p_in2 = &cin;
>
> ifstream in1, in2;
>
> in1.open( ".\\cube.off");
>
> p_in1 = &in1;
>
> Nef_3 N1;
>
> std::size_t discarded = CGAL::OFF_to_nef_3 ( *p_in1, N1, true);
>
> in2.open( ".\\cylinder.off");
>
> p_in2 = &in2;
>
> Nef_3 N2;
>
> discarded = CGAL::OFF_to_nef_3 ( *p_in2, N2, true);
>
> Nef_3 N3;
>
> std::cout << "boolean operation in NEF3..." << std::endl;
>
> N3 = N1 - N2;
>
> std::cout << "Convert to polyhedron..." << std::endl;
>
> if(N3.is_simple()) {
>
> N3.convert_to_Polyhedron(P);
>
> std::cout << N3;
>
> const char* oname = "cout";
>
> ostream* p_out = &cout;
>
> ofstream out;
>
> out.open( "cubemincylinder.off");
>
> p_out = &out;
>
> CGAL::set_ascii_mode( *p_out);
>
> (*p_out) << P;
>
> }
>
> else {
>
> std::cout << N3;
>
> }
>
> return 0;
>
> }
>
> Thanks Isabel
>
>



Archive powered by MHonArc 2.6.16.

Top of Page