From bbf26e22ec9805ea337be093bf5b9816463bf44a Mon Sep 17 00:00:00 2001 From: Michael Hemmer Date: Wed, 3 Jun 2020 16:58:49 +0200 Subject: [PATCH] Adding specific code for Tet + Bbox_3 do_intersect as it should be ok for Bbox_3 to degenerate. Adding specific code for Tet + Bbox_3 do_intersect as it should be ok for Bbox_3 to degenerate. The previous code failed in case Bbox_3 is degenerate. I use the result = result || predicate(); to keep the maybe inside result. If certain the code returns early. I also avoid the %4 as this is a slow operation, but not sure that this is worth compared to the rest. --- .../Tetrahedron_3_Bounded_3_do_intersect.h | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) 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 4a10c6b23de..965d1fe72d8 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 @@ -161,23 +161,30 @@ do_intersect(const typename K::Tetrahedron_3 &tet, } template -inline -typename K::Boolean -do_intersect(const typename K::Tetrahedron_3 &tet, - const CGAL::Bbox_3 &bb, - const K & k) -{ - return do_intersect_tetrahedron_bounded(bb, tet, typename K::Point_3(bb.xmin(), bb.ymin(), bb.zmin()), k); +inline typename K::Boolean do_intersect(const typename K::Tetrahedron_3 &tet, + const CGAL::Bbox_3 &bb, const K &k) { + // Swap arguments. + return do_intersect(bb, tet, k); } - template -inline -typename K::Boolean -do_intersect(const CGAL::Bbox_3 &bb, - const typename K::Tetrahedron_3 &tet, - const K & k) -{ - return do_intersect_tetrahedron_bounded(bb, tet, typename K::Point_3(bb.xmin(), bb.ymin(), bb.zmin()), k); +// BBox_3 sphecific code since it's ok for BBox_3 to degenerate. +template +inline typename K::Boolean do_intersect(const CGAL::Bbox_3 &aabb, + const typename K::Tetrahedron_3 &tet, + const K &k) { + using Tr = CGAL::Triangle_3; + typename K::Boolean result = do_intersect(aabb, Tr(tet[0], tet[1], tet[2]), k); + if (certainly(result)) return result; + result = result || do_intersect(aabb, Tr(tet[1], tet[2], tet[3]), k); + if (certainly(result)) return result; + result = result || do_intersect(aabb, Tr(tet[2], tet[3], tet[0]), k); + if (certainly(result)) return result; + result = result || do_intersect(aabb, Tr(tet[3], tet[0], tet[1]), k); + if (certainly(result)) return result; + result = result || + k.has_on_bounded_side_3_object()( + tet, typename K::Point_3(aabb.xmin(), aabb.ymin(), aabb.zmin())); + return result; } } // namespace internal