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.
This commit is contained in:
Laurent Rineau 2019-02-11 13:25:49 +01:00
parent d216131c79
commit 9c426075b6
2 changed files with 57 additions and 33 deletions

View File

@ -55,17 +55,26 @@ do_intersect_tetrahedron_bounded(const Bounded &tr,
const K & k) const K & k)
{ {
typedef typename K::Triangle_3 Triangle; 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() (tr) );
CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tet) ); CGAL_kernel_precondition( ! k.is_degenerate_3_object() (tet) );
typedef typename K::Triangle_3 Triangle; Boolean result = false;
if (do_intersect(tr, Triangle(tet[0], tet[1], tet[2]), k)) return true; for (int i = 0; i < 4; ++i)
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; const Boolean b = do_intersect(tr,
if (do_intersect(tr, Triangle(tet[1], tet[2], tet[3]), k)) return true; Triangle(tet[i],
tet[(i+1)%4],
return k.has_on_bounded_side_3_object()(tet, p); 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;
} }

View File

@ -33,60 +33,75 @@ namespace Intersections {
namespace internal { namespace internal {
template<typename K, class Unbounded> template<typename K, class Unbounded>
bool do_intersect_tetrahedron_unbounded(const typename K::Tetrahedron_3& tet, typename K::Boolean
const Unbounded& unb, do_intersect_tetrahedron_unbounded(const typename K::Tetrahedron_3& tet,
const K& k) { const Unbounded& unb,
const K& k) {
typedef typename K::Triangle_3 Triangle; typedef typename K::Triangle_3 Triangle;
if (do_intersect(unb,Triangle(tet[0], tet[1], tet[2]), k)) return true; typedef typename K::Boolean Boolean;
if (do_intersect(unb, Triangle(tet[0], tet[1], tet[3]), k)) return true; Boolean result = false;
if (do_intersect(unb, Triangle(tet[0], tet[2], tet[3]), k)) return true; for (int i = 0; i < 4; ++i)
if (do_intersect(unb, Triangle(tet[1], tet[2], tet[3]), k)) return true; {
return false; 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<typename K> template<typename K>
bool do_intersect(const typename K::Plane_3& unb, typename K::Boolean
const typename K::Tetrahedron_3& tet, do_intersect(const typename K::Plane_3& unb,
const K& k) { const typename K::Tetrahedron_3& tet,
const K& k) {
return do_intersect_tetrahedron_unbounded(tet, unb, k); return do_intersect_tetrahedron_unbounded(tet, unb, k);
} }
template<typename K> template<typename K>
bool do_intersect(const typename K::Tetrahedron_3& tet, typename K::Boolean
const typename K::Plane_3& unb, do_intersect(const typename K::Tetrahedron_3& tet,
const K& k) { const typename K::Plane_3& unb,
const K& k) {
return do_intersect_tetrahedron_unbounded(tet, unb, k); return do_intersect_tetrahedron_unbounded(tet, unb, k);
} }
template<typename K> template<typename K>
bool do_intersect(const typename K::Line_3& unb, typename K::Boolean
const typename K::Tetrahedron_3& tet, do_intersect(const typename K::Line_3& unb,
const K& k) { const typename K::Tetrahedron_3& tet,
const K& k) {
return do_intersect_tetrahedron_unbounded(tet, unb, k); return do_intersect_tetrahedron_unbounded(tet, unb, k);
} }
template<typename K> template<typename K>
bool do_intersect(const typename K::Tetrahedron_3& tet, typename K::Boolean
const typename K::Line_3& unb, do_intersect(const typename K::Tetrahedron_3& tet,
const K& k) { const typename K::Line_3& unb,
const K& k) {
return do_intersect_tetrahedron_unbounded(tet, unb, k); return do_intersect_tetrahedron_unbounded(tet, unb, k);
} }
template<typename K> template<typename K>
bool do_intersect(const typename K::Ray_3& unb, typename K::Boolean
const typename K::Tetrahedron_3& tet, do_intersect(const typename K::Ray_3& unb,
const K& k) { const typename K::Tetrahedron_3& tet,
const K& k) {
return do_intersect_tetrahedron_unbounded(tet, unb, k); return do_intersect_tetrahedron_unbounded(tet, unb, k);
} }
template<typename K> template<typename K>
bool do_intersect(const typename K::Tetrahedron_3& tet, typename K::Boolean
const typename K::Ray_3& unb, do_intersect(const typename K::Tetrahedron_3& tet,
const K& k) { const typename K::Ray_3& unb,
const K& k) {
return do_intersect_tetrahedron_unbounded(tet, unb, k); return do_intersect_tetrahedron_unbounded(tet, unb, k);
} }