Fix a runtime error. The `Intersect_3` functor of
`Robust_intersection_traits_3_new` was ignored cases in the intersection
between a segment and a triangle.

In `ts_intersection`, if one of the extremities of the segment was
coplanar with the triangle, the empty object was always returned.

This bug of mines was introduced in CGAL-4.3 by
56d733b254.

(Fix #1554.)
This commit is contained in:
Laurent Rineau 2016-10-10 17:34:37 +02:00
parent 02b22f216e
commit 0f4661087b
5 changed files with 473 additions and 3 deletions

View File

@ -326,7 +326,19 @@ ts_intersection(const typename K::Triangle_3 &t,
return result_type(); return result_type();
default: // coplanar default: // coplanar
return result_type(); // q belongs to the triangle's supporting plane
// p sees the triangle in counterclockwise order
if(orientation(p,q,a,b) != POSITIVE
&& orientation(p,q,b,c) != POSITIVE
&& orientation(p,q,c,a) != POSITIVE)
{
#if CGAL_INTERSECTION_VERSION > 1
return result_type(q);
#else
return make_object(q);
#endif
}
else return result_type();
} }
case NEGATIVE: case NEGATIVE:
switch ( abcq ) { switch ( abcq ) {
@ -352,10 +364,59 @@ ts_intersection(const typename K::Triangle_3 &t,
return result_type(); return result_type();
default: // coplanar default: // coplanar
return result_type(); // q belongs to the triangle's supporting plane
// p sees the triangle in clockwise order
if(orientation(q,p,a,b) != POSITIVE
&& orientation(q,p,b,c) != POSITIVE
&& orientation(q,p,c,a) != POSITIVE)
{
#if CGAL_INTERSECTION_VERSION > 1
return result_type(q);
#else
return make_object(q);
#endif
}
else return result_type();
} }
default: // coplanar default: // coplanar
return result_type(); switch ( abcq ) {
case POSITIVE:
// q sees the triangle in counterclockwise order
if(orientation(q,p,a,b) != POSITIVE
&& orientation(q,p,b,c) != POSITIVE
&& orientation(q,p,c,a) != POSITIVE)
{
#if CGAL_INTERSECTION_VERSION > 1
return result_type(p);
#else
return make_object(p);
#endif
}
case NEGATIVE:
// q sees the triangle in clockwise order
if(orientation(p,q,a,b) != POSITIVE
&& orientation(p,q,b,c) != POSITIVE
&& orientation(p,q,c,a) != POSITIVE)
{
#if CGAL_INTERSECTION_VERSION > 1
return result_type(p);
#else
return make_object(p);
#endif
}
case COPLANAR:
// the segment is coplanar with the triangle's supporting plane
// we test whether the segment intersects the triangle in the common
// supporting plane
//
// Laurent Rineau, 2016/10/10: this case is purposely ignored by
// Mesh_3, because if the intersection is not a point, it is
// ignored anyway.
return result_type();
default: // should not happen.
CGAL_kernel_assertion(false);
return result_type();
}
} }
} }

View File

@ -53,6 +53,7 @@ if ( CGAL_FOUND )
create_single_source_cgal_program( "test_robust_weighted_circumcenter.cpp" ) create_single_source_cgal_program( "test_robust_weighted_circumcenter.cpp" )
create_single_source_cgal_program( "test_meshing_determinism.cpp" ) create_single_source_cgal_program( "test_meshing_determinism.cpp" )
create_single_source_cgal_program( "test_c3t3_extract_subdomains_boundaries.cpp" ) create_single_source_cgal_program( "test_c3t3_extract_subdomains_boundaries.cpp" )
create_single_source_cgal_program( "test_mesh_3_issue_1554.cpp" )
else() else()

View File

