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)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue