From 9c426075b6c7c2d69725a7496c5d3ab0b8aa948d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 11 Feb 2019 13:25:49 +0100 Subject: [PATCH] Optimized version of do_intersect with Tetrahedron_3 and something The optimization is to delay the switch to the exact number type as much as possible. I was not able to find a good benchmark showing the improvement, though. Maybe because the `do_intersect(Bbox_3, Triangle_3)` is not optimized the same way. --- .../Tetrahedron_3_Bounded_3_do_intersect.h | 23 +++++-- .../Tetrahedron_3_Unbounded_3_do_intersect.h | 67 ++++++++++++------- 2 files changed, 57 insertions(+), 33 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 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); }