mirror of https://github.com/CGAL/cgal
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:
parent
d216131c79
commit
9c426075b6
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue