Skip to Content.
Sympa Menu

cgal-discuss - [cgal-discuss] Constructing a Nef_polyhedron_3 from a Polyhedron_3 vs reading from OFF file

Subject: CGAL users discussion list

List archive

[cgal-discuss] Constructing a Nef_polyhedron_3 from a Polyhedron_3 vs reading from OFF file


Chronological Thread 
  • From: Gard Spreemann <>
  • To:
  • Subject: [cgal-discuss] Constructing a Nef_polyhedron_3 from a Polyhedron_3 vs reading from OFF file
  • Date: Fri, 27 Sep 2024 09:00:56 +0200
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None ; spf=Pass ; spf=None
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:m4zbua/o29ahymvHIBNuk+C9I+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1f0Q==
  • Ironport-phdr: A9a23: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 SfdFFXsbGzrf9bBURepPORUkDDdOwZR6tjVTw==
  • Ironport-sdr: 66f65856_B/pU76QsbZW0NUYBFOcMAdQ/tCURqxKwpl/UGOXCUN7OJ+d ku5DOw5h7xCfgUZSEcHXZ0qcnGn/5s7MfTATKPg==

Hello list,

I'm seeing a behavioral difference between constructing a
Nef_polyhedron_3 from a Polyhedron_3, and reading the former directly
from an OFF file using one of the supplied IO methods. I'm sure this
boils down to a misunderstanding of mine, and I'm very grateful if
anyone has any insight on the matter.

Suppose we have two OFF files:

a.off:

OFF
5 5 10
-0.193282 0.100467 0.339231
-0.183855 0.102082 0.334972
-0.183473 0.103303 0.332011
-0.181318 0.104688 0.348585
0.000000 0.000000 0.000000
3 4 0 1
3 4 1 2
3 4 2 3
3 4 3 0
4 3 2 1 0

b.off:

OFF
8 6 12
1.0 0.0 1
0.0 1.0 1
-1.0 0.0 1
0.0 -1.0 1
1.0 0.0 0.0
0.0 1.0 0.0
-1.0 0.0 0.0
0.0 -1.0 0.0
4 0 1 2 3
4 7 4 0 3
4 4 5 1 0
4 5 6 2 1
4 3 2 6 7

Define for brevity's sake the following common.hpp:

#pragma once
#include <iostream>
#include <fstream>
#include <cassert>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/Nef_polyhedron_3.h>
#include <CGAL/IO/Polyhedron_OFF_iostream.h>
#include <CGAL/OFF_to_nef_3.h>
using Exact_kernel = CGAL::Exact_predicates_exact_constructions_kernel;
using Polyhedron = CGAL::Polyhedron_3<Exact_kernel>;
using Surface_mesh = CGAL::Surface_mesh<Exact_kernel::Point_3>;
using Nef_polyhedron = CGAL::Nef_polyhedron_3<Exact_kernel>;

The following code builds a `Nef_polyhedron_3` by reading an OFF file
directly:

#include "common.hpp"
int main(int argc, char ** argv)
{
Nef_polyhedron nef_poly;
std::ifstream is("test.off", std::ios::in);
CGAL::OFF_to_nef_3(is, nef_poly);
is.close();
return 0;
}

That code does what I would expect with both of the above OFF
files.

The following code, however, builds a Polyhedron_3 by reading an OFF
file, and then converts that Polyhedron_3 into a Nef_polyhedron_3. This
code does what I'd expect on b.off:

#include "common.hpp"
int main(int argc, char ** argv)
{
Polyhedron poly;
std::ifstream is("test.off", std::ios::in);
bool success = CGAL::IO::read_OFF(is, poly);
is.close();
assert(success);
assert(poly.is_valid());
assert(poly.is_closed());
Nef_polyhedron nef_poly(poly); // <--- X (see below).
return 0;
}

However, then the latter code is used with a.off, it crashes at the
point marked X due to a failed assertion:

terminate called after throwing an instance of 'CGAL::Assertion_exception'
what(): CGAL ERROR: assertion violation!
Expr: ss_circle.has_on(sp)
File: /usr/include/CGAL/Nef_3/polygon_mesh_to_nef_3.h
Line: 253


Can anyone help illuminate why I'm confused about these two snippets of
code not producing the same Nef_polyhedron_3?


Best,
Gard

Attachment: signature.asc
Description: PGP signature



  • [cgal-discuss] Constructing a Nef_polyhedron_3 from a Polyhedron_3 vs reading from OFF file, Gard Spreemann, 09/27/2024

Archive powered by MHonArc 2.6.19+.

Top of Page