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)
{
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;
}

View File

@ -33,28 +33,39 @@ namespace Intersections {
namespace internal {
template<typename K, class Unbounded>
bool do_intersect_tetrahedron_unbounded(const typename K::Tetrahedron_3& tet,
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<typename K>
bool do_intersect(const typename K::Plane_3& unb,
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<typename K>
bool do_intersect(const typename K::Tetrahedron_3& tet,
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);
@ -62,14 +73,16 @@ bool do_intersect(const typename K::Tetrahedron_3& tet,
template<typename K>
bool do_intersect(const typename K::Line_3& unb,
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<typename K>
bool do_intersect(const typename K::Tetrahedron_3& tet,
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);
@ -77,14 +90,16 @@ bool do_intersect(const typename K::Tetrahedron_3& tet,
template<typename K>
bool do_intersect(const typename K::Ray_3& unb,
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<typename K>
bool do_intersect(const typename K::Tetrahedron_3& tet,
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);