Split_3 + do_overlap

This commit is contained in:
Pedro Machado Manhaes de Castro 2006-08-12 16:27:02 +00:00
parent 62dd84a760
commit 78dfdfdc5b
1 changed files with 39 additions and 59 deletions

View File

@ -15,6 +15,8 @@
#ifndef CGAL_SPHERICAL_KERNEL_PREDICATES_ON_CIRCULAR_ARC_3_H
#define CGAL_SPHERICAL_KERNEL_PREDICATES_ON_CIRCULAR_ARC_3_H
#include <CGAL/Circular_kernel_3/internal_function_has_on_spherical_kernel.h>
namespace CGAL {
namespace SphericalFunctors {
@ -26,68 +28,46 @@ namespace CGAL {
return c1.rep() == c2.rep();
}
template< class SK>
template <class SK>
inline
Sign
compute_sign_of_cross_product(const typename SK::Root_of_2 &x1,
const typename SK::Root_of_2 &y1,
const typename SK::Root_of_2 &z1,
const typename SK::Root_of_2 &x2,
const typename SK::Root_of_2 &y2,
const typename SK::Root_of_2 &z2) {
typedef typename SK::Root_of_2 Root_of_2;
const Root_of_2 cx = y1 * z2 - z1 * y2;
const Root_of_2 cy = z1 * x2 - x1 * z2;
const Root_of_2 cz = x1 * y2 - y1 * x2;
if(!is_zero(cx)) return sign(cx);
if(!is_zero(cy)) return sign(cy);
return sign(cz);
bool
do_overlap(const typename SK::Circular_arc_3 &c1,
const typename SK::Circular_arc_3 &c2,
const bool known_equal_supporting_circle = false)
{
if(!known_equal_supporting_circle) {
if(!non_oriented_equal<SK>(c1.supporting_circle(),
c2.supporting_circle()))
return false;
}
if(c1.rep().is_full()) return true;
if(c2.rep().is_full()) return true;
if((SK().has_on_3_object()(c1,c2.target(),true)) ||
(SK().has_on_3_object()(c1,c2.source(),true))) return true;
return SK().has_on_3_object()(c2,c1.source(),true);
}
template< class SK>
inline
Sign
compute_sign_of_cross_product(const typename SK::FT &x1,
const typename SK::FT &y1,
const typename SK::FT &z1,
const typename SK::FT &x2,
const typename SK::FT &y2,
const typename SK::FT &z2) {
typedef typename SK::FT FT;
const FT cx = y1 * z2 - z1 * y2;
const FT cy = z1 * x2 - x1 * z2;
const FT cz = x1 * y2 - y1 * x2;
if(!is_zero(cx)) return sign(cx);
if(!is_zero(cy)) return sign(cy);
return sign(cz);
}
template< class SK>
inline
Sign
compute_sign_of_cross_product(const typename SK::Circular_arc_point_3 &p1,
const typename SK::Circular_arc_point_3 &p2,
const typename SK::Point_3 &c) {
return compute_sign_of_cross_product<SK>(p1.x()-c.x(),
p1.y()-c.y(),
p1.z()-c.z(),
p2.x()-c.x(),
p2.y()-c.y(),
p2.z()-c.z());
}
template< class SK>
inline
Sign
compute_sign_of_cross_product(const typename SK::Point_3 &p1,
const typename SK::Point_3 &p2,
const typename SK::Point_3 &c) {
return compute_sign_of_cross_product<SK>(p1.x()-c.x(),
p1.y()-c.y(),
p1.z()-c.z(),
p2.x()-c.x(),
p2.y()-c.y(),
p2.z()-c.z());
template < class SK >
void
split(const typename SK::Circular_arc_3 &c,
const typename SK::Circular_arc_point_3 &p,
typename SK::Circular_arc_3 &c1,
typename SK::Circular_arc_3 &c2)
{
// The point must be on the circular arc
CGAL_kernel_precondition(SK().has_on_3_object()(c, p));
typedef typename SK::Circular_arc_3 Circular_arc_3;
// It doesn't make sense to split an arc on an extremity
CGAL_kernel_precondition(c.source() != p);
CGAL_kernel_precondition(c.target() != p);
const Circular_arc_3 &rc1 =
Circular_arc_3(c.supporting_circle(), c.source(), p);
const Circular_arc_3 &rc2 =
Circular_arc_3(c.supporting_circle(), p, c.target());
if ( SK().compare_xyz_3_object()(rc1.source(), rc2.source()) !=
SMALLER) {
c1 = rc2; c2 = rc1;
} else { c1 = rc1; c2 = rc2; }
}
}//SphericalFunctors