diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h index 8470ccd03c6..ba7b0d1ebc1 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Bounded_3_do_intersect.h @@ -55,17 +55,26 @@ do_intersect_tetrahedron_bounded(const Bounded &tr, const K & k) { typedef typename K::Triangle_3 Triangle; + typedef typename K::Boolean Boolean; CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tr) ); CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tet) ); - typedef typename K::Triangle_3 Triangle; - if (do_intersect(tr, Triangle(tet[0], tet[1], tet[2]), k)) return true; - if (do_intersect(tr, Triangle(tet[0], tet[1], tet[3]), k)) return true; - if (do_intersect(tr, Triangle(tet[0], tet[2], tet[3]), k)) return true; - if (do_intersect(tr, Triangle(tet[1], tet[2], tet[3]), k)) return true; - - return k.has_on_bounded_side_3_object()(tet, p); + Boolean result = false; + for (int i = 0; i < 4; ++i) + { + const Boolean b = do_intersect(tr, + Triangle(tet[i], + tet[(i+1)%4], + tet[(i+2)%4]), + k); + if(certainly(b)) return b; + if(is_indeterminate(b)) result = b; + } + const Boolean b = k.has_on_bounded_side_3_object()(tet, p); + if(certainly(b)) return b; + if(is_indeterminate(b)) result = b; + return result; } diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h index 65c9d38c3be..2b46f8a7725 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Unbounded_3_do_intersect.h @@ -33,60 +33,75 @@ namespace Intersections { namespace internal { template -bool do_intersect_tetrahedron_unbounded(const typename K::Tetrahedron_3& tet, - const Unbounded& unb, - const K& k) { +typename K::Boolean +do_intersect_tetrahedron_unbounded(const typename K::Tetrahedron_3& tet, + const Unbounded& unb, + const K& k) { typedef typename K::Triangle_3 Triangle; - if (do_intersect(unb,Triangle(tet[0], tet[1], tet[2]), k)) return true; - if (do_intersect(unb, Triangle(tet[0], tet[1], tet[3]), k)) return true; - if (do_intersect(unb, Triangle(tet[0], tet[2], tet[3]), k)) return true; - if (do_intersect(unb, Triangle(tet[1], tet[2], tet[3]), k)) return true; - return false; + typedef typename K::Boolean Boolean; + Boolean result = false; + for (int i = 0; i < 4; ++i) + { + const Boolean b = do_intersect(unb, + Triangle(tet[i], + tet[(i+1)%4], + tet[(i+2)%4]), + k); + if(certainly(b)) return b; + if(is_indeterminate(b)) result = b; + } + return result; } template -bool do_intersect(const typename K::Plane_3& unb, - const typename K::Tetrahedron_3& tet, - const K& k) { +typename K::Boolean +do_intersect(const typename K::Plane_3& unb, + const typename K::Tetrahedron_3& tet, + const K& k) { return do_intersect_tetrahedron_unbounded(tet, unb, k); } template -bool do_intersect(const typename K::Tetrahedron_3& tet, - const typename K::Plane_3& unb, - const K& k) { +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3& tet, + const typename K::Plane_3& unb, + const K& k) { return do_intersect_tetrahedron_unbounded(tet, unb, k); } template -bool do_intersect(const typename K::Line_3& unb, - const typename K::Tetrahedron_3& tet, - const K& k) { +typename K::Boolean +do_intersect(const typename K::Line_3& unb, + const typename K::Tetrahedron_3& tet, + const K& k) { return do_intersect_tetrahedron_unbounded(tet, unb, k); } template -bool do_intersect(const typename K::Tetrahedron_3& tet, - const typename K::Line_3& unb, - const K& k) { +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3& tet, + const typename K::Line_3& unb, + const K& k) { return do_intersect_tetrahedron_unbounded(tet, unb, k); } template -bool do_intersect(const typename K::Ray_3& unb, - const typename K::Tetrahedron_3& tet, - const K& k) { +typename K::Boolean +do_intersect(const typename K::Ray_3& unb, + const typename K::Tetrahedron_3& tet, + const K& k) { return do_intersect_tetrahedron_unbounded(tet, unb, k); } template -bool do_intersect(const typename K::Tetrahedron_3& tet, - const typename K::Ray_3& unb, - const K& k) { +typename K::Boolean +do_intersect(const typename K::Tetrahedron_3& tet, + const typename K::Ray_3& unb, + const K& k) { return do_intersect_tetrahedron_unbounded(tet, unb, k); }