@ -0,0 +1,314 @@
OFF
106 204 0
-0.33300000000000002 0.104 0.16700000000000001
-0.33300000000000002 -0.036999999999999998 0.20799999999999999
-0.33300000000000002 -0.036999999999999998 0.16700000000000001
-0.28699999999999998 -0.16500000000000001 0.29199999999999998
-0.27100000000000002 -0.16700000000000001 0.29199999999999998
-0.27100000000000002 -0.16700000000000001 0.20799999999999999
-0.28699999999999998 -0.16500000000000001 0.20799999999999999
-0.30199999999999999 -0.158 0.29199999999999998
-0.30199999999999999 -0.158 0.20799999999999999
-0.315 -0.14799999999999999 0.29199999999999998
-0.315 -0.14799999999999999 0.20799999999999999
-0.32500000000000001 -0.13500000000000001 0.29199999999999998
-0.32500000000000001 -0.13500000000000001 0.20799999999999999
-0.33100000000000002 -0.12 0.29199999999999998
-0.33300000000000002 -0.104 0.29199999999999998
-0.33100000000000002 -0.12 0.20799999999999999
-0.33300000000000002 -0.104 0.20799999999999999
-0.33300000000000002 0.104 0.29199999999999998
-0.33100000000000002 0.12 0.29199999999999998
-0.33100000000000002 0.12 0.16700000000000001
-0.32500000000000001 0.13500000000000001 0.29199999999999998
-0.32500000000000001 0.13500000000000001 0.16700000000000001
-0.315 0.14799999999999999 0.16700000000000001
-0.315 0.14799999999999999 0.29199999999999998
-0.30199999999999999 0.158 0.29199999999999998
-0.30199999999999999 0.158 0.16700000000000001
-0.28699999999999998 0.16500000000000001 0.16700000000000001
-0.28699999999999998 0.16500000000000001 0.29199999999999998
-0.27100000000000002 0.16700000000000001 0.29199999999999998
0.12 0.16700000000000001 0.20799999999999999
-0.27100000000000002 0.16700000000000001 0.16700000000000001
0.12 0.16700000000000001 0.16700000000000001
0.27100000000000002 0.16700000000000001 0.29199999999999998
0.27100000000000002 0.16700000000000001 0.20799999999999999
0.28699999999999998 0.16500000000000001 0.29199999999999998
0.28699999999999998 0.16500000000000001 0.20799999999999999
0.30199999999999999 0.158 0.29199999999999998
0.30199999999999999 0.158 0.20799999999999999
0.315 0.14799999999999999 0.29199999999999998
0.315 0.14799999999999999 0.20799999999999999
0.32500000000000001 0.13500000000000001 0.29199999999999998
0.32500000000000001 0.13500000000000001 0.20799999999999999
0.33100000000000002 0.12 0.29199999999999998
0.33100000000000002 0.12 0.20799999999999999
0.33300000000000002 0.104 0.29199999999999998
0.33300000000000002 0.104 0.20799999999999999
0.33300000000000002 -0.104 0.20799999999999999
0.33300000000000002 -0.104 0.29199999999999998
0.33100000000000002 -0.12 0.20799999999999999
0.33100000000000002 -0.12 0.29199999999999998
0.32500000000000001 -0.13500000000000001 0.20799999999999999
0.32500000000000001 -0.13500000000000001 0.29199999999999998
0.315 -0.14799999999999999 0.29199999999999998
0.315 -0.14799999999999999 0.20799999999999999
0.30199999999999999 -0.158 0.29199999999999998
0.30199999999999999 -0.158 0.20799999999999999
0.28699999999999998 -0.16500000000000001 0.29199999999999998
0.28699999999999998 -0.16500000000000001 0.20799999999999999
0.27100000000000002 -0.16700000000000001 0.29199999999999998
0.27100000000000002 -0.16700000000000001 0.20799999999999999
0.12 0.16500000000000001 0.20799999999999999
0.13500000000000001 0.158 0.20799999999999999
0.14799999999999999 0.14799999999999999 0.20799999999999999
0.158 0.13500000000000001 0.20799999999999999
0.16500000000000001 0.12 0.20799999999999999
0.16700000000000001 0.104 0.20799999999999999
0.16700000000000001 -0.021000000000000001 0.20799999999999999
0.158 -0.051999999999999998 0.20799999999999999
0.16500000000000001 -0.036999999999999998 0.20799999999999999
0.14799999999999999 -0.065000000000000002 0.20799999999999999
0.13500000000000001 -0.074999999999999997 0.20799999999999999
0.12 -0.081000000000000003 0.20799999999999999
0.104 -0.083000000000000004 0.20799999999999999
-0.33100000000000002 -0.036999999999999998 0.20799999999999999
-0.32500000000000001 -0.051999999999999998 0.20799999999999999
-0.315 -0.065000000000000002 0.20799999999999999
-0.30199999999999999 -0.074999999999999997 0.20799999999999999
-0.28699999999999998 -0.081000000000000003 0.20799999999999999
-0.27100000000000002 -0.083000000000000004 0.20799999999999999
-0.33100000000000002 -0.036999999999999998 0.16700000000000001
0.12 0.16500000000000001 0.16700000000000001
-0.32500000000000001 -0.051999999999999998 0.16700000000000001
-0.315 -0.065000000000000002 0.16700000000000001
-0.30199999999999999 -0.074999999999999997 0.16700000000000001
-0.28699999999999998 -0.081000000000000003 0.16700000000000001
0.13500000000000001 0.158 0.16700000000000001
0.14799999999999999 0.14799999999999999 0.16700000000000001
0.158 0.13500000000000001 0.16700000000000001
0.16500000000000001 0.12 0.16700000000000001
0.16700000000000001 0.104 0.16700000000000001
0.16700000000000001 -0.021000000000000001 0.16700000000000001
0.16500000000000001 -0.036999999999999998 0.16700000000000001
0.158 -0.051999999999999998 0.16700000000000001
0.14799999999999999 -0.065000000000000002 0.16700000000000001
0.13500000000000001 -0.074999999999999997 0.16700000000000001
0.12 -0.081000000000000003 0.16700000000000001
0.104 -0.083000000000000004 0.16700000000000001
-0.27100000000000002 -0.083000000000000004 0.16700000000000001
-0.46630000000000001 -0.2837 0.06075
-0.46630000000000001 0.2837 0.06075
0.46630000000000001 0.2837 0.06075
0.46630000000000001 -0.2837 0.06075
-0.46630000000000001 -0.2837 0.39824999999999996
-0.46630000000000001 0.2837 0.39824999999999996
0.46630000000000001 0.2837 0.39824999999999996
0.46630000000000001 -0.2837 0.39824999999999996
3 0 1 2
3 3 4 5
3 6 3 5
3 7 3 6
3 8 7 6
3 9 7 8
3 10 9 8
3 11 9 10
3 12 11 10
3 13 11 12
3 14 13 15
3 16 14 15
3 14 16 1
3 17 14 1
3 0 17 1
3 18 17 0
3 19 18 0
3 20 18 19
3 21 20 19
3 22 23 21
3 24 23 22
3 25 24 22
3 23 20 21
3 26 27 25
3 28 27 26
3 29 30 31
3 28 30 29
3 32 28 29
3 33 32 29
3 34 32 33
3 35 34 33
3 36 34 35
3 37 36 35
3 38 36 37
3 15 13 12
3 39 38 37
3 40 38 39
3 41 40 39
3 42 40 41
3 43 42 41
3 44 42 43
3 45 44 43
3 46 47 45
3 48 49 46
3 50 51 48
3 52 51 50
3 53 52 50
3 54 52 53
3 51 49 48
3 55 54 53
3 56 54 55
3 57 56 55
3 58 56 57
3 59 58 57
3 4 58 59
3 5 4 59
3 59 57 55
3 53 59 55
3 53 50 59
3 48 59 50
3 30 28 26
3 48 46 59
3 37 35 33
3 43 41 33
3 60 33 29
3 60 61 33
3 33 61 62
3 63 33 62
3 63 64 33
3 33 64 65
3 43 33 65
3 43 65 45
3 65 66 45
3 45 66 46
3 27 24 25
3 67 46 68
3 67 69 46
3 46 69 59
3 69 70 59
3 59 70 71
3 72 59 71
3 1 16 73
3 16 74 73
3 47 44 45
3 75 74 16
3 75 16 76
3 16 77 76
3 16 15 77
3 15 78 77
3 12 78 15
3 10 78 12
3 6 78 8
3 5 78 6
3 72 5 59
3 1 73 79
3 2 1 79
3 80 60 31
3 60 29 31
3 79 73 81
3 73 74 81
3 81 74 82
3 74 75 82
3 82 75 83
3 75 76 83
3 83 76 84
3 76 77 84
3 49 47 46
3 61 60 80
3 85 61 80
3 62 61 85
3 86 62 85
3 63 62 86
3 87 63 86
3 64 63 87
3 88 64 87
3 65 64 88
3 89 65 88
3 66 65 89
3 90 66 89
3 68 66 90
3 91 68 90
3 67 68 91
3 92 67 91
3 69 67 92
3 93 69 92
3 70 69 93
3 46 66 68
3 94 70 93
3 71 70 94
3 95 71 94
3 72 71 95
3 96 72 95
3 97 72 96
3 78 72 97
3 77 78 97
3 84 77 97
3 95 94 96
3 96 94 93
3 92 96 93
3 92 91 96
3 96 91 90
3 33 41 39
3 85 80 86
3 80 87 86
3 88 87 80
3 88 80 89
3 80 90 89
3 96 90 80
3 96 80 97
3 31 30 80
3 83 84 97
3 83 97 82
3 97 81 82
3 37 33 39
3 79 81 97
3 2 79 0
3 97 0 79
3 26 25 30
3 8 78 10
3 30 25 22
3 21 30 22
3 21 19 30
3 72 78 5
3 30 19 0
3 97 30 0
3 80 30 97
3 9 11 13
3 9 13 14
3 7 9 14
3 18 20 23
3 17 18 23
3 17 23 24
3 24 27 28
3 17 24 28
3 32 34 36
3 38 40 42
3 38 42 44
3 36 38 44
3 32 36 44
3 32 44 47
3 49 51 52
3 47 49 52
3 47 52 54
3 54 56 58
3 47 54 58
3 32 47 58
3 28 32 58
3 28 58 4
3 17 28 4
3 14 17 4
3 7 14 4
3 4 3 7
3 98 99 101
3 101 99 100
3 98 102 99
3 99 102 103
3 101 100 105
3 105 100 104
3 102 98 101
3 105 102 101
3 104 102 105
3 104 103 102
3 99 103 104
3 100 99 104

View File

@ -0,0 +1 @@
data/thepart-simplified.off

View File

@ -0,0 +1,93 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h>
#include <CGAL/Polyhedral_mesh_domain_with_features_3.h>
#include <CGAL/make_mesh_3.h>
// Domain
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Polyhedral_mesh_domain_with_features_3<K> Mesh_domain;
#ifdef CGAL_CONCURRENT_MESH_3
typedef CGAL::Parallel_tag Concurrency_tag;
#else
typedef CGAL::Sequential_tag Concurrency_tag;
#endif
// Triangulation
typedef CGAL::Mesh_triangulation_3<Mesh_domain,CGAL::Default,Concurrency_tag>::type Tr;
typedef CGAL::Mesh_complex_3_in_triangulation_3<
Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_segment_index> C3t3;
typedef Tr::Geom_traits Gt;
// Criteria
typedef CGAL::Mesh_criteria_3<Tr> Mesh_criteria;
// To avoid verbose function and named parameters call
using namespace CGAL::parameters;
Gt::Construct_weighted_circumcenter_3 w_circumcenter = Gt().construct_weighted_circumcenter_3_object();
K::Point_3 wc_circumcenter(Tr::Cell_handle ch, bool force_exact = false) {
return w_circumcenter(ch->vertex(0)->point(),
ch->vertex(1)->point(),
ch->vertex(2)->point(),
ch->vertex(3)->point(), force_exact
);
}
int main(int argc, char*argv[])
{
const char* fname = (argc>1)?argv[1]:"data/fandisk.off";
// Create domain
Mesh_domain domain(fname);
// Get sharp features
domain.detect_features();
// Mesh criteria
Mesh_criteria criteria(edge_size = 0.037,
facet_angle = 25,
facet_size = 0.037,
facet_distance = 0.0037,
cell_radius_edge_ratio = 3);
// Mesh generation
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria, no_perturb(), no_exude());
int return_code = 0;
for(C3t3::Cells_in_complex_iterator cit = c3t3.cells_in_complex_begin();
cit != c3t3.cells_in_complex_end();
++cit)
{
for(int i = 0; i < 4; ++i) {
typedef Tr::Facet Facet;
typedef Tr::Cell_handle Cell_handle;
Cell_handle ch = cit;
Cell_handle nch = ch->neighbor(i);
if(c3t3.is_in_complex(nch)) continue;
if(!c3t3.is_in_complex(Facet(ch, i))) {
return_code = 1;
std::cout << "ERROR with facet: 3 \n";
K::Point_3 p[3];
for(int j = 0; j < 3; ++j) {
p[j] = ch->vertex(c3t3.triangulation().vertex_triple_index(i, j))->point().point();
std::cout << " " << p[j] << "\n";
}
int n_i = nch->index(ch);
K::Point_3 a = ch->vertex(i)->point().point();
K::Point_3 b = nch->vertex(n_i)->point().point();
std::cout << a << "\n";
std::cout << b << "\n";
std::cout << " " << wc_circumcenter(ch, true) << std::endl;
std::cout << " " << wc_circumcenter(nch, true) << std::endl;
}
}
}
std::cout << c3t3.triangulation().number_of_vertices() << std::endl;
// Output
return return_code;
